diff --git a/.ai/mcp/mcp.json b/.ai/mcp/mcp.json
new file mode 100644
index 0000000..e69de29
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
new file mode 100644
index 0000000..7d9e667
--- /dev/null
+++ b/.config/dotnet-tools.json
@@ -0,0 +1,18 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "dotnet-format": {
+ "version": "5.1.250801",
+ "commands": [
+ "dotnet-format"
+ ]
+ },
+ "jetbrains.resharper.globaltools": {
+ "version": "2026.1.4",
+ "commands": [
+ "jb"
+ ]
+ }
+ }
+}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..dbc811a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,120 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 4
+tab_width = 4
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[Assets/Packages/**]
+generated_code = true
+
+[Assets/Plugins/**]
+generated_code = true
+
+[Assets/TextMesh Pro/**]
+generated_code = true
+
+[Assets/TextMesh*/**]
+generated_code = true
+
+[Assets/ThirdParty/**]
+generated_code = true
+
+[Assets/**/*.asset]
+generated_code = true
+
+[Assets/**/*.cginc]
+generated_code = true
+
+[Assets/**/*.hlsl]
+generated_code = true
+
+[Assets/**/*.json]
+generated_code = true
+
+[Assets/**/*.mat]
+generated_code = true
+
+[Assets/**/*.meta]
+generated_code = true
+
+[Assets/**/*.shader]
+generated_code = true
+
+[Assets/**/*.shadergraph]
+generated_code = true
+
+[Assets/**/*.txt]
+generated_code = true
+
+[Assets/**/*.xml]
+generated_code = true
+
+[Library/**]
+generated_code = true
+
+[Logs/**]
+generated_code = true
+
+[Packages/**]
+generated_code = true
+
+[ProjectSettings/**]
+generated_code = true
+
+[Temp/**]
+generated_code = true
+
+[UserSettings/**]
+generated_code = true
+
+# ReSharper properties
+resharper_keep_existing_embedded_arrangement = false
+
+# noinspection EditorConfigKeyCorrectness
+[*.cs]
+
+# Стандартные настройки C#
+csharp_new_line_before_open_brace = all
+
+csharp_style_var_for_built_in_types = true:suggestion
+csharp_style_var_when_type_is_apparent = true:suggestion
+csharp_style_var_elsewhere = true:suggestion
+
+# Comment section
+dotnet_diagnostic.SA1629.severity = none
+
+# wrap over chop, long arguments
+resharper_csharp_wrap_arguments_style = wrap_if_long
+resharper_csharp_max_invocation_arguments_on_line = 10
+resharper_csharp_keep_user_linebreaks = false
+dotnet_diagnostic.SA1116.severity = none
+
+# using block
+dotnet_diagnostic.SA1200.severity = none # move usings inside namespace
+dotnet_diagnostic.SA1633.severity = none # obligatory file header
+dotnet_diagnostic.SA1300.severity = none # _Project. namespace to be changed
+
+# Documentation on Enum, Enum elements
+dotnet_diagnostic.SA1600.severity = none
+dotnet_diagnostic.SA1602.severity = none
+resharper_csharp_place_simple_enum_on_single_line = false
+resharper_csharp_keep_existing_enum_arrangement = false
+resharper_csharp_max_enum_members_on_line = 1
+
+# fields, properties, methods
+dotnet_diagnostic.SA1309.severity = none
+dotnet_diagnostic.SA1128.severity = none # allow public ClassName : this() without new line after :
+dotnet_diagnostic.SA1101.severity = none # disable obligatory this.fieldName
+dotnet_diagnostic.SA1401.severity = error # fields always private
+dotnet_diagnostic.SA1503.severity = none # allow no braces
+dotnet_diagnostic.SA1134.severity = none # allow [attributes] private OneLineWithField
+dotnet_diagnostic.SA1127.severity = none # generic type constrains must be on the new line
+dotnet_diagnostic.SA1611.severity = none # all ctor args must be documented
+dotnet_diagnostic.SA1117.severity = none # allow arguments to be wrapped, not chopped
+dotnet_diagnostic.SA1130.severity = none # allow = delegate {}; syntax, not only lambda
+
diff --git a/.gitattributes b/.gitattributes
index fd82082..87e623f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,3 +3,21 @@
*.png filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
+*.sh text eol=lf
+
+
+* text=auto
+
+*.cs text eol=lf
+*.asmdef text eol=lf
+*.asmref text eol=lf
+*.json text eol=lf
+*.yml text eol=lf
+*.yaml text eol=lf
+*.sh text eol=lf
+
+*.bat text eol=crlf
+*.cmd text eol=crlf
+*.ps1 text eol=crlf
+
+/Assets/Packages/** -text
diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml
new file mode 100644
index 0000000..016b734
--- /dev/null
+++ b/.github/workflows/build-desktop.yml
@@ -0,0 +1,40 @@
+name: Build project
+
+on:
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ build-desktop:
+ name: Build for ${{ matrix.targetPlatform }}
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ targetPlatform:
+ - StandaloneOSX # Build a macOS standalone (Intel 64-bit).
+ - StandaloneWindows # Build a Windows standalone.
+ - StandaloneWindows64 # Build a Windows 64-bit standalone.
+ - StandaloneLinux64 # Build a Linux 64-bit standalone.
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ lfs: true
+ - uses: actions/cache@v3
+ with:
+ path: Library
+ key: Library-${{ matrix.targetPlatform }}
+ restore-keys: Library-
+ - uses: game-ci/unity-builder@v4
+ env:
+ UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
+ UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }}
+ UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }}
+ with:
+ targetPlatform: ${{ matrix.targetPlatform }}
+ - uses: actions/upload-artifact@v4
+ with:
+ name: Build-${{ matrix.targetPlatform }}
+ path: build/${{ matrix.targetPlatform }}
diff --git a/.github/workflows/code-format.yml b/.github/workflows/code-format.yml
new file mode 100644
index 0000000..c28fbb0
--- /dev/null
+++ b/.github/workflows/code-format.yml
@@ -0,0 +1,70 @@
+name: Code format
+
+on:
+ pull_request:
+ branches:
+ - main
+ push:
+ branches:
+ - main
+
+permissions:
+ contents: read
+
+jobs:
+ format-check:
+ name: Rider formatting check
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: "10.0.x"
+
+ - name: Restore JetBrains tools
+ run: dotnet tool restore
+
+ - name: Run Rider formatter
+ shell: bash
+ run: |
+ format_root="$(mktemp -d)"
+
+ mkdir -p "$format_root/Assets/_Project"
+ cp -a Assets/_Project/Scripts "$format_root/Assets/_Project/Scripts"
+ cp .editorconfig "$format_root/.editorconfig"
+ cp UnityTemplateURP.sln.DotSettings "$format_root/Rider.DotSettings"
+
+ mapfile -d '' cs_files < <(
+ find "$format_root/Assets/_Project/Scripts" \
+ -type f \
+ -name '*.cs' \
+ -print0
+ )
+
+ if [ "${#cs_files[@]}" -eq 0 ]; then
+ echo "No C# files found."
+ exit 1
+ fi
+
+ dotnet tool run jb cleanupcode \
+ "${cs_files[@]}" \
+ --profile="Built-in: Reformat Code" \
+ --settings="$format_root/Rider.DotSettings" \
+ --no-updates
+
+ rsync -a \
+ "$format_root/Assets/_Project/Scripts/" \
+ Assets/_Project/Scripts/
+
+ - name: Check formatting diff
+ shell: bash
+ run: |
+ if ! git diff --exit-code -- Assets/_Project/Scripts; then
+ echo "::error::C# formatting does not match Rider formatting rules."
+ exit 1
+ fi
diff --git a/.gitignore b/.gitignore
index d1d3c22..a9798ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,8 @@
/[Uu]ser[Ss]ettings/
*.log
+.codex
+
# By default unity supports Blender asset imports, *.blend1 blender files do not need to be commited to version control.
*.blend1
*.blend1.meta
@@ -31,12 +33,39 @@
# Jetbrains Rider personal-layer settings
*.DotSettings.user
-# Visual Studio cache directory
+# Rider
+.idea/
.vs/
-.idea
+
+# но разрешаем общие настройки
+!.idea/.idea.UnityTemplateURP/
+!.idea/.idea.UnityTemplateURP/.idea/
+
+!.idea/.idea.UnityTemplateURP/.idea/codeStyles/
+!.idea/.idea.UnityTemplateURP/.idea/codeStyles/**
+
+!.idea/.idea.UnityTemplateURP/.idea/inspectionProfiles/
+!.idea/.idea.UnityTemplateURP/.idea/inspectionProfiles/**
+
+!.idea/.idea.UnityTemplateURP/.idea/vcs.xml
+
+# обязательно игнорируем
+.idea/**/workspace.xml
+.idea/**/indexLayout.xml
+.idea/**/Project_Default.xml
+.idea/**/mcp.json
+.idea/**/shelf/
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/contentModel.xml
+.idea/**/dictionaries/
+.idea/**/httpRequests/
+.idea/**/caches/
+.idea/**/localHistory/
# Gradle cache directory
.gradle/
+.dotnet-tools/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
@@ -44,6 +73,7 @@ ExportedObj/
*.csproj
*.unityproj
*.sln
+*.slnx
*.suo
*.tmp
*.user
@@ -97,4 +127,19 @@ InitTestScene*.unity*
/[Aa]ssets/Unity.VisualScripting.Generated/VisualScripting.Core/Property Providers.meta
# Auto-generated scenes by play mode tests
-/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity*
\ No newline at end of file
+/[Aa]ssets/[Ii]nit[Tt]est[Ss]cene*.unity*
+
+# NuGet Importer / NuGetForUnity
+/[Aa]ssets/[Pp]ackages/
+/[Aa]ssets/[Pp]ackages.meta
+/[Pp]ackages/*
+!/[Pp]ackages/manifest.json
+!/[Pp]ackages/packages-lock.json
+
+!.idea/
+!.idea/.idea.UnityTemplateURP/
+!.idea/.idea.UnityTemplateURP/.idea/
+!.idea/.idea.UnityTemplateURP/.idea/scopes/
+!.idea/.idea.UnityTemplateURP/.idea/scopes/*
+!.idea/.idea.UnityTemplateURP/.idea/codeStyles/
+!.idea/.idea.UnityTemplateURP/.idea/codeStyles/*
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..bc6a8e7
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,15 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/projectSettingsUpdater.xml
+/modules.xml
+/contentModel.xml
+/.idea.UnityTemplateURP.iml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.idea.UnityTemplateURP/.idea/.gitignore b/.idea/.idea.UnityTemplateURP/.idea/.gitignore
new file mode 100644
index 0000000..9b9ade0
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/.gitignore
@@ -0,0 +1,15 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/projectSettingsUpdater.xml
+/contentModel.xml
+/.idea.UnityTemplateURP.iml
+/modules.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..33c4260
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/Project.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
diff --git a/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..79ee123
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.UnityTemplateURP/.idea/encodings.xml b/.idea/.idea.UnityTemplateURP/.idea/encodings.xml
new file mode 100644
index 0000000..df87cf9
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml b/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml
new file mode 100644
index 0000000..7b08163
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml b/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml
new file mode 100644
index 0000000..64af657
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/projectSettingsUpdater.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml b/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml
new file mode 100644
index 0000000..3c531a8
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/scopes/_Project.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/.idea/.idea.UnityTemplateURP/.idea/vcs.xml b/.idea/.idea.UnityTemplateURP/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/.idea.UnityTemplateURP/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..ddb6ff8
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "visualstudiotoolsforunity.vstuc"
+ ]
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..da60e25
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,10 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Attach to Unity",
+ "type": "vstuc",
+ "request": "attach"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..bff3926
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,71 @@
+{
+ "files.exclude": {
+ "**/.DS_Store": true,
+ "**/.git": true,
+ "**/.vs": true,
+ "**/.gitmodules": true,
+ "**/.vsconfig": true,
+ "**/*.booproj": true,
+ "**/*.pidb": true,
+ "**/*.suo": true,
+ "**/*.user": true,
+ "**/*.userprefs": true,
+ "**/*.unityproj": true,
+ "**/*.dll": true,
+ "**/*.exe": true,
+ "**/*.pdf": true,
+ "**/*.mid": true,
+ "**/*.midi": true,
+ "**/*.wav": true,
+ "**/*.gif": true,
+ "**/*.ico": true,
+ "**/*.jpg": true,
+ "**/*.jpeg": true,
+ "**/*.png": true,
+ "**/*.psd": true,
+ "**/*.tga": true,
+ "**/*.tif": true,
+ "**/*.tiff": true,
+ "**/*.3ds": true,
+ "**/*.3DS": true,
+ "**/*.fbx": true,
+ "**/*.FBX": true,
+ "**/*.lxo": true,
+ "**/*.LXO": true,
+ "**/*.ma": true,
+ "**/*.MA": true,
+ "**/*.obj": true,
+ "**/*.OBJ": true,
+ "**/*.asset": true,
+ "**/*.cubemap": true,
+ "**/*.flare": true,
+ "**/*.mat": true,
+ "**/*.meta": true,
+ "**/*.prefab": true,
+ "**/*.unity": true,
+ "build/": true,
+ "Build/": true,
+ "Library/": true,
+ "library/": true,
+ "obj/": true,
+ "Obj/": true,
+ "Logs/": true,
+ "logs/": true,
+ "ProjectSettings/": true,
+ "UserSettings/": true,
+ "temp/": true,
+ "Temp/": true
+ },
+ "files.associations": {
+ "*.asset": "yaml",
+ "*.meta": "yaml",
+ "*.prefab": "yaml",
+ "*.unity": "yaml",
+ },
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.patterns": {
+ "*.sln": "*.csproj",
+ "*.slnx": "*.csproj"
+ },
+ "dotnet.defaultSolution": "UnityTemplateURP.slnx"
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2.meta
new file mode 100644
index 0000000..04742e0
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cc6f78bf74c9d003f91b9e113196d66c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug.meta
new file mode 100644
index 0000000..acb2010
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 486d892043d9b2e57a8b01207cc689fa
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg
new file mode 100644
index 0000000..dbeccdd
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg.meta
new file mode 100644
index 0000000..292440b
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.2.5.2.nupkg.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 643a07b612150b960bf04eeefb8b6728
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg
new file mode 100644
index 0000000..96cf349
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg.meta
new file mode 100644
index 0000000..d54f814
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Facepunch.Steamworks.win32.2.5.2.nupkg.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 42152fc62cc3027899835794882c1fe7
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity.meta
new file mode 100644
index 0000000..3dc0824
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b08269d91d64e64c68f2d9d3e76d3efe
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll
new file mode 100644
index 0000000..0b3d0e9
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll.meta
new file mode 100644
index 0000000..9680148
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: 3b2a2e4504cf62a359e2507f1fda7bbe
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux64: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: OSX
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml
new file mode 100644
index 0000000..fdfeb09
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Posix
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml.meta
new file mode 100644
index 0000000..953cb70
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Posix.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e52a3ae88bc390b60bfa2bf35ed113a4
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll
new file mode 100644
index 0000000..aba7969
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll.meta
new file mode 100644
index 0000000..14dffc9
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.dll.meta
@@ -0,0 +1,81 @@
+fileFormatVersion: 2
+guid: fa7f319d9ccfddbfda10ab15a80e6a39
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 0
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Windows
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml
new file mode 100644
index 0000000..c399c3a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win32
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml.meta
new file mode 100644
index 0000000..e2fd0d6
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win32.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 56374274d9c3ebc8ebbd21042a86df81
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll
new file mode 100644
index 0000000..1d12fe2
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll.meta
new file mode 100644
index 0000000..2caf14b
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.dll.meta
@@ -0,0 +1,95 @@
+fileFormatVersion: 2
+guid: 38f862c7e4e01010bbae817d2c033542
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 0
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Windows
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Windows Store Apps: WindowsStoreApps
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml
new file mode 100644
index 0000000..3b89741
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win64
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml.meta
new file mode 100644
index 0000000..0fbe6b5
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/Facepunch.Steamworks.Win64.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 088f4eba1c0caa116aa3bd04a23f2ebe
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin.meta
new file mode 100644
index 0000000..513640e
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e263e476ece55a026be5239b9d195b54
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32.meta
new file mode 100644
index 0000000..fb198b2
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7002c535c87550954b37fe279ef1d3b9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so
new file mode 100644
index 0000000..e6a4535
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so.meta
new file mode 100644
index 0000000..4924fd9
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux32/libsteam_api.so.meta
@@ -0,0 +1,89 @@
+fileFormatVersion: 2
+guid: 19843d92013c91a54bd66635662f7d02
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 1
+ Exclude Linux: 1
+ Exclude Linux64: 1
+ Exclude LinuxUniversal: 1
+ Exclude OSXUniversal: 1
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64.meta
new file mode 100644
index 0000000..50f22e6
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d21a3f39001f66705973d0760ddb6d8f
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so
new file mode 100644
index 0000000..59831c8
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so.meta
new file mode 100644
index 0000000..528550f
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/linux64/libsteam_api.so.meta
@@ -0,0 +1,89 @@
+fileFormatVersion: 2
+guid: e219226fb109cf6ce86a348cb2ab6358
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux: 1
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXUniversal: 1
+ Exclude Win: 0
+ Exclude Win64: 0
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: Linux
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx.meta
new file mode 100644
index 0000000..a155b5e
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 240ef776ef8d125428371809b946650a
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib
new file mode 100644
index 0000000..a3df927
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib.meta
new file mode 100644
index 0000000..e3f63ff
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/osx/libsteam_api.dylib.meta
@@ -0,0 +1,63 @@
+fileFormatVersion: 2
+guid: 32df3b833e43e1371a24e98e5919ffbf
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ : Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux64: 1
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 0
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: x86_64
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll
new file mode 100644
index 0000000..a05e445
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll.meta
new file mode 100644
index 0000000..02f5644
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.dll.meta
@@ -0,0 +1,89 @@
+fileFormatVersion: 2
+guid: c21320c536fa93edf8578a4c6772cd3c
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux: 0
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 0
+ Exclude Win64: 1
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ DefaultValueInitialized: true
+ OS: Windows
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib
new file mode 100644
index 0000000..b7f71e3
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib.meta
new file mode 100644
index 0000000..3276fe3
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/steam_api.lib.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 075ea1e87610b4d9c8d1eca143e6b083
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64.meta
new file mode 100644
index 0000000..3787799
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 02d3361625846e4afb30eaec01ea7bda
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll
new file mode 100644
index 0000000..0224579
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll.meta
new file mode 100644
index 0000000..77595cc
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.dll.meta
@@ -0,0 +1,89 @@
+fileFormatVersion: 2
+guid: bbc0545d99a677343be2e7df2a8d9ade
+PluginImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ iconMap: {}
+ executionOrder: {}
+ defineConstraints: []
+ isPreloaded: 0
+ isOverridable: 0
+ isExplicitlyReferenced: 0
+ validateReferences: 1
+ platformData:
+ - first:
+ '': Any
+ second:
+ enabled: 0
+ settings:
+ Exclude Editor: 0
+ Exclude Linux: 0
+ Exclude Linux64: 0
+ Exclude LinuxUniversal: 0
+ Exclude OSXUniversal: 0
+ Exclude Win: 1
+ Exclude Win64: 0
+ - first:
+ Any:
+ second:
+ enabled: 1
+ settings: {}
+ - first:
+ Editor: Editor
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ DefaultValueInitialized: true
+ OS: AnyOS
+ - first:
+ Facebook: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Facebook: Win64
+ second:
+ enabled: 0
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Linux
+ second:
+ enabled: 1
+ settings:
+ CPU: x86
+ - first:
+ Standalone: Linux64
+ second:
+ enabled: 1
+ settings:
+ CPU: x86_64
+ - first:
+ Standalone: LinuxUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: OSXUniversal
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ - first:
+ Standalone: Win
+ second:
+ enabled: 0
+ settings:
+ CPU: None
+ - first:
+ Standalone: Win64
+ second:
+ enabled: 1
+ settings:
+ CPU: AnyCPU
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib
new file mode 100644
index 0000000..4ddda84
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib.meta
new file mode 100644
index 0000000..1498391
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/Unity/redistributable_bin/win64/steam_api64.lib.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 87134701d42bfa8ed961ca4e22ea3674
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46.meta
new file mode 100644
index 0000000..9b0455b
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 307c47083ed34360c8a7366ea4106761
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll
new file mode 100644
index 0000000..0b3d0e9
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll.meta
new file mode 100644
index 0000000..cfea9b1
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8509c103d98606797a7da2a69b7f0fcc
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml
new file mode 100644
index 0000000..fdfeb09
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Posix
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml.meta
new file mode 100644
index 0000000..602802e
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Posix.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: d3477d23deeec3aea89b555466d26629
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll
new file mode 100644
index 0000000..aba7969
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll.meta
new file mode 100644
index 0000000..042908a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: b85d99b139b1fd61ba96eaef586600d5
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml
new file mode 100644
index 0000000..c399c3a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win32
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml.meta
new file mode 100644
index 0000000..9a4e363
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win32.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c1b6acb367c7ae73184dda0e66e60ba3
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll
new file mode 100644
index 0000000..1d12fe2
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll.meta
new file mode 100644
index 0000000..ab8c779
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 7a07a42545fb7263d8a66a8b120ecd10
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml
new file mode 100644
index 0000000..3b89741
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win64
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml.meta
new file mode 100644
index 0000000..7b93769
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/Facepunch.Steamworks.Win64.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ffb9c35f1a92bfbdd950e8194e0e1d4e
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll
new file mode 100644
index 0000000..a05e445
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll.meta
new file mode 100644
index 0000000..7fc5d0b
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 2ec7325f6c5f797f480a0d61a34bd6d7
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll
new file mode 100644
index 0000000..0224579
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll.meta
new file mode 100644
index 0000000..090b94e
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net46/steam_api64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 9131743927df63bd090b37840011fa85
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0.meta
new file mode 100644
index 0000000..21ceb1f
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7de1bd3f3b0ba6f9eb26e4a466d594a6
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json
new file mode 100644
index 0000000..c365fd2
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v6.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v6.0": {
+ "Facepunch.Steamworks.Posix/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Posix.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Posix/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json.meta
new file mode 100644
index 0000000..11bb951
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: e5bdf414ce41a6b8da8cc02b7611e829
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll
new file mode 100644
index 0000000..6ff8d2e
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll.meta
new file mode 100644
index 0000000..ddd7122
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 34db42daf71123674b2fba2af2acc404
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml
new file mode 100644
index 0000000..fdfeb09
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Posix
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml.meta
new file mode 100644
index 0000000..e0c6113
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Posix.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 8cbc07869c9c6a9e39c7c1eac1899c21
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json
new file mode 100644
index 0000000..a5dbcd1
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v6.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v6.0": {
+ "Facepunch.Steamworks.Win32/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Win32.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Win32/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json.meta
new file mode 100644
index 0000000..8d25c80
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 60f390cffc94e332f975d8e6aab2ad03
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll
new file mode 100644
index 0000000..539198e
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll.meta
new file mode 100644
index 0000000..c4e56eb
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 8b3de9585f28f3452821e005214e861b
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml
new file mode 100644
index 0000000..c399c3a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win32
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml.meta
new file mode 100644
index 0000000..8cc5be0
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win32.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: cf30799be74f2641e9d177d5b5fc2731
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json
new file mode 100644
index 0000000..a1d4953
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json
@@ -0,0 +1,23 @@
+{
+ "runtimeTarget": {
+ "name": ".NETCoreApp,Version=v6.0",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETCoreApp,Version=v6.0": {
+ "Facepunch.Steamworks.Win64/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Win64.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Win64/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json.meta
new file mode 100644
index 0000000..bb4728c
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: a26abf21f0169311b971544ffd618c17
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll
new file mode 100644
index 0000000..3cf4342
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll.meta
new file mode 100644
index 0000000..37e1a44
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: a342dceb5fb162465a52708b492a8498
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml
new file mode 100644
index 0000000..3b89741
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win64
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml.meta
new file mode 100644
index 0000000..8afddaa
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/Facepunch.Steamworks.Win64.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: c409e04840b3a797fadaa4c55df5bd73
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll
new file mode 100644
index 0000000..a05e445
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll.meta
new file mode 100644
index 0000000..f4113ff
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 29527a7c9748daf66bb73866405ab4b8
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll
new file mode 100644
index 0000000..0224579
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll.meta
new file mode 100644
index 0000000..58022e8
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/net6.0/steam_api64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: a4a8e3578d643b673bfd29b00c8372dd
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1.meta
new file mode 100644
index 0000000..ddad256
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4f59acc533d93a0b397a55d210b7059c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json
new file mode 100644
index 0000000..88e21ec
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json
@@ -0,0 +1,24 @@
+{
+ "runtimeTarget": {
+ "name": ".NETStandard,Version=v2.1/",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETStandard,Version=v2.1": {},
+ ".NETStandard,Version=v2.1/": {
+ "Facepunch.Steamworks.Posix/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Posix.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Posix/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json.meta
new file mode 100644
index 0000000..7c972a6
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: ae23d31cbf56bdd6ca8343de8fed6f7a
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll
new file mode 100644
index 0000000..37ec4fa
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll.meta
new file mode 100644
index 0000000..8067fe6
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: e82047f862a563934b0ff857321ef946
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml
new file mode 100644
index 0000000..fdfeb09
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Posix
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml.meta
new file mode 100644
index 0000000..adfb502
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Posix.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 126f15d9a59251eb6a90e45a2ad8c5e4
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json
new file mode 100644
index 0000000..96c2d3d
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json
@@ -0,0 +1,24 @@
+{
+ "runtimeTarget": {
+ "name": ".NETStandard,Version=v2.1/",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETStandard,Version=v2.1": {},
+ ".NETStandard,Version=v2.1/": {
+ "Facepunch.Steamworks.Win32/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Win32.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Win32/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json.meta
new file mode 100644
index 0000000..9489f17
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 6ba9eac508736eb43a4003e9a9bbba43
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll
new file mode 100644
index 0000000..86115d1
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll.meta
new file mode 100644
index 0000000..d2afc8c
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 39ce8fc1bb288d66f9185d874f29bc11
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml
new file mode 100644
index 0000000..c399c3a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win32
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml.meta
new file mode 100644
index 0000000..23a94ab
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win32.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 68d5f1859372f3f21a864c1cc104229e
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json
new file mode 100644
index 0000000..56a3f67
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json
@@ -0,0 +1,24 @@
+{
+ "runtimeTarget": {
+ "name": ".NETStandard,Version=v2.1/",
+ "signature": ""
+ },
+ "compilationOptions": {},
+ "targets": {
+ ".NETStandard,Version=v2.1": {},
+ ".NETStandard,Version=v2.1/": {
+ "Facepunch.Steamworks.Win64/1.0.0": {
+ "runtime": {
+ "Facepunch.Steamworks.Win64.dll": {}
+ }
+ }
+ }
+ },
+ "libraries": {
+ "Facepunch.Steamworks.Win64/1.0.0": {
+ "type": "project",
+ "serviceable": false,
+ "sha512": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json.meta
new file mode 100644
index 0000000..88cdd9a
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.deps.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 3d3c37b4b6323ad9e97d6cf7a9a5f148
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll
new file mode 100644
index 0000000..16bc7dd
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll.meta
new file mode 100644
index 0000000..49875cd
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 19c77a155b5bb95dfb0faac9a72af12e
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml
new file mode 100644
index 0000000..3b89741
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml
@@ -0,0 +1,4283 @@
+
+
+
+ Facepunch.Steamworks.Win64
+
+
+
+
+ An awaitable version of a SteamAPICall_t
+
+
+
+
+ This gets called if IsComplete returned false on the first call.
+ The Action "continues" the async call. We pass it to the Dispatch
+ to be called when the callback returns.
+
+
+
+
+ Gets the result. This is called internally by the async shit.
+
+
+
+
+ Return true if complete or failed
+
+
+
+
+ This is what makes this struct awaitable
+
+
+
+
+ Gives us a generic way to get the CallbackId of structs
+
+
+
+
+ Cancels a ticket.
+ You should cancel your ticket when you close the game or leave a server.
+
+
+
+
+ Responsible for all callback/callresult handling
+
+ This manually pumps Steam's message queue and dispatches those
+ events to any waiting callbacks/callresults.
+
+
+
+
+ If set then we'll call this function every time a callback is generated.
+
+ This is SLOW!! - it's for debugging - don't keep it on all the time. If you want to access a specific
+ callback then please create an issue on github and I'll add it!
+
+ Params are : [Callback Type] [Callback Contents] [server]
+
+
+
+
+
+ Called if an exception happens during a callback/callresult.
+ This is needed because the exception isn't always accessible when running
+ async.. and can fail silently. With this hooked you won't be stuck wondering
+ what happened.
+
+
+
+
+ This gets called from Client/Server Init
+ It's important to switch to the manual dispatcher
+
+
+
+
+ Make sure we don't call Frame in a callback - because that'll cause some issues for everyone.
+
+
+
+
+ Calls RunFrame and processes events from this Steam Pipe
+
+
+
+
+ To be safe we don't call the continuation functions while iterating
+ the Callback list. This is maybe overly safe because the only way this
+ could be an issue is if the callback list is modified in the continuation
+ which would only happen if starting or shutting down in the callback.
+
+
+
+
+ A callback is a general global message
+
+
+
+
+ Given a callback, try to turn it into a string
+
+
+
+
+ A result is a reply to a specific command
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Pumps the queue in an async loop so we don't
+ have to think about it. This has the advantage that
+ you can call .Wait() on async shit and it still works.
+
+
+
+
+ Watch for a steam api call
+
+
+
+
+ Install a global callback. The passed function will get called if it's all good.
+
+
+
+
+ The score is just a simple numerical value
+
+
+
+
+ The score represents a time, in seconds
+
+
+
+
+ The score represents a time, in milliseconds
+
+
+
+
+ The top-score is the lowest number
+
+
+
+
+ The top-score is the highest number
+
+
+
+
+ Send the message unreliably. Can be lost. Messages *can* be larger than a
+ single MTU (UDP packet), but there is no retransmission, so if any piece
+ of the message is lost, the entire message will be dropped.
+
+ The sending API does have some knowledge of the underlying connection, so
+ if there is no NAT-traversal accomplished or there is a recognized adjustment
+ happening on the connection, the packet will be batched until the connection
+ is open again.
+
+
+
+
+ Disable Nagle's algorithm.
+ By default, Nagle's algorithm is applied to all outbound messages. This means
+ that the message will NOT be sent immediately, in case further messages are
+ sent soon after you send this, which can be grouped together. Any time there
+ is enough buffered data to fill a packet, the packets will be pushed out immediately,
+ but partially-full packets not be sent until the Nagle timer expires.
+
+
+
+
+ If the message cannot be sent very soon (because the connection is still doing some initial
+ handshaking, route negotiations, etc), then just drop it. This is only applicable for unreliable
+ messages. Using this flag on reliable messages is invalid.
+
+
+
+ Reliable message send. Can send up to 0.5mb in a single message.
+ Does fragmentation/re-assembly of messages under the hood, as well as a sliding window for
+ efficient sends of large chunks of data.
+
+
+
+ Return a NetIdentity that represents LocalHost
+
+
+
+
+ Return true if this identity is localhost
+
+
+
+
+ Convert to a SteamId
+
+
+
+
+
+ Set the specified Address
+
+
+
+
+ Automatically convert to a SteamId
+
+
+
+
+
+ Returns NULL if we're not a SteamId
+
+
+
+
+ Returns NULL if we're not a NetAddress
+
+
+
+
+ We override tostring to provide a sensible representation
+
+
+
+
+ The Port. This is redundant documentation.
+
+
+
+
+ Any IP, specific port
+
+
+
+
+ Localhost IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Specific IP, specific port
+
+
+
+
+ Set everything to zero
+
+
+
+
+ Return true if the IP is ::0. (Doesn't check port.)
+
+
+
+
+ Return true if IP is mapped IPv4
+
+
+
+
+ Return true if IP is a fake IPv4 for Steam Datagram Relay
+
+
+
+
+ Return true if this identity is localhost. (Either IPv6 ::1, or IPv4 127.0.0.1)
+
+
+
+
+ Get the Address section
+
+
+
+
+ Used as a base to create your client connection. This creates a socket
+ to a single connection.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Accept an incoming connection that has been received on a listen socket.
+
+
+
+
+ Disconnects from the remote host and invalidates the connection handle. Any unread data on the connection is discarded..
+ reasonCode is defined and used by you.
+
+
+
+
+ Get/Set connection user data
+
+
+
+
+ A name for the connection, used mostly for debugging
+
+
+
+
+ This is the best version to use.
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ Flush any messages waiting on the Nagle timer and send them at the next transmission
+ opportunity (often that means right now).
+
+
+
+
+ Returns detailed connection stats in text format. Useful
+ for dumping to a log, etc.
+
+ Plain text connection info
+
+
+
+ Returns a small set of information about the real-time state of the connection.
+
+
+
+
+ Configure multiple outbound messages streams ("lanes") on a connection, and
+ control head-of-line blocking between them.
+
+
+
+
+ Describe the state of a connection
+
+
+
+
+ High level state of the connection
+
+
+
+
+ Remote address. Might be all 0's if we don't know it, or if this is N/A.
+
+
+
+
+ Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+
+
+
+
+ Basic cause of the connection termination or problem.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+ Describe the status of a connection
+
+
+
+
+ Current ping (ms)
+
+
+
+
+ Outgoing packets per second
+
+
+
+
+ Outgoing bytes per second
+
+
+
+
+ Incoming packets per second
+
+
+
+
+ Incoming bytes per second
+
+
+
+
+ Connection quality measured locally, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Packet delivery success rate as observed from remote host, 0...1 (percentage of packets delivered end-to-end in order).
+
+
+
+
+ Number of bytes unreliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes reliable data pending to be sent. This is data that you have recently requested to be sent but has not yet actually been put on the wire.
+
+
+
+
+ Number of bytes of reliable data that has been placed the wire, but for which we have not yet received an acknowledgment, and thus we may have to re-transmit.
+
+
+
+
+
+ Object that describes a "location" on the Internet with sufficient
+ detail that we can reasonably estimate an upper bound on the ping between
+ the two hosts, even if a direct route between the hosts is not possible,
+ and the connection must be routed through the Steam Datagram Relay network.
+ This does not contain any information that identifies the host. Indeed,
+ if two hosts are in the same building or otherwise have nearly identical
+ networking characteristics, then it's valid to use the same location
+ object for both of them.
+
+ NOTE: This object should only be used in the same process! Do not serialize it,
+ send it over the wire, or persist it in a file or database! If you need
+ to do that, convert it to a string representation using the methods in
+ ISteamNetworkingUtils().
+
+
+
+
+ Estimate the round-trip latency between two arbitrary locations, in
+ milliseconds. This is a conservative estimate, based on routing through
+ the relay network. For most basic relayed connections, this ping time
+ will be pretty accurate, since it will be based on the route likely to
+ be actually used.
+
+ If a direct IP route is used (perhaps via NAT traversal), then the route
+ will be different, and the ping time might be better. Or it might actually
+ be a bit worse! Standard IP routing is frequently suboptimal!
+
+ But even in this case, the estimate obtained using this method is a
+ reasonable upper bound on the ping time. (Also it has the advantage
+ of returning immediately and not sending any packets.)
+
+ In a few cases we might not able to estimate the route. In this case
+ a negative value is returned. k_nSteamNetworkingPing_Failed means
+ the reason was because of some networking difficulty. (Failure to
+ ping, etc) k_nSteamNetworkingPing_Unknown is returned if we cannot
+ currently answer the question for some other reason.
+
+ Do you need to be able to do this from a backend/matchmaking server?
+ You are looking for the "ticketgen" library.
+
+
+
+ Destroy a listen socket. All the connections that were accepting on the listen
+ socket are closed ungracefully.
+
+
+
+
+ Represents a Steam Achievement.
+
+
+
+
+ Gets whether or not the achievement has been unlocked.
+
+
+
+
+ Gets the identifier of the achievement. This is the "API Name" on Steamworks.
+
+
+
+
+ Gets the display name of the achievement.
+
+
+
+
+ Gets the description of the achievement.
+
+
+
+
+ If is , this value represents the time that the achievement was unlocked.
+
+
+
+
+ Gets the icon of the achievement. This can return a null image even though the image exists if the image
+ hasn't been downloaded by Steam yet. You should use if you want to wait for the image to be downloaded.
+
+
+
+
+ Gets the icon of the achievement, yielding until the icon is received or the is reached.
+
+ The timeout in milliseconds before the request will be canceled. Defaults to 5000.
+
+
+
+ Gets a decimal (0-1) representing the global amount of users who have unlocked the specified achievement, or -1 if no data available.
+
+
+
+
+ Unlock this achievement.
+
+
+
+
+ Reset this achievement to be locked.
+
+
+
+
+ Provides information about a DLC.
+
+
+
+
+ The of the DLC.
+
+
+
+
+ The name of the DLC.
+
+
+
+
+ Whether or not the DLC is available.
+
+
+
+
+ Represents download progress.
+
+
+
+
+ Whether or not the download is currently active.
+
+
+
+
+ How many bytes have been downloaded.
+
+
+
+
+ How many bytes in total the download is.
+
+
+
+
+ Gets the amount of bytes left that need to be downloaded.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate, half rate, or zero rate.
+
+
+
+
+ appid generating playtime
+
+
+
+
+ is duration control applicable to user + game combination
+
+
+
+
+ playtime since most recent 5 hour gap in playtime, only counting up to regulatory limit of playtime, in seconds
+
+
+
+
+ playtime on current calendar day
+
+
+
+
+ recommended progress
+
+
+
+
+ Represents details of a file.
+
+
+
+
+ The size of the file in bytes.
+
+
+
+
+ Returns the color of the pixel at the specified position.
+
+ X-coordinate
+ Y-coordinate
+ The color.
+ If the X and Y or out of bounds.
+
+
+
+ Returns "{Width}x{Height} ({length of }bytes)"
+
+
+
+
+
+ Represents a color.
+
+
+
+
+ the name of a leaderboard
+
+
+
+
+ Submit your score and replace your old score even if it was better
+
+
+
+
+ Submit your new score, but won't replace your high score if it's lower
+
+
+
+
+ Attaches a piece of user generated content the user's entry on a leaderboard
+
+
+
+
+ Fetches leaderboard entries for an arbitrary set of users on a specified leaderboard.
+
+
+
+
+ Used to query for a sequential range of leaderboard entries by leaderboard Sort.
+
+
+
+
+ Used to retrieve leaderboard entries relative a user's entry. If there are not enough entries in the leaderboard
+ before or after the user's entry, Steam will adjust the range to try to return the number of entries requested.
+ For example, if the user is #1 on the leaderboard and start is set to -2, end is set to 2, Steam will return the first
+ 5 entries in the leaderboard. If The current user has no entry, this will return null.
+
+
+
+
+ Used to retrieve all leaderboard entries for friends of the current user
+
+
+
+
+ Represents a Steam lobby.
+
+
+
+
+ Try to join this room. Will return on success,
+ and anything else is a failure.
+
+
+
+
+ Leave a lobby; this will take effect immediately on the client side
+ other users in the lobby will be notified by a LobbyChatUpdate_t callback
+
+
+
+
+ Invite another user to the lobby.
+ Will return if the invite is successfully sent, whether or not the target responds
+ returns if the local user is not connected to the Steam servers
+
+
+
+
+ Gets the number of users in this lobby.
+
+
+
+
+ Returns current members in the lobby. The current user must be in the lobby in order to see the users.
+
+
+
+
+ Get data associated with this lobby.
+
+
+
+
+ Set data associated with this lobby.
+
+
+
+
+ Removes a metadata key from the lobby.
+
+
+
+
+ Get all data for this lobby.
+
+
+
+
+ Gets per-user metadata for someone in this lobby.
+
+
+
+
+ Sets per-user metadata (for the local user implicitly).
+
+
+
+
+ Sends a string to the chat room.
+
+
+
+
+ Sends bytes to the chat room.
+
+
+
+
+ Sends bytes to the chat room from an unsafe buffer.
+
+
+
+
+ Refreshes metadata for a lobby you're not necessarily in right now.
+
+ You never do this for lobbies you're a member of, only if your
+ this will send down all the metadata associated with a lobby.
+ This is an asynchronous call.
+ Returns if the local user is not connected to the Steam servers.
+ Results will be returned by a LobbyDataUpdate_t callback.
+ If the specified lobby doesn't exist, LobbyDataUpdate_t::m_bSuccess will be set to .
+
+
+
+
+
+ Max members able to join this lobby. Cannot be over 250.
+ Can only be set by the owner of the lobby.
+
+
+
+
+ Sets the lobby as public.
+
+
+
+
+ Sets the lobby as private.
+
+
+
+
+ Sets the lobby as invisible.
+
+
+
+
+ Sets the lobby as friends only.
+
+
+
+
+ Set whether or not the lobby can be joined.
+
+ Whether or not the lobby can be joined.
+
+
+
+ [SteamID variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ [IP/Port variant]
+ Allows the owner to set the game server associated with the lobby. Triggers the
+ Steammatchmaking.OnLobbyGameCreated event.
+
+
+
+
+ Gets the details of the lobby's game server, if set. Returns true if the lobby is
+ valid and has a server set, otherwise returns false.
+
+
+
+
+ Gets or sets the owner of the lobby. You must be the lobby owner to set the owner
+
+
+
+
+ Check if the specified SteamId owns the lobby.
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ only lobbies in the same immediate region will be returned
+
+
+
+
+ Filter by specified key/value pair; string parameters
+
+
+
+
+ Numerical filter where value is less than the value provided
+
+
+
+
+ Numerical filter where value is greater than the value provided
+
+
+
+
+ Numerical filter where value must be equal to the value provided
+
+
+
+
+ Numerical filter where value must not equal the value provided
+
+
+
+
+ Test key, initialize numerical filter list if necessary, then add new numerical filter
+
+
+
+
+ Order filtered results according to key/values nearest the provided key/value pair.
+ Can specify multiple near value filters; each successive filter is lower priority than the previous.
+
+
+
+
+ returns only lobbies with the specified number of slots available
+
+
+
+
+ sets how many results to return, the lower the count the faster it is to download the lobby results
+
+
+
+
+ Run the query, get the matching lobbies
+
+
+
+
+ A server query packet.
+
+
+
+
+ Target IP address
+
+
+
+
+ Target port
+
+
+
+
+ This data is pooled. Make a copy if you don't use it immediately.
+ This buffer is also quite large - so pay attention to Size.
+
+
+
+
+ Size of the data
+
+
+
+
+ Represents a RemotePlaySession from the SteamRemotePlay interface
+
+
+
+
+ Returns true if this session was valid when created. This will stay true even
+ after disconnection - so be sure to watch SteamRemotePlay.OnSessionDisconnected
+
+
+
+
+ Get the SteamID of the connected user
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Get the name of the session client device
+
+
+
+
+ Represents a screenshot that was taken by a user.
+
+
+
+
+ Tags a user as being visible in the screenshot
+
+
+
+
+ Sets the location of the screenshot.
+
+
+
+
+ Gets the individual tags for this server
+
+
+
+
+ Add this server to our history list
+ If we're already in the history list, weill set the last played time to now
+
+
+
+
+ If this server responds to source engine style queries, we'll be able to get a list of rules here
+
+
+
+
+ Remove this server from our history list
+
+
+
+
+ Add this server to our favourite list
+
+
+
+
+ Remove this server from our favourite list
+
+
+
+
+ Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
+
+
+
+
+
+
+
+ An optional interface to use instead of deriving
+
+
+
+
+ The actual connection we're managing
+
+
+
+
+ The last received ConnectionInfo
+
+
+
+
+ We're trying to connect!
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Sends a message to multiple connections.
+
+ The connections to send the message to.
+ The number of connections to send the message to, to allow reusing the connections array.
+ Pointer to the message data.
+ Size of the message data.
+ Flags to control delivery of the message.
+ An optional array to hold the results of sending the messages for each connection.
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ Ideally should be using an IntPtr version unless you're being really careful with the byte[] array and
+ you're not creating a new one every frame (like using .ToArray())
+
+
+
+
+ This creates a ton of garbage - so don't do anything with this beyond testing!
+
+
+
+
+ We started connecting to this guy
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ We got disconnected
+
+
+
+
+ Received a message
+
+
+
+
+ Must call Accept or Close on the connection within a second or so
+
+
+
+
+ Called when the connection is fully connected and can start being communicated with
+
+
+
+
+ Called when the connection leaves. Must call Close on the connection
+
+
+
+
+ Received a message from a connection
+
+
+
+
+ Used as a base to create your networking server. This creates a socket
+ and listens/communicates with multiple queries.
+
+ You can override all the virtual functions to turn it into what you
+ want it to do.
+
+
+
+
+ Default behaviour is to accept every connection
+
+
+
+
+ Client is connected. They move from connecting to Connections
+
+
+
+
+ The connection has been closed remotely or disconnected locally. Check data.State for details.
+
+
+
+
+ Which app we're querying. Defaults to the current app.
+
+
+
+
+ When a new server is added, this function will get called
+
+
+
+
+ Called for every responsive server
+
+
+
+
+ A list of servers that responded. If you're only interested in servers that responded since you
+ last updated, then simply clear this list.
+
+
+
+
+ A list of servers that were in the master list but didn't respond.
+
+
+
+
+ Query the server list. Task result will be true when finished
+
+
+
+
+
+ Exposes a wide range of information and actions for applications and Downloadable Content (DLC).
+
+
+
+
+ Posted after the user gains ownership of DLC and that DLC is installed.
+
+
+
+
+ Posted after the user gains executes a Steam URL with command line or query parameters
+ such as steam://run/appid//-commandline/?param1=value1(and)param2=value2(and)param3=value3 etc
+ while the game is already running. The new params can be queried
+ with GetLaunchQueryParam and GetLaunchCommandLine.
+
+
+
+
+ Gets whether or not the active user is subscribed to the current App ID.
+
+
+
+
+ Gets whether or not the user borrowed this game via Family Sharing. If true, call GetAppOwner() to get the lender SteamID.
+
+
+
+
+ Gets whether or not the license owned by the user provides low violence depots.
+ Low violence depots are useful for copies sold in countries that have content restrictions
+
+
+
+
+ Gets whether or not the current App ID license is for Cyber Cafes.
+
+
+
+
+ Gets whether or not the user has a VAC ban on their account.
+
+
+
+
+ Gets the current language that the user has set.
+ This falls back to the Steam UI language if the user hasn't explicitly picked a language for the title.
+
+
+
+
+ Gets a list of the languages the current app supports.
+
+
+
+
+ Gets whether or not the active user is subscribed to a specified App ID.
+ Only use this if you need to check ownership of another game related to yours, a demo for example.
+
+ The App ID of the DLC to check.
+
+
+
+ Gets whether or not the user owns a specific DLC and if the DLC is installed.
+
+ The App ID of the DLC to check.
+
+
+
+ Returns the time of the purchase of the app.
+
+ The App ID to check the purchase time for.
+
+
+
+ Checks if the user is subscribed to the current app through a free weekend.
+ This function will return false for users who have a retail or other type of license.
+ Before using, please ask your Valve technical contact how to package and secure your free weekened.
+
+
+
+
+ Returns metadata for all available DLC.
+
+
+
+
+ Install control for optional DLC.
+
+ The App ID of the DLC to install.
+
+
+
+ Uninstall control for optional DLC.
+
+ The App ID of the DLC to uninstall.
+
+
+
+ Gets the name of the beta branch that is launched, or if the application is not running on a beta branch.
+
+
+
+
+ Force verify game content on next launch.
+
+ If you detect the game is out-of-date (for example, by having the client detect a version mismatch with a server),
+ you can call MarkContentCorrupt to force a verify, show a message to the user, and then quit.
+
+
+ Whether or not to only verify missing files.
+
+
+
+ Gets a list of all installed depots for a given App ID in mount order.
+
+ The App ID.
+
+
+
+ Gets the install folder for a specific App ID.
+ This works even if the application is not installed, based on where the game would be installed with the default Steam library location.
+
+ The App ID.
+
+
+
+ Gets whether or not the app is owned by the current user. The app may not actually be owned by the current user; they may have it left over from a free weekend, etc.
+
+ The App ID.
+
+
+
+ Gets the Steam ID of the original owner of the current app. If it's different from the current user then it is borrowed.
+
+
+
+
+ Gets the associated launch parameter if the game is run via steam://run/appid/?param1=value1;param2=value2;param3=value3 etc.
+
+ Parameter names starting with the character '@' are reserved for internal use and will always return an empty string.
+ Parameter names starting with an underscore '_' are reserved for steam features -- they can be queried by the game,
+ but it is advised that you not param names beginning with an underscore for your own features.
+
+
+ The name of the parameter.
+ The launch parameter value.
+
+
+
+ Gets the download progress for optional DLC.
+
+ The App ID to check the progress for.
+
+
+
+ Gets the Build ID of this app, which can change at any time based on backend updates to the game.
+ Defaults to 0 if you're not running a build downloaded from steam.
+
+
+
+
+ Asynchronously retrieves metadata details about a specific file in the depot manifest.
+
+ The name of the file.
+
+
+
+ Get command line if game was launched via Steam URL, e.g. steam://run/appid//command line/.
+ This method of passing a connect string (used when joining via rich presence, accepting an
+ invite, etc) is preferable to passing the connect string on the operating system command
+ line, which is a security risk. In order for rich presence joins to go through this
+ path and not be placed on the OS command line, you must set a value in your app's
+ configuration on Steam. Ask Valve for help with this.
+
+
+
+
+ Check if game is a timed trial with limited playtime.
+
+ The amount of seconds left on the timed trial.
+ The amount of seconds played on the timed trial.
+
+
+
+ Initialize the steam client.
+ If is false you need to call manually every frame.
+
+
+
+
+ Check if Steam is loaded and accessible.
+
+
+
+
+ Shuts down the steam client.
+
+
+
+
+ Checks if the current user's Steam client is connected to the Steam servers.
+
+ If it's not, no real-time services provided by the Steamworks API will be enabled. The Steam
+ client will automatically be trying to recreate the connection as often as possible. When the
+ connection is restored a SteamServersConnected_t callback will be posted.
+ You usually don't need to check for this yourself. All of the API calls that rely on this will
+ check internally. Forcefully disabling stuff when the player loses access is usually not a
+ very good experience for the player and you could be preventing them from accessing APIs that do not
+ need a live connection to Steam.
+
+
+
+
+
+ Gets the Steam ID of the account currently logged into the Steam client. This is
+ commonly called the 'current user', or 'local user'.
+ A Steam ID is a unique identifier for a Steam accounts, Steam groups, Lobbies and Chat
+ rooms, and used to differentiate users in all parts of the Steamworks API.
+
+
+
+
+ returns the local players name - guaranteed to not be .
+ This is the same name as on the user's community profile page.
+
+
+
+
+ Gets the status of the current user.
+
+
+
+
+ Returns the App ID of the current process.
+
+
+
+
+ Checks if your executable was launched through Steam and relaunches it through Steam if it wasn't.
+
+ This returns true then it starts the Steam client if required and launches your game again through it,
+ and you should quit your process as soon as possible. This effectively runs steam://run/AppId so it
+ may not relaunch the exact executable that called it, as it will always relaunch from the version
+ installed in your Steam library folder/
+ Note that during development, when not launching via Steam, this might always return true.
+
+
+
+
+
+ Called in interfaces that rely on this being initialized
+
+
+
+
+ Class for utilizing the Steam Friends API.
+
+
+
+
+ Invoked when a chat message has been received from a friend. You'll need to enable
+ to recieve this. (friend, msgtype, message)
+
+
+
+
+ Invoked when a chat message has been received in a Steam group chat that we are in. Associated Functions: JoinClanChatRoom. (friend, msgtype, message)
+
+
+
+
+ Invoked when a friends' status changes.
+
+
+
+
+ Invoked when the user tries to join a game from their friends list.
+ Rich presence will have been set with the "connect" key which is set here.
+
+
+
+
+ Invoked when game overlay activates or deactivates.
+ The game can use this to be pause or resume single player games.
+
+
+
+
+ Invoked when the user tries to join a different game server from their friends list.
+ Game client should attempt to connect to specified server when this is received.
+
+
+
+
+ Invoked when the user tries to join a lobby from their friends list.
+ Game client should attempt to connect to specified lobby when this is received.
+
+
+
+
+ Invoked when a friend's rich presence data is updated.
+
+
+
+
+ Invoked when an overlay browser instance is navigated to a
+ protocol/scheme registered by .
+
+
+
+
+ Gets an of friends that the current user has.
+
+ An of friends.
+
+
+
+ Gets an of blocked users that the current user has.
+
+ An of blocked users.
+
+
+
+ Gets an of friend requests that the current user has.
+
+ An of friend requests.
+
+
+
+ Opens a specific overlay window. Valid options are:
+ "friends",
+ "community",
+ "players",
+ "settings",
+ "officialgamegroup",
+ "stats",
+ "achievements".
+
+
+
+
+ "steamid" - Opens the overlay web browser to the specified user or groups profile.
+ "chat" - Opens a chat window to the specified user, or joins the group chat.
+ "jointrade" - Opens a window to a Steam Trading session that was started with the ISteamEconomy/StartTrade Web API.
+ "stats" - Opens the overlay web browser to the specified user's stats.
+ "achievements" - Opens the overlay web browser to the specified user's achievements.
+ "friendadd" - Opens the overlay in minimal mode prompting the user to add the target user as a friend.
+ "friendremove" - Opens the overlay in minimal mode prompting the user to remove the target friend.
+ "friendrequestaccept" - Opens the overlay in minimal mode prompting the user to accept an incoming friend invite.
+ "friendrequestignore" - Opens the overlay in minimal mode prompting the user to ignore an incoming friend invite.
+
+
+
+
+ Activates the Steam Overlay to the Steam store page for the provided app.
+
+
+
+
+ Activates Steam Overlay web browser directly to the specified URL.
+
+
+
+
+ Activates the Steam Overlay to open the invite dialog. Invitations sent from this dialog will be for the provided lobby.
+
+
+
+
+ Mark a target user as 'played with'.
+ NOTE: The current user must be in game with the other player for the association to work.
+
+
+
+
+ Requests the persona name and optionally the avatar of a specified user.
+ NOTE: It's a lot slower to download avatars and churns the local cache, so if you don't need avatars, don't request them.
+ returns true if we're fetching the data, false if we already have it
+
+
+
+
+ Returns a small avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a medium avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Returns a large avatar of the user with the given .
+
+ The of the user to get.
+ A with a value if the image was successfully retrieved.
+
+
+
+ Find a rich presence value by key for current user. Will be null if not found.
+
+
+
+
+ Sets a rich presence value by key for current user.
+
+
+
+
+ Clears all of the current user's rich presence data.
+
+
+
+
+ Listens for Steam friends chat messages.
+ You can then show these chats inline in the game. For example with a Blizzard style chat message system or the chat system in Dota 2.
+ After enabling this you will receive callbacks when ever the user receives a chat message.
+
+
+
+
+ Gets whether or not the current user is following the user with the given .
+
+ The to check.
+ Boolean.
+
+
+
+ Call this before calling ActivateGameOverlayToWebPage() to have the Steam Overlay Browser block navigations
+ to your specified protocol (scheme) uris and instead dispatch a OverlayBrowserProtocolNavigation callback to your game.
+
+
+
+
+ Class for utilizing Steam Input.
+
+
+
+
+ You shouldn't really need to call this because it gets called by
+ but Valve think it might be a nice idea if you call it right before you get input info -
+ just to make sure the info you're getting is 100% up to date.
+
+
+
+
+ Gets a list of connected controllers.
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+
+
+
+ Return an absolute path to the PNG image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Return an absolute path to the SVF image glyph for the provided digital action name. The current
+ action set in use for the controller will be used for the lookup. You should cache the result and
+ maintain your own list of loaded PNG assets.
+
+
+
+
+ Class for utilizing the Steam Inventory API.
+
+
+
+
+ Call this if you're going to want to access definition information. You should be able to get
+ away with calling this once at the start if your game, assuming your items don't change all the time.
+ This will trigger at which point Definitions should be set.
+
+
+
+
+ Will call and wait until Definitions is not null
+
+
+
+
+ Try to find the definition that matches this definition ID.
+ Uses a dictionary so should be about as fast as possible.
+
+
+
+
+ We will try to keep this list of your items automatically up to date.
+
+
+
+
+ Update the list of Items[]
+
+
+
+
+ Get all items and return the InventoryResult
+
+
+
+
+ This is used to grant a specific item to the user. This should
+ only be used for development prototyping, from a trusted server,
+ or if you don't care about hacked clients granting arbitrary items.
+ This call can be disabled by a setting on Steamworks.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Crafting! Uses the passed items to buy the target item.
+ You need to have set up the appropriate exchange rules in your item
+ definitions. This assumes all the items passed in aren't stacked.
+
+
+
+
+ Deserializes a result set and verifies the signature bytes.
+ This call has a potential soft-failure mode where the Result is expired, it will
+ still succeed in this mode.The "expired"
+ result could indicate that the data may be out of date - not just due to timed
+ expiration( one hour ), but also because one of the items in the result set may
+ have been traded or consumed since the result set was generated.You could compare
+ the timestamp from GetResultTimestamp to ISteamUtils::GetServerRealTime to determine
+ how old the data is. You could simply ignore the "expired" result code and
+ continue as normal, or you could request the player with expired data to send
+ an updated result set.
+ You should call CheckResultSteamID on the result handle when it completes to verify
+ that a remote player is not pretending to have a different user's inventory.
+
+
+
+
+ Grant all promotional items the user is eligible for.
+
+
+
+
+ Trigger an item drop for this user. This is for timed drops.
+
+
+
+
+ Trigger a promo item drop. You can call this at startup, it won't
+ give users multiple promo drops.
+
+
+
+
+ Start buying a cart load of items. This will return a positive result is the purchase has
+ begun. You should listen out for SteamUser.OnMicroTxnAuthorizationResponse for a success.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Maximum number of characters a lobby metadata key can be
+
+
+
+
+ Invoked when the current user is invited to a lobby.
+
+
+
+
+ Invoked when the current user joins a lobby.
+
+
+
+
+ Invoked when the current user creates a lobby.
+
+
+
+
+ Invoked when a game server has been associated with a lobby.
+
+
+
+
+ Invoked when a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member in a lobby's metadata is modified.
+
+
+
+
+ Invoked when a member joins a lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member leaves the lobby.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a lobby member is kicked from a lobby. The 3rd param is the user that kicked them.
+
+
+
+
+ Invoked when a chat message is received from a member of the lobby.
+
+
+
+
+ Creates a new invisible lobby. Call to take it online.
+
+
+
+
+ Attempts to directly join the specified lobby.
+
+
+
+
+ Get a list of servers that are on the current user's favorites list.
+
+
+
+
+ Get a list of servers that the current user has added to their history.
+
+
+
+
+ Methods for clients to access matchmaking services, favorites, and to operate on game lobbies
+
+
+
+
+ Functions to control music playback in the steam client.
+ This gives games the opportunity to do things like pause the music or lower the volume,
+ when an important cut scene is shown, and start playing afterwards.
+ Nothing uses Steam Music though so this can probably get fucked
+
+
+
+
+ Invoked when playback status is changed.
+
+
+
+
+ Invoked when the volume of the music player is changed.
+
+
+
+
+ Checks if Steam Music is enabled.
+
+
+
+
+ if a song is currently playing, paused, or queued up to play; otherwise .
+
+
+
+
+ Gets the current status of the Steam Music player
+
+
+
+
+ Plays the music player.
+
+
+
+
+ Pauses the music player.
+
+
+
+
+ Forces the music player to play the previous song.
+
+
+
+
+ Forces the music player to skip to the next song.
+
+
+
+
+ Gets and sets the current volume of the Steam Music player
+
+
+
+
+ Class for utilizing the Steam Network API.
+
+
+
+
+ Invoked when a wants to send the current user a message. You should respond by calling
+ if you want to recieve their messages.
+
+
+
+
+ Invoked when packets can't get through to the specified user.
+ All queued packets unsent at this point will be dropped, further attempts
+ to send will retry making the connection (but will be dropped if we fail again).
+
+
+
+
+ This should be called in response to a .
+
+
+
+
+ Allow or disallow P2P connects to fall back on Steam server relay if direct
+ connection or NAT traversal can't be established. Applies to connections
+ created after setting or old connections that need to reconnect.
+
+
+
+
+ This should be called when you're done communicating with a user, as this will
+ free up all of the resources allocated for the connection under-the-hood.
+ If the remote user tries to send data to you again, a new
+ callback will be posted
+
+
+
+
+ Checks if a P2P packet is available to read.
+
+
+
+
+ Checks if a P2P packet is available to read, and gets the size of the message if there is one.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Reads in a packet that has been sent from another user via SendP2PPacket.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Sends a P2P packet to the specified user.
+ This is a session-less API which automatically establishes NAT-traversing or Steam relay server connections.
+ NOTE: The first packet send may be delayed as the NAT-traversal code runs.
+
+
+
+
+ Get the identity assigned to this interface.
+ E.g. on Steam, this is the user's SteamID, or for the gameserver interface, the SteamID assigned
+ to the gameserver. Returns false and sets the result to an invalid identity if we don't know
+ our identity yet. (E.g. GameServer has not logged in. On Steam, the user will know their SteamID
+ even if they are not signed into Steam.)
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6)
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a "server" socket that listens for clients to connect to by calling
+ Connect, over ordinary UDP (IPv4 or IPv6).
+
+ To use this you should pass a class that inherits . You can use
+ SocketManager to get connections and send messages, but the ISocketManager class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Connect to a socket created via CreateListenSocketIP.
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Connect to a relay server.
+
+
+
+
+ Begin asynchronous process of allocating a fake IPv4 address that other
+ peers can use to contact us via P2P. IP addresses returned by this
+ function are globally unique for a given appid.
+
+ For gameservers, you *must* call this after initializing the SDK but before
+ beginning login. Steam needs to know in advance that FakeIP will be used.
+
+
+
+
+ Return info about the FakeIP and port that we have been assigned, if any.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this derive a class from and override as much as you want.
+
+
+
+
+
+ Creates a server that will be relayed via Valve's network (hiding the IP and improving ping).
+
+ To use this you should pass a class that inherits . You can use
+ to get connections and send messages, but the class
+ will received all the appropriate callbacks.
+
+
+
+
+
+ Provides Steam Networking utilities.
+
+
+
+
+ A function to receive debug network information on. This will do nothing
+ unless you set to something other than .
+
+ You should set this to an appropriate level instead of setting it to the highest
+ and then filtering it by hand because a lot of energy is used by creating the strings
+ and your frame rate will tank and you won't know why.
+
+
+
+
+ The latest available status gathered from the SteamRelayNetworkStatus callback
+
+
+
+
+ If you know that you are going to be using the relay network (for example,
+ because you anticipate making P2P connections), call this to initialize the
+ relay network. If you do not call this, the initialization will
+ be delayed until the first time you use a feature that requires access
+ to the relay network, which will delay that first access.
+
+ You can also call this to force a retry if the previous attempt has failed.
+ Performing any action that requires access to the relay network will also
+ trigger a retry, and so calling this function is never strictly necessary,
+ but it can be useful to call it a program launch time, if access to the
+ relay network is anticipated.
+
+
+ Use GetRelayNetworkStatus or listen for SteamRelayNetworkStatus_t
+ callbacks to know when initialization has completed.
+ Typically initialization completes in a few seconds.
+
+
+ Note: dedicated servers hosted in known data centers do *not* need
+ to call this, since they do not make routing decisions. However, if
+ the dedicated server will be using P2P functionality, it will act as
+ a "client" and this should be called.
+
+
+
+
+
+ Return location info for the current host.
+
+ It takes a few seconds to initialize access to the relay network. If
+ you call this very soon after startup the data may not be available yet.
+
+ This always return the most up-to-date information we have available
+ right now, even if we are in the middle of re-calculating ping times.
+
+
+
+
+ Same as PingLocation.EstimatePingTo, but assumes that one location is the local host.
+ This is a bit faster, especially if you need to calculate a bunch of
+ these in a loop to find the fastest one.
+
+
+
+
+ If you need ping information straight away, wait on this. It will return
+ immediately if you already have up to date ping data.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ [0 - 100] - Randomly discard N pct of packets.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Delay all packets by N ms.
+
+
+
+
+ Timeout value (in ms) to use when first connecting.
+
+
+
+
+ Timeout value (in ms) to use after connection is established.
+
+
+
+
+ Upper limit of buffered pending bytes to be sent.
+ If this is reached SendMessage will return LimitExceeded.
+ Default is 524288 bytes (512k).
+
+
+
+
+ Minimum send rate clamp, 0 is no limit.
+ This value will control the min allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Maximum send rate clamp, 0 is no limit.
+ This value will control the max allowed sending rate that
+ bandwidth estimation is allowed to reach. Default is 0 (no-limit)
+
+
+
+
+ Nagle time, in microseconds. When SendMessage is called, if
+ the outgoing message is less than the size of the MTU, it will be
+ queued for a delay equal to the Nagle timer value. This is to ensure
+ that if the application sends several small messages rapidly, they are
+ coalesced into a single packet.
+ See historical RFC 896. Value is in microseconds.
+ Default is 5000us (5ms).
+
+
+
+
+ Don't automatically fail IP connections that don't have
+ strong auth. On clients, this means we will attempt the connection even if
+ we don't know our identity or can't get a cert. On the server, it means that
+ we won't automatically reject a connection due to a failure to authenticate.
+ (You can examine the incoming connection and decide whether to accept it.)
+
+ This is a dev configuration value, and you should not let users modify it in
+ production.
+
+
+
+
+
+ Allow unencrypted (and unauthenticated) communication.
+ 0: Not allowed (the default)
+ 1: Allowed, but prefer encrypted
+ 2: Allowed, and preferred
+ 3: Required. (Fail the connection if the peer requires encryption.)
+
+ This is a dev configuration value, since its purpose is to disable encryption.
+ You should not let users modify it in production. (But note that it requires
+ the peer to also modify their value in order for encryption to be disabled.)
+
+
+
+
+
+ Log RTT calculations for inline pings and replies.
+
+
+
+
+ Log SNP packets send.
+
+
+
+
+ Log each message send/recv.
+
+
+
+
+ Log dropped packets.
+
+
+
+
+ Log P2P rendezvous messages.
+
+
+
+
+ Log ping relays.
+
+
+
+
+ Get Debug Information via event.
+
+ Except when debugging, you should only use
+ or . For best performance, do NOT
+ request a high detail level and then filter out messages in the callback.
+
+
+ This incurs all of the expense of formatting the messages, which are then discarded.
+ Setting a high priority value (low numeric value) here allows the library to avoid
+ doing this work.
+
+
+
+
+
+ So we can remember and provide a Get for DebugLevel.
+
+
+
+
+ We need to keep the delegate around until it's not used anymore.
+
+
+
+
+ This can be called from other threads - so we're going to queue these up and process them in a safe place.
+
+
+
+
+ Called regularly from the Dispatch loop so we can provide a timely
+ stream of messages.
+
+
+
+
+ Undocumented Parental Settings
+
+
+
+
+ Parental Settings Changed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This API can be used to selectively advertise your multiplayer game session in a Steam chat room group.
+ Tell Steam the number of player spots that are available for your party, and a join-game string, and it
+ will show a beacon in the selected group and allow that many users to “follow” the beacon to your party.
+ Adjust the number of open slots if other players join through alternate matchmaking methods.
+
+
+
+
+ Invoked when the list of possible Party beacon locations has changed
+
+
+
+
+ Invoked when the list of active beacons may have changed
+
+
+
+
+ Gets the amount of beacons that are active.
+
+
+
+
+ Gets an of active beacons.
+
+
+
+
+ Functions that provide information about Steam Remote Play sessions, streaming your game content to another computer or to a Steam Link app or hardware.
+
+
+
+
+ Invoked when a session is connected.
+
+
+
+
+ Invoked when a session becomes disconnected.
+
+
+
+
+ Gets the number of currently connected Steam Remote Play sessions
+
+
+
+
+ Get the currently connected Steam Remote Play session ID at the specified index.
+ IsValid will return if it's out of bounds
+
+
+
+
+ Invite a friend to Remote Play Together.
+ This returns if the invite can't be sent
+
+
+
+
+ Class for utilizing the Steam Remote Storage API.
+
+
+
+
+ Creates a new file, writes the bytes to the file, and then closes the file.
+ If the target file already exists, it is overwritten
+
+ The path of the file.
+ The bytes of data.
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Opens a binary file, reads the contents of the file into a byte array, and then closes the file.
+
+ The path of the file.
+
+
+
+ Checks whether the specified file exists.
+
+ The path of the file.
+ Whether or not the file exists.
+
+
+
+ Checks if a specific file is persisted in the steam cloud.
+
+ The path of the file.
+ Boolean.
+
+
+
+ Gets the specified file's last modified date/time.
+
+ The path of the file.
+ A describing when the file was modified last.
+
+
+
+ Returns the specified files size in bytes, or 0 if the file does not exist.
+
+ The path of the file.
+ The size of the file in bytes, or 0 if the file doesn't exist.
+
+
+
+ Deletes the file from remote storage, but leaves it on the local disk and remains accessible from the API.
+
+ A boolean, detailing whether or not the operation was successful.
+
+
+
+ Deletes a file from the local disk, and propagates that delete to the cloud.
+
+
+
+
+ Gets the total number of quota bytes.
+
+
+
+
+ Gets the total number of quota bytes that have been used.
+
+
+
+
+ Number of bytes remaining until the quota is used.
+
+
+
+
+ returns if AND are .
+
+
+
+
+ Checks if the account wide Steam Cloud setting is enabled for this user
+ or if they disabled it in the Settings->Cloud dialog.
+
+
+
+
+ Checks if the per game Steam Cloud setting is enabled for this user
+ or if they disabled it in the Game Properties->Update dialog.
+
+ This must only ever be set as the direct result of the user explicitly
+ requesting that it's enabled or not. This is typically accomplished with
+ a checkbox within your in-game options
+
+
+
+
+ Gets the total number of local files synchronized by Steam Cloud.
+
+
+
+
+ Gets a list of filenames synchronized by Steam Cloud.
+
+
+
+
+ Class for utilizing the Steam Screenshots API.
+
+
+
+
+ Invoked when a screenshot has been requested by the user from the Steam screenshot hotkey.
+ This will only be called if is true, in which case Steam
+ will not take the screenshot itself.
+
+
+
+
+ Invoked when a screenshot has been successfully written or otherwise added to the library and can now be tagged.
+
+
+
+
+ Invoked when a screenshot attempt failed.
+
+
+
+
+ Writes a screenshot to the user's screenshot library given the raw image data, which must be in RGB format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+
+
+
+
+ Adds a screenshot to the user's screenshot library from disk. If a thumbnail is provided, it must be 200 pixels wide and the same aspect ratio
+ as the screenshot, otherwise a thumbnail will be generated if the user uploads the screenshot. The screenshots must be in either JPEG or TGA format.
+ The return value is a handle that is valid for the duration of the game process and can be used to apply tags.
+ JPEG, TGA, and PNG formats are supported.
+
+
+
+
+ Causes the Steam overlay to take a screenshot.
+ If screenshots are being hooked by the game then a
+ callback is sent back to the game instead.
+
+
+
+
+ Toggles whether the overlay handles screenshots when the user presses the screenshot hotkey, or if the game handles them.
+
+ Hooking is disabled by default, and only ever enabled if you do so with this function.
+ If the hooking is enabled, then the callback will be sent if the user presses the hotkey or
+ when TriggerScreenshot is called, and then the game is expected to call or in response.
+
+
+
+
+
+ Provides the core of the Steam Game Servers API
+
+
+
+
+ Invoked when aser has been authed or rejected
+
+
+
+
+ Invoked when a connection to the Steam back-end has been established.
+ This means the server now is logged on and has a working connection to the Steam master server.
+
+
+
+
+ This will occur periodically if the Steam client is not connected, and has failed when retrying to establish a connection (result, stilltrying).
+
+
+
+
+ Invoked when the server is disconnected from Steam
+
+
+
+
+ Invoked when authentication status changes, useful for grabbing once availability is current.
+
+
+
+
+ Initialize the steam server.
+ If is you need to call manually every frame.
+
+
+
+
+ Run the callbacks. This is also called in Async callbacks.
+
+
+
+
+ Sets whether this should be marked as a dedicated server.
+ If not, it is assumed to be a listen server.
+
+
+
+
+ Gets or sets the current MaxPlayers.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current BotCount.
+ This doesn't enforce any kind of limit, it just updates the master server.
+
+
+
+
+ Gets or sets the current Map Name.
+
+
+
+
+ Gets or sets the current ModDir.
+
+
+
+
+ Gets the current product.
+
+
+
+
+ Gets or sets the current Product.
+
+
+
+
+ Gets or sets the current ServerName.
+
+
+
+
+ Set whether the server should report itself as passworded.
+
+
+
+
+ Gets or sets the current GameTags. This is a comma seperated list of tags for this server.
+ When querying the server list you can filter by these tags.
+
+
+
+
+ Gets the SteamId of the server.
+
+
+
+
+ Log onto Steam anonymously.
+
+
+
+
+ Log off of Steam.
+
+
+
+
+ Returns true if the server is connected and registered with the Steam master server
+ You should have called etc on startup.
+
+
+
+
+ To the best of its ability this tries to get the server's
+ current public IP address. Be aware that this is likely to return
+ for the first few seconds after initialization.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Enable or disable heartbeats, which are sent regularly to the master server.
+ Enabled by default.
+
+
+
+
+ Force send a heartbeat to the master server instead of waiting
+ for the next automatic update (if you've left them enabled)
+
+
+
+
+ Update this connected player's information. You should really call this
+ any time a player's name or score changes. This keeps the information shown
+ to server queries up to date.
+
+
+
+
+ Sets a Key Value. These can be anything you like, and are accessible
+ when querying servers from the server list.
+
+ Information describing gamemodes are common here.
+
+
+
+
+ Remove all key values.
+
+
+
+
+ Start authorizing a ticket. This user isn't authorized yet. Wait for a call to OnAuthChange.
+
+
+
+
+ Forget this guy. They're no longer in the game.
+
+
+
+
+ If true, Steam wants to send a packet. You should respond by sending
+ this packet in an unconnected way to the returned Address and Port.
+
+ Packet to send. The Data passed is pooled - so use it immediately.
+ True if we want to send a packet
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ We have received a server query on our game port. Pass it to Steam to handle.
+
+
+
+
+ Does the user own this app (which could be DLC).
+
+
+
+
+ Downloads stats for the user.
+ If the user has no stats, this will return .
+ These stats will only be auto-updated for clients playing on the server.
+
+ The SteamId of the user to get stats for.
+ A task describing the progress and result of the download.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Set the named stat for this user. Setting stats should follow the rules
+ you defined in Steamworks.
+
+ The SteamId of the user to set stats for.
+ The name of the stat.
+ The value of the stat.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ . You should have called for this SteamID - which downloads
+ the stats from the backend. If you didn't call it this will always return .
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Get the named stat for this user. If getting the stat failed, will return
+ defaultValue. You should have called Refresh for this userid - which downloads
+ the stats from the backend. If you didn't call it this will always return defaultValue.
+
+ The SteamId of the user to get stats for.
+ The name of the stat.
+ The value to return if the stats cannot be received.
+
+
+
+ Unlocks the specified achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to unlock the achievement for.
+ The ID of the achievement.
+
+
+
+ Resets the unlock status of an achievement for the specified user. Must have called on a SteamID first.
+ Remember to use after use.
+
+ The SteamId of the user to clear the achievement for.
+ The ID of the achievement.
+
+
+
+ Return if available, exists and unlocked
+
+
+
+
+ Once you've set a stat change on a user you need to commit your changes.
+ You can do that using this method. The callback will let you know if
+ your action succeeded, but most of the time you can fire and forget.
+
+ The SteamId of the user to store stats for.
+ A task describing the progress and result of the commit.
+
+
+
+ Sets a description for the current game state in the timeline. These help the user to find specific moments in the timeline when saving clips. Setting a
+ new state description replaces any previous description.
+
+
+
+
+ Clears the previous set game state in the timeline.
+
+
+
+
+ Use this to mark an event on the Timeline. This event will be instantaneous. (See to add events that happened over time.)
+
+
+
+
+ Use this to mark an event on the Timeline that takes some amount of time to complete.
+
+
+
+
+ Use this to mark the start of an event on the Timeline that takes some amount of time to complete. The duration of the event is determined by a matching call
+ to . If the game wants to cancel an event in progress, they can do that with a call to .
+
+
+
+
+ Use this to update the details of an event that was started with .
+
+
+
+
+ Use this to identify the end of an event that was started with .
+
+
+
+
+ Use this to remove a Timeline event that was previously added.
+
+
+
+
+ Use this to determine if video recordings exist for the specified event. This can be useful when the game needs to decide whether or not to show a control
+ that will call .
+
+
+
+
+ Use this to start a game phase. Game phases allow the user to navigate their background recordings and clips. Exactly what a game phase means will vary game
+ to game, but the game phase should be a section of gameplay that is usually between 10 minutes and a few hours in length, and should be the main way a user
+ would think to divide up the game. These are presented to the user in a UI that shows the date the game was played, with one row per game slice. Game phases
+ should be used to mark sections of gameplay that the user might be interested in watching.
+
+
+
+
+ Use this to end a game phase that was started with .
+
+
+
+
+ The phase ID is used to let the game identify which phase it is referring to in calls to or
+ . It may also be used to associated multiple phases with each other.
+
+ A game-provided persistent ID for a game phase. This could be a the match ID in a multiplayer game, a chapter name in a single player game, the ID of a character, etc.
+
+
+
+ Use this to determine if video recordings exist for the specified game phase. This can be useful when the game needs to decide whether or not to show a control that will call .
+
+
+
+
+ Use this to add a game phase tag. Phase tags represent data with a well defined set of options, which could be data such as match resolution, hero played, game mode, etc. Tags can have an icon
+ in addition to a text name. Multiple tags within the same group may be added per phase and all will be remembered. For example, this may be called multiple times for a "Bosses Defeated" group,
+ with different names and icons for each boss defeated during the phase, all of which will be shown to the user.
+
+
+
+
+ Use this to add a game phase attribute. Phase attributes represent generic text fields that can be updated throughout the duration of the phase. They are meant to be used for phase metadata
+ that is not part of a well defined set of options. For example, a KDA attribute that starts with the value "0/0/0" and updates as the phase progresses, or something like a played-entered character
+ name. Attributes can be set as many times as the game likes with SetGamePhaseAttribute, and only the last value will be shown to the user.
+
+
+
+
+ Changes the color of the timeline bar. See for how to use each value.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the game phase.
+
+
+
+
+ Opens the Steam overlay to the section of the timeline represented by the timeline event. This event must be in the current game session, since values are not
+ valid for future runs of the game.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked after an item is downloaded.
+
+
+
+
+ Invoked when a new item is subscribed.
+
+
+
+
+ Start downloading this item. You'll get notified of completion via .
+
+ The ID of the file to download.
+ If this should go straight to the top of the download list.
+ if nothing went wrong and the download is started.
+
+
+
+ Will attempt to download this item asyncronously - allowing you to instantly react to its installation.
+
+ The ID of the file you download.
+ An optional callback
+ Allows to send a message to cancel the download anywhere during the process.
+ How often to call the progress function.
+ if downloaded and installed properly.
+
+
+
+ Utility function to fetch a single item. Internally this uses Ugc.FileQuery -
+ which you can use to query multiple items if you need to.
+
+
+
+
+ Suspends all workshop downloads.
+ Downloads will be suspended until you resume them by calling or when the game ends.
+
+
+
+
+ Resumes all workshop downloads.
+
+
+
+
+ Show the app's latest Workshop EULA to the user in an overlay window, where they can accept it or not.
+
+
+
+
+ Retrieve information related to the user's acceptance or not of the app's specific Workshop EULA.
+
+
+
+
+ Functions for accessing and manipulating Steam user information.
+ This is also where the APIs for Steam Voice are exposed.
+
+
+
+
+ Invoked when a connections to the Steam back-end has been established.
+ This means the Steam client now has a working connection to the Steam servers.
+ Usually this will have occurred before the game has launched, and should only be seen if the
+ user has dropped connection due to a networking issue or a Steam server update.
+
+
+
+
+ Invoked when a connection attempt has failed.
+ This will occur periodically if the Steam client is not connected,
+ and has failed when retrying to establish a connection.
+
+
+
+
+ Invoked when the client has lost connection to the Steam servers.
+ Real-time services will be disabled until a matching OnSteamServersConnected has been posted.
+
+
+
+
+ Sent by the Steam server to the client telling it to disconnect from the specified game server,
+ which it may be in the process of or already connected to.
+ The game client should immediately disconnect upon receiving this message.
+ This can usually occur if the user doesn't have rights to play on the game server.
+
+
+
+
+ Invoked whenever the users licenses (owned packages) changes.
+
+
+
+
+ Invoked when an auth ticket has been validated.
+ The first parameter is the of this user
+ The second is the that owns the game, which will be different from the first
+ if the game is being borrowed via Steam Family Sharing.
+
+
+
+
+ Used internally for .
+
+
+
+
+ Used internally for .
+
+
+
+
+ Invoked when a user has responded to a microtransaction authorization request.
+ ( appid, orderid, user authorized )
+
+
+
+
+ Sent to your game in response to a steam://gamewebcallback/(appid)/command/stuff command from a user clicking a
+ link in the Steam overlay browser.
+ You can use this to add support for external site signups where you want to pop back into the browser after some web page
+ signup sequence, and optionally get back some detail about that.
+
+
+
+
+ Sent for games with enabled anti indulgence / duration control, for enabled users.
+ Lets the game know whether persistent rewards or XP should be granted at normal rate,
+ half rate, or zero rate.
+
+
+
+
+ Starts/Stops voice recording.
+ Once started, use GetAvailableVoice and GetVoice to get the data, and then call StopVoiceRecording
+ when the user has released their push-to-talk hotkey or the game session has completed.
+
+
+
+
+ Returns true if we have voice data waiting to be read.
+
+
+
+
+ Reads the voice data and returns the number of bytes written.
+ The compressed data can be transmitted by your application and decoded back into raw audio data using
+ DecompressVoice on the other side. The compressed data provided is in an arbitrary format and is not meant to be played directly.
+ This should be called once per frame, and at worst no more than four times a second to keep the microphone input delay as low as
+ possible. Calling this any less may result in gaps in the returned stream.
+
+
+
+
+ Reads the voice data and returns the bytes. You should obviously ideally be using
+ ReadVoiceData because it won't be creating a new byte array every call. But this
+ makes it easier to get it working, so let the babies have their bottle.
+
+
+
+
+ Decodes the compressed voice data returned by GetVoice.
+ The output data is raw single-channel 16-bit PCM audio.The decoder supports any sample rate from 11025 to 48000.
+
+
+
+
+ Lazy version
+
+
+
+
+ Advanced and potentially fastest version - incase you know what you're doing
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Retrieve an authentication ticket to be sent to the entity who wishes to authenticate you.
+
+
+
+
+ Retrieve a authentication ticket to be sent to the entity who wishes to authenticate you.
+ This waits for a positive response from the backend before returning the ticket. This means
+ the ticket is definitely ready to go as soon as it returns. Will return if the callback
+ times out or returns negatively.
+
+
+
+
+ Checks if the current users looks like they are behind a NAT device.
+ This is only valid if the user is connected to the Steam servers and may not catch all forms of NAT.
+
+
+
+
+ Gets the Steam level of the user, as shown on their Steam community profile.
+
+
+
+
+ Requests a URL which authenticates an in-game browser for store check-out, and then redirects to the specified URL.
+ As long as the in-game browser accepts and handles session cookies, Steam microtransaction checkout pages will automatically recognize the user instead of presenting a login page.
+ NOTE: The URL has a very short lifetime to prevent history-snooping attacks, so you should only call this API when you are about to launch the browser, or else immediately navigate to the result URL using a hidden browser window.
+ NOTE: The resulting authorization cookie has an expiration time of one day, so it would be a good idea to request and visit a new auth URL every 12 hours.
+
+
+
+
+ Checks whether the current user has verified their phone number.
+
+
+
+
+ Checks whether the current user has Steam Guard two factor authentication enabled on their account.
+
+
+
+
+ Checks whether the user's phone number is used to uniquely identify them.
+
+
+
+
+ Checks whether the current user's phone number is awaiting (re)verification.
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ If you get a null result from this it's probably because you're calling it too often.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Requests an application ticket encrypted with the secret "encrypted app ticket key".
+ The encryption key can be obtained from the Encrypted App Ticket Key page on the App Admin for your app.
+ There can only be one call pending, and this call is subject to a 60 second rate limit.
+ This can fail if you don't have an encrypted ticket set for your app here https://partner.steamgames.com/apps/sdkauth/
+
+
+
+
+ Get anti indulgence / duration control
+
+
+
+
+ Invoked when an achivement icon is loaded.
+
+
+
+
+ Invoked when the latests stats and achievements have been received
+ from the server.
+
+
+
+
+ Result of a request to store the user stats for a game.
+
+
+
+
+ Result of a request to store the achievements for a game, or an
+ "indicate progress" call. If both m_nCurProgress and m_nMaxProgress
+ are zero, that means the achievement has been fully unlocked.
+
+
+
+
+ Callback indicating that a user's stats have been unloaded
+
+
+
+
+ Get all available achievements.
+
+
+
+
+ Show the user a pop-up notification with the current progress toward an achievement.
+ Will return false if RequestCurrentStats has not completed and successfully returned
+ its callback, if the achievement doesn't exist/has unpublished changes in the app's
+ Steamworks Admin page, or if the achievement is unlocked.
+
+
+
+
+ Tries to get the number of players currently playing this game.
+ Or -1 if failed.
+
+
+
+
+ Send the changed stats and achievements data to the server for permanent storage.
+ If this fails then nothing is sent to the server. It's advisable to keep trying until the call is successful.
+ This call can be rate limited. Call frequency should be on the order of minutes, rather than seconds.You should only be calling this during major state changes such as the end of a round, the map changing, or the user leaving a server. This call is required to display the achievement unlock notification dialog though, so if you have called SetAchievement then it's advisable to call this soon after that.
+ If you have stats or achievements that you have saved locally but haven't uploaded with this function when your application process ends then this function will automatically be called.
+ You can find additional debug information written to the %steam_install%\logs\stats_log.txt file.
+ This function returns true upon success if :
+ RequestCurrentStats has completed and successfully returned its callback AND
+ the current game has stats associated with it in the Steamworks Partner backend, and those stats are published.
+
+
+
+
+ This call is no longer required as it is managed by the Steam client. The game stats and achievements
+ will be synchronized with Steam before the game process begins.
+
+
+
+
+ Asynchronously fetches global stats data, which is available for stats marked as
+ "aggregated" in the App Admin panel of the Steamworks website.
+ You must have called and it needs to return successfully via
+ its callback prior to calling this.
+
+ How many days of day-by-day history to retrieve in addition to the overall totals. The limit is 60.
+ indicates success, means you need to call first, means the remote call failed
+
+
+
+ Gets a leaderboard by name, it will create it if it's not yet created.
+ Leaderboards created with this function will not automatically show up in the Steam Community.
+ You must manually set the Community Name field in the App Admin panel of the Steamworks website.
+ As such it's generally recommended to prefer creating the leaderboards in the App Admin panel on
+ the Steamworks website and using FindLeaderboard unless you're expected to have a large amount of
+ dynamically created leaderboards.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Adds this amount to the named stat. Internally this calls Get() and adds
+ to that value. Steam doesn't provide a mechanism for atomically increasing
+ stats like this, this functionality is added here as a convenience.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Set a stat value. This will automatically call after a successful call.
+
+
+
+
+ Get an stat value.
+
+
+
+
+ Get a stat value.
+
+
+
+
+ Practically wipes the slate clean for this user. If is , will also wipe
+ any achievements too.
+
+
+
+
+
+ Interface which provides access to a range of miscellaneous utility functions
+
+
+
+
+ Invoked when the country of the user changed.
+
+
+
+
+ Invoked when running on a laptop and less than 10 minutes of battery is left, fires then every minute.
+ The parameter is the number of minutes left.
+
+
+
+
+ Invoked when Steam wants to shutdown.
+
+
+
+
+ Invoked when Big Picture gamepad text input has been closed. Parameter is if text was submitted, if cancelled etc.
+
+
+
+
+ Returns the number of seconds since the application was active.
+
+
+
+
+ Returns the number of seconds since the user last moved the mouse and/or provided other input.
+
+
+
+
+ Steam server time. Number of seconds since January 1, 1970, GMT (i.e unix time)
+
+
+
+
+ returns the 2 digit ISO 3166-1-alpha-2 format country code this client is running in (as looked up via an IP-to-location database)
+ e.g "US" or "UK".
+
+
+
+
+ Returns true if the image exists, and the buffer was successfully filled out.
+ Results are returned in RGBA format.
+ The destination buffer size should be 4 * height * width * sizeof(char).
+
+
+
+
+ returns the image in RGBA format.
+
+
+
+
+ Returns true if we're using a battery (ie, a laptop not plugged in).
+
+
+
+
+ Returns battery power [0-1].
+
+
+
+
+ Sets the position where the overlay instance for the currently calling game should show notifications.
+ This position is per-game and if this function is called from outside of a game context it will do nothing.
+
+
+
+
+ Returns true if the overlay is running and the user can access it. The overlay process could take a few seconds to
+ start and hook the game process, so this function will initially return false while the overlay is loading.
+
+
+
+
+ Normally this call is unneeded if your game has a constantly running frame loop that calls the
+ D3D Present API, or OGL SwapBuffers API every frame.
+
+ However, if you have a game that only refreshes the screen on an event driven basis then that can break
+ the overlay, as it uses your Present/SwapBuffers calls to drive it's internal frame loop and it may also
+ need to Present() to the screen any time an even needing a notification happens or when the overlay is
+ brought up over the game by a user. You can use this API to ask the overlay if it currently need a present
+ in that case, and then you can check for this periodically (roughly 33hz is desirable) and make sure you
+ refresh the screen with Present or SwapBuffers to allow the overlay to do it's work.
+
+
+
+
+ Asynchronous call to check if an executable file has been signed using the public key set on the signing tab
+ of the partner site, for example to refuse to load modified executable files.
+
+
+
+
+ Activates the Big Picture text input dialog which only supports gamepad input.
+
+
+
+
+ Returns previously entered text.
+
+
+
+
+ Returns the language the steam client is running in. You probably want
+ instead, this is for very special usage cases.
+
+
+
+
+ Returns if Steam itself is running in VR mode.
+
+
+
+
+ Sets the inset of the overlay notification from the corner specified by SetOverlayNotificationPosition.
+
+
+
+
+ returns if Steam and the Steam Overlay are running in Big Picture mode
+ Games much be launched through the Steam client to enable the Big Picture overlay. During development,
+ a game can be added as a non-steam game to the developers library to test this feature.
+
+
+
+
+ Ask Steam UI to create and render its OpenVR dashboard.
+
+
+
+
+ Gets or sets whether the HMD content will be streamed via Steam In-Home Streaming.
+
+ If this is set to , then the scene in the HMD headset will be streamed, and remote input will not be allowed.
+ If this is set to , then the application window will be streamed instead, and remote input will be allowed.
+ The default is unless "VRHeadsetStreaming" "0" is in the extended app info for a game
+ (this is useful for games that have asymmetric multiplayer gameplay).
+
+
+
+
+
+ Gets whether this steam client is a Steam China specific client (), or the global client ().
+
+
+
+
+ Initializes text filtering, loading dictionaries for the language the game is running in.
+ Users can customize the text filter behavior in their Steam Account preferences.
+
+
+
+
+ Filters the provided input message and places the filtered result into pchOutFilteredText,
+ using legally required filtering and additional filtering based on the context and user settings.
+
+
+
+
+ Gets whether or not Steam itself is running on the Steam Deck.
+
+
+
+
+ In game launchers that don't have controller support: You can call this to have
+ Steam Input translate the controller input into mouse/kb to navigate the launcher
+
+
+
+
+ Class for utilizing the Steam Video API.
+
+
+
+
+ Return if currently using Steam's live broadcasting
+
+
+
+
+ Returns the number of viewers that are watching the stream, or 0 if is .
+
+
+
+
+ Represents the ID of a Steam application.
+
+
+
+
+ Is the clan an official game group?
+
+
+
+
+ Asynchronously fetches the officer list for a given clan
+
+ Whether the request was successful or not
+
+
+
+ Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
+ This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
+ our state loops, instead of trying to place it in all of your state transitions.
+
+
+
+
+ Returns the current state of the supplied digital game action
+
+
+
+
+ Returns the current state of these supplied analog game action
+
+
+
+
+ Returns true if this is the local user
+
+
+
+
+ Return true if this is a friend
+
+
+
+
+ Returns true if you have this user blocked
+
+
+
+
+ Return true if this user is playing the game we're running
+
+
+
+
+ Returns true if this friend is online
+
+
+
+
+ Sometimes we don't know the user's name. This will wait until we have
+ downloaded the information on this user.
+
+
+
+
+ Returns true if this friend is marked as away
+
+
+
+
+ Returns true if this friend is marked as busy
+
+
+
+
+ Returns true if this friend is marked as snoozing
+
+
+
+
+ Returns the player's current Steam name.
+
+ Steam returns nicknames here if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the nickname that was set for this Steam player, if any.
+
+ Steam will never return nicknames if "Append nicknames to friends' names" is disabled in the Steam client.
+
+
+
+
+
+ Returns the player's Steam name history.
+
+
+
+
+ Invite this friend to the game that we are playing
+
+
+
+
+ Sends a message to a Steam friend. Returns true if success
+
+
+
+
+ Tries to get download the latest user stats
+
+ True if successful, False if failure
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user stat. Must call RequestUserStats first.
+
+ The name of the stat you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a user achievement state. Must call RequestUserStats first.
+
+ The name of the achievement you want to get
+ Will return this value if not available
+ The value, or defult if not available
+
+
+
+ Gets a the time this achievement was unlocked.
+
+ The name of the achievement you want to get
+ The time unlocked. If it wasn't unlocked, or you haven't downloaded the stats yet - will return DateTime.MinValue
+
+
+
+ Shortcut to call GetProperty( "name" )
+
+
+
+
+ Shortcut to call GetProperty( "description" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url" )
+
+
+
+
+ Shortcut to call GetProperty( "icon_url_large" )
+
+
+
+
+ Shortcut to call GetProperty( "price_category" )
+
+
+
+
+ Shortcut to call GetProperty( "type" )
+
+
+
+
+ Returns true if this is an item that generates an item, rather
+ than something that is actual an item
+
+
+
+
+ Shortcut to call GetProperty( "exchange" )
+
+
+
+
+ Get a list of exchanges that are available to make this item
+
+
+
+
+ Shortcut to call GetBoolProperty( "marketable" )
+
+
+
+
+ Shortcut to call GetBoolProperty( "tradable" )
+
+
+
+
+ Gets the property timestamp
+
+
+
+
+ Gets the property modified
+
+
+
+
+ Get a specific property by name
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Read a raw property from the definition schema
+
+
+
+
+ Gets a list of all properties on this item
+
+
+
+
+ Returns the price of this item in the local currency (SteamInventory.Currency)
+
+
+
+
+ If the price has been discounted, LocalPrice will differ from LocalBasePrice
+ (assumed, this isn't documented)
+
+
+
+
+ Return a list of recepies that contain this item
+
+
+
+
+ Only available if the result set was created with the getproperties
+
+
+
+
+ This item is account-locked and cannot be traded or given away.
+ This is an item status flag which is permanently attached to specific item instances
+
+
+
+
+ The item has been destroyed, traded away, expired, or otherwise invalidated.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ The item quantity has been decreased by 1 via ConsumeItem API.
+ This is an action confirmation flag which is only set one time, as part of a result set.
+
+
+
+
+ Consumes items from a user's inventory. If the quantity of the given item goes to zero, it is permanently removed.
+ Once an item is removed it cannot be recovered.This is not for the faint of heart - if your game implements item removal at all,
+ a high-friction UI confirmation process is highly recommended.ConsumeItem can be restricted to certain item definitions or fully
+ blocked via the Steamworks website to minimize support/abuse issues such as the classic "my brother borrowed my laptop and deleted all of my rare items".
+
+
+
+
+ Split stack into two items
+
+
+
+
+ Add x units of the target item to this item
+
+
+
+
+ Will try to return the date that this item was aquired. You need to have for the items
+ with their properties for this to work.
+
+
+
+
+ Tries to get the origin property. Need properties for this to work.
+ Will return a string like "market"
+
+
+
+
+ Small utility class to describe an item with a quantity
+
+
+
+
+ A structured description of an item exchange
+
+
+
+
+ The definition ID of the ingredient.
+
+
+
+
+ If we don't know about this item definition this might be null.
+ In which case, DefinitionId should still hold the correct id.
+
+
+
+
+ The amount of this item needed. Generally this will be 1.
+
+
+
+
+ The item that this will create.
+
+
+
+
+ The items, with quantity required to create this item.
+
+
+
+
+ Checks whether an inventory result handle belongs to the specified Steam ID.
+ This is important when using Deserialize, to verify that a remote player is not pretending to have a different user's inventory
+
+
+
+
+ Serialized result sets contain a short signature which can't be forged or replayed across different game sessions.
+ A result set can be serialized on the local client, transmitted to other players via your game networking, and
+ deserialized by the remote players.This is a secure way of preventing hackers from lying about posessing
+ rare/high-value items. Serializes a result set with signature bytes to an output buffer.The size of a serialized
+ result depends on the number items which are being serialized.When securely transmitting items to other players,
+ it is recommended to use GetItemsByID first to create a minimal result set.
+ Results have a built-in timestamp which will be considered "expired" after an hour has elapsed.See DeserializeResult
+ for expiration handling.
+
+
+
+
+ Gets the owner of the beacon.
+
+
+
+
+ Gets metadata related to the beacon.
+
+
+
+
+ Will attempt to join the party. If successful will return a connection string.
+ If failed, will return
+
+
+
+
+ When a user follows your beacon, Steam will reserve one of the open party slots for them, and send your game a ReservationNotification callback.
+ When that user joins your party, call this method to notify Steam that the user has joined successfully.
+
+
+
+
+ To cancel a reservation (due to timeout or user input), call this.
+ Steam will open a new reservation slot.
+ Note: The user may already be in-flight to your game, so it's possible they will still connect and try to join your party.
+
+
+
+
+ Turn off the beacon.
+
+
+
+
+ Used to set up the server.
+ The variables in here are all required to be set, and can't be changed once the server is created.
+
+
+
+
+ The version string is usually in the form x.x.x.x, and is used by the master server to detect when the server is out of date.
+ If you go into the dedicated server tab on steamworks you'll be able to server the latest version. If this version number is
+ less than that latest version then your server won't show.
+
+
+
+
+ This should be the same directory game where gets installed into. Just the folder name, not the whole path. I.e. "Rust", "Garrysmod".
+
+
+
+
+ The game description. Setting this to the full name of your game is recommended.
+
+
+
+
+ Is a dedicated server
+
+
+
+
+ If you pass MASTERSERVERUPDATERPORT_USEGAMESOCKETSHARE into usQueryPort, then it causes the game server API to use
+ "GameSocketShare" mode, which means that the game is responsible for sending and receiving UDP packets for the master
+ server updater.
+
+ More info about this here: https://partner.steamgames.com/doc/api/ISteamGameServer#HandleIncomingPacket
+
+
+
+
+ Represents the ID of a user or steam lobby.
+
+
+
+
+ Create a Normal Workshop item that can be subscribed to
+
+
+
+
+ Create a Collection
+ Add items using Item.AddDependency()
+
+
+
+
+ Workshop item that is meant to be voted on for the purpose of selling in-game
+
+
+
+
+ Workshop item that is meant to be managed by the game. It is queryable by the API, but isn't visible on the web browser.
+
+
+
+
+ Adds a key-value tag pair to an item.
+ Keys can map to multiple different values (1-to-many relationship).
+ Key names are restricted to alpha-numeric characters and the '_' character.
+ Both keys and values cannot exceed 255 characters in length. Key-value tags are searchable by exact match only.
+ To replace all values associated to one key use RemoveKeyValueTags then AddKeyValueTag.
+
+
+
+
+ Removes a key and all values associated to it.
+ You can remove up to 100 keys per item update.
+ If you need remove more tags than that you'll need to make subsequent item updates.
+
+
+
+
+ https://partner.steamgames.com/doc/features/workshop/implementation#Legal
+
+
+
+
+ The actual ID of this file
+
+
+
+
+ The given title of this item
+
+
+
+
+ The description of this item, in your local language if available
+
+
+
+
+ A list of tags for this item, all lowercase
+
+
+
+
+ A dictionary of key value tags for this item, only available from queries WithKeyValueTags(true)
+
+
+
+
+ App Id of the app that created this item
+
+
+
+
+ App Id of the app that will consume this item.
+
+
+
+
+ User who created this content
+
+
+
+
+ The bayesian average for up votes / total votes, between [0,1]
+
+
+
+
+ Time when the published item was created
+
+
+
+
+ Time when the published item was last updated
+
+
+
+
+ True if this is publically visible
+
+
+
+
+ True if this item is only visible by friends of the creator
+
+
+
+
+ True if this is only visible to the creator
+
+
+
+
+ True if this item has been banned
+
+
+
+
+ Whether the developer of this app has specifically flagged this item as accepted in the Workshop
+
+
+
+
+ The number of upvotes of this item
+
+
+
+
+ The number of downvotes of this item
+
+
+
+
+ Dependencies/children of this item or collection, available only from WithDependencies(true) queries
+
+
+
+
+ Additional previews of this item or collection, available only from WithAdditionalPreviews(true) queries
+
+
+
+
+ Start downloading this item.
+ If this returns false the item isn't getting downloaded.
+
+
+
+
+ If we're downloading, how big the total download is
+
+
+
+
+ If we're downloading, how much we've downloaded
+
+
+
+
+ If we're installed, how big is the install
+
+
+
+
+ If we're downloading our current progress as a delta betwen 0-1
+
+
+
+
+ A case insensitive check for tag
+
+
+
+
+ Allows the user to subscribe to this item
+
+
+
+
+ Allows the user to subscribe to download this item asyncronously
+ If CancellationToken is default then there is 60 seconds timeout
+ Progress will be set to 0-1
+
+
+
+
+ Allows the user to unsubscribe from this item
+
+
+
+
+ Adds item to user favorite list
+
+
+
+
+ Removes item from user favorite list
+
+
+
+
+ Allows the user to rate a workshop item up or down.
+
+
+
+
+ Gets the current users vote on the item
+
+
+
+
+ Return a URL to view this item online
+
+
+
+
+ The URl to view this item's changelog
+
+
+
+
+ The URL to view the comments on this item
+
+
+
+
+ The URL to discuss this item
+
+
+
+
+ The URL to view this items stats online
+
+
+
+
+ The URL to the preview image for this item
+
+
+
+
+ The metadata string for this item, only available from queries WithMetadata(true)
+
+
+
+
+ Edit this item
+
+
+
+
+ Found items must have at least one of the defined tags
+
+
+
+
+ Found items must have all defined tags
+
+
+
+
+ Set to false to disable, by default following stats are loaded: NumSubscriptions, NumFavorites, NumFollowers, NumUniqueSubscriptions, NumUniqueFavorites, NumUniqueFollowers, NumUniqueWebsiteViews, ReportScore, NumSecondsPlayed, NumPlaytimeSessions, NumComments, NumSecondsPlayedDuringTimePeriod, NumPlaytimeSessionsDuringTimePeriod
+
+
+
+
+ Returns the current Unix Epoch
+
+
+
+
+ Convert an epoch to a datetime
+
+
+
+
+ Convert a DateTime to a unix time
+
+
+
+
+ Returns a buffer. This will get returned and reused later on.
+ We shouldn't really be using this anymore.
+
+
+
+
+ Prevent unity from stripping shit we depend on
+ https://docs.unity3d.com/Manual/ManagedCodeStripping.html
+
+
+
+
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml.meta
new file mode 100644
index 0000000..b1d23a9
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/Facepunch.Steamworks.Win64.xml.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: b5ee9bc6d97dfeda28a3a069b47a3c92
+TextScriptImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll
new file mode 100644
index 0000000..a05e445
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll.meta
new file mode 100644
index 0000000..1dbafbf
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: e1f5baa89e22b2954a9d63e969ccbfaa
\ No newline at end of file
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll
new file mode 100644
index 0000000..0224579
Binary files /dev/null and b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll differ
diff --git a/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll.meta b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll.meta
new file mode 100644
index 0000000..d1f2c6e
--- /dev/null
+++ b/Assets/Packages/Facepunch.Steamworks.2.5.2/Debug/netstandard2.1/steam_api64.dll.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 875287a74bc744a71a37592595a9e762
\ No newline at end of file
diff --git a/Assets/Packages/Microsoft.Bcl.AsyncInterfaces.6.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml b/Assets/Packages/Microsoft.Bcl.AsyncInterfaces.6.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml
index 5fd48a2..344b618 100644
--- a/Assets/Packages/Microsoft.Bcl.AsyncInterfaces.6.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml
+++ b/Assets/Packages/Microsoft.Bcl.AsyncInterfaces.6.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.xml
@@ -1,8 +1,9 @@
+
-
- Microsoft.Bcl.AsyncInterfaces
-
-
-
-
+
+ Microsoft.Bcl.AsyncInterfaces
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Packages/Microsoft.Bcl.TimeProvider.8.0.0/lib/netstandard2.0/Microsoft.Bcl.TimeProvider.xml b/Assets/Packages/Microsoft.Bcl.TimeProvider.8.0.0/lib/netstandard2.0/Microsoft.Bcl.TimeProvider.xml
index acba473..ec163d0 100644
--- a/Assets/Packages/Microsoft.Bcl.TimeProvider.8.0.0/lib/netstandard2.0/Microsoft.Bcl.TimeProvider.xml
+++ b/Assets/Packages/Microsoft.Bcl.TimeProvider.8.0.0/lib/netstandard2.0/Microsoft.Bcl.TimeProvider.xml
@@ -1,415 +1,520 @@
+
-
- Microsoft.Bcl.TimeProvider
-
-
-
- Provides an abstraction for time.
-
-
-
- Gets a that provides a clock based on ,
- a time zone based on , a high-performance time stamp based on ,
- and a timer based on .
-
-
- If the changes after the object is returned, the change will be reflected in any subsequent operations that retrieve .
-
-
-
-
- Initializes the .
-
-
-
-
- Gets a value whose date and time are set to the current
- Coordinated Universal Time (UTC) date and time and whose offset is Zero,
- all according to this 's notion of time.
-
-
- The default implementation returns .
-
-
-
-
- Gets a value that is set to the current date and time according to this 's
- notion of time based on , with the offset set to the 's offset from Coordinated Universal Time (UTC).
-
-
-
-
- Gets a object that represents the local time zone according to this 's notion of time.
-
-
- The default implementation returns .
-
-
-
-
- Gets the frequency of of high-frequency value per second.
-
-
- The default implementation returns . For a given TimeProvider instance, the value must be idempotent and remain unchanged.
-
-
-
-
- Gets the current high-frequency value designed to measure small time intervals with high accuracy in the timer mechanism.
-
- A long integer representing the high-frequency counter value of the underlying timer mechanism.
-
- The default implementation returns .
-
-
-
-
- Gets the elapsed time between two timestamps retrieved using .
-
- The timestamp marking the beginning of the time period.
- The timestamp marking the end of the time period.
- A for the elapsed time between the starting and ending timestamps.
-
-
-
- Gets the elapsed time since the value retrieved using .
-
- The timestamp marking the beginning of the time period.
- A for the elapsed time between the starting timestamp and the time of this call./>
-
-
- Creates a new instance, using values to measure time intervals.
-
- A delegate representing a method to be executed when the timer fires. The method specified for callback should be reentrant,
- as it may be invoked simultaneously on two threads if the timer fires again before or while a previous callback is still being handled.
-
- An object to be passed to the . This may be null.
- The amount of time to delay before is invoked. Specify to prevent the timer from starting. Specify to start the timer immediately.
- The time interval between invocations of . Specify to disable periodic signaling.
-
- The newly created instance.
-
- is null.
- The number of milliseconds in the value of or is negative and not equal to , or is greater than .
-
-
- The delegate specified by the callback parameter is invoked once after elapses, and thereafter each time the time interval elapses.
-
-
- If is zero, the callback is invoked immediately. If is -1 milliseconds, is not invoked; the timer is disabled,
- but can be re-enabled by calling the method.
-
-
- If is 0 or -1 milliseconds and is positive, is invoked once; the periodic behavior of the timer is disabled,
- but can be re-enabled using the method.
-
-
- The return instance will be implicitly rooted while the timer is still scheduled.
-
-
- captures the and stores that with the for use in invoking
- each time it's called. That capture can be suppressed with .
-
-
-
-
- Thin wrapper for a .
-
- We don't return a TimerQueueTimer directly as it implements IThreadPoolWorkItem and we don't
- want it exposed in a way that user code could directly queue the timer to the thread pool.
- We also use this instead of Timer because CreateTimer needs to return a timer that's implicitly
- rooted while scheduled.
-
-
-
-
- Used to create a instance returned from and uses the default implementation
- provided by which uses , , , and .
-
-
-
- Initializes the instance.
-
-
- Represents a timer that can have its due time and period changed.
-
- Implementations of , , and
- must all be thread-safe such that the timer instance may be accessed concurrently from multiple threads.
-
-
-
- Changes the start time and the interval between method invocations for a timer, using values to measure time intervals.
-
- A representing the amount of time to delay before invoking the callback method specified when the was constructed.
- Specify to prevent the timer from restarting. Specify to restart the timer immediately.
-
-
- The time interval between invocations of the callback method specified when the Timer was constructed.
- Specify to disable periodic signaling.
-
- if the timer was successfully updated; otherwise, .
- The or parameter, in milliseconds, is less than -1 or greater than 4294967294.
-
- It is the responsibility of the implementer of the ITimer interface to ensure thread safety.
-
-
-
-
- Provide extensions methods for operations with .
-
-
- The Microsoft.Bcl.TimeProvider library interfaces are intended solely for use in building against pre-.NET 8 surface area.
- If your code is being built against .NET 8 or higher, then this library should not be utilized.
-
-
-
- Creates a task that completes after a specified time interval.
- The with which to interpret .
- The to wait before completing the returned task, or to wait indefinitely.
- A cancellation token to observe while waiting for the task to complete.
- A task that represents the time delay.
- The argument is null.
- represents a negative time interval other than .
-
-
-
- Gets a that will complete when this completes, when the specified timeout expires, or when the specified has cancellation requested.
-
- The task for which to wait on until completion.
- The timeout after which the should be faulted with a if it hasn't otherwise completed.
- The with which to interpret .
- The to monitor for a cancellation request.
- The representing the asynchronous wait. It may or may not be the same instance as the current instance.
- The argument is null.
- The argument is null.
- represents a negative time interval other than .
-
-
-
- Gets a that will complete when this completes, when the specified timeout expires, or when the specified has cancellation requested.
-
- The task for which to wait on until completion.
- The timeout after which the should be faulted with a if it hasn't otherwise completed.
- The with which to interpret .
- The to monitor for a cancellation request.
- The representing the asynchronous wait. It may or may not be the same instance as the current instance.
- The argument is null.
- The argument is null.
- represents a negative time interval other than .
-
-
- Initializes a new instance of the class that will be canceled after the specified .
- The with which to interpret the .
- The time interval to wait before canceling this .
- The is negative and not equal to or greater than maximum allowed timer duration.
- that will be canceled after the specified .
-
-
- The countdown for the delay starts during the call to the constructor. When the delay expires,
- the constructed is canceled if it has
- not been canceled already.
-
-
- If running on .NET versions earlier than .NET 8.0, there is a constraint when invoking on the resultant object.
- This action will not terminate the initial timer indicated by . However, this restriction does not apply on .NET 8.0 and later versions.
-
-
-
-
- '{0}' must be a non-negative and non-zero value.
-
-
- '{0}' must be greater than or equal to '{1}'.
-
-
- '{0}' must be less than or equal to '{1}'.
-
-
- The operation cannot be performed when TimeProvider.LocalTimeZone is null.
-
-
- The operation cannot be performed when TimeProvider.TimestampFrequency is zero or negative.
-
-
-
- Attribute used to indicate a source generator should create a function for marshalling
- arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
-
-
- This attribute is meaningless if the source generator associated with it is not enabled.
- The current built-in source generator only supports C# and only supplies an implementation when
- applied to static, partial, non-generic methods.
-
-
-
-
- Initializes a new instance of the .
-
- Name of the library containing the import.
-
-
-
- Gets the name of the library containing the import.
-
-
-
-
- Gets or sets the name of the entry point to be called.
-
-
-
-
- Gets or sets how to marshal string arguments to the method.
-
-
- If this field is set to a value other than ,
- must not be specified.
-
-
-
-
- Gets or sets the used to control how string arguments to the method are marshalled.
-
-
- If this field is specified, must not be specified
- or must be set to .
-
-
-
-
- Gets or sets whether the callee sets an error (SetLastError on Windows or errno
- on other platforms) before returning from the attributed method.
-
-
-
-
- Specifies how strings should be marshalled for generated p/invokes
-
-
-
-
- Indicates the user is suppling a specific marshaller in .
-
-
-
-
- Use the platform-provided UTF-8 marshaller.
-
-
-
-
- Use the platform-provided UTF-16 marshaller.
-
-
-
- Specifies that null is allowed as an input even if the corresponding type disallows it.
-
-
- Specifies that null is disallowed as an input even if the corresponding type allows it.
-
-
- Specifies that an output may be null even if the corresponding type disallows it.
-
-
- Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
-
-
- Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it.
-
-
- Initializes the attribute with the specified return value condition.
-
- The return value condition. If the method returns this value, the associated parameter may be null.
-
-
-
- Gets the return value condition.
-
-
- Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it.
-
-
- Initializes the attribute with the specified return value condition.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
-
- Gets the return value condition.
-
-
- Specifies that the output will be non-null if the named parameter is non-null.
-
-
- Initializes the attribute with the associated parameter name.
-
- The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
-
-
-
- Gets the associated parameter name.
-
-
- Applied to a method that will never return under any circumstance.
-
-
- Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
-
-
- Initializes the attribute with the specified parameter value.
-
- The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
- the associated parameter matches this value.
-
-
-
- Gets the condition parameter value.
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values.
-
-
- Initializes the attribute with a field or property member.
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the list of field and property members.
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets field or property member names.
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
-
-
- Initializes the attribute with the specified return value condition and a field or property member.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the specified return value condition and list of field and property members.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
-
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets the return value condition.
-
-
- Gets field or property member names.
-
-
-
+
+ Microsoft.Bcl.TimeProvider
+
+
+
+ Provides an abstraction for time.
+
+
+
+ Gets a that provides a clock based on
+ ,
+ a time zone based on , a high-performance time stamp based on
+ ,
+ and a timer based on .
+
+
+ If the changes after the object is returned, the change will be reflected in any subsequent operations that retrieve
+ .
+
+
+
+
+ Initializes the .
+
+
+
+
+ Gets a value whose date and time are set to the current
+ Coordinated Universal Time (UTC) date and time and whose offset is Zero,
+ all according to this 's notion of time.
+
+
+ The default implementation returns .
+
+
+
+
+ Gets a value that is set to the current date and time according to this
+ 's
+ notion of time based on , with the offset set to the
+ 's offset from Coordinated Universal Time (UTC).
+
+
+
+
+ Gets a object that represents the local time zone according to this
+ 's notion of time.
+
+
+ The default implementation returns .
+
+
+
+
+ Gets the frequency of of high-frequency value per second.
+
+
+ The default implementation returns . For a given TimeProvider instance, the value must be idempotent and remain unchanged.
+
+
+
+
+ Gets the current high-frequency value designed to measure small time intervals with high accuracy in the timer mechanism.
+
+ A long integer representing the high-frequency counter value of the underlying timer mechanism.
+
+ The default implementation returns .
+
+
+
+
+ Gets the elapsed time between two timestamps retrieved using .
+
+ The timestamp marking the beginning of the time period.
+ The timestamp marking the end of the time period.
+ A for the elapsed time between the starting and ending timestamps.
+
+
+
+ Gets the elapsed time since the value retrieved using
+ .
+
+ The timestamp marking the beginning of the time period.
+ A for the elapsed time between the starting timestamp and the time of this call./>
+
+
+
+ Creates a new instance, using
+ values to measure time intervals.
+
+
+ A delegate representing a method to be executed when the timer fires. The method specified for callback should be reentrant,
+ as it may be invoked simultaneously on two threads if the timer fires again before or while a previous callback is still being handled.
+
+ An object to be passed to the . This may be null.
+
+ The amount of time to delay before is invoked. Specify
+ to prevent the timer from starting. Specify
+ to start the timer immediately.
+
+
+ The time interval between invocations of . Specify
+ to disable periodic signaling.
+
+
+ The newly created instance.
+
+ is null.
+
+ The number of milliseconds in the value of
+ or is negative and not equal to
+ , or is greater than .
+
+
+
+ The delegate specified by the callback parameter is invoked once after elapses, and thereafter each time the
+ time interval elapses.
+
+
+ If is zero, the callback is invoked immediately. If
+ is -1 milliseconds, is not invoked; the timer is disabled,
+ but can be re-enabled by calling the
+ method.
+
+
+ If is 0 or -1 milliseconds and is positive,
+ is invoked once; the periodic behavior of the timer is disabled,
+ but can be re-enabled using the
+ method.
+
+
+ The return instance will be implicitly rooted while the timer is still scheduled.
+
+
+
+ captures the and stores that with the
+ for use in invoking
+ each time it's called. That capture can be suppressed with
+ .
+
+
+
+
+ Thin wrapper for a .
+
+ We don't return a TimerQueueTimer directly as it implements IThreadPoolWorkItem and we don't
+ want it exposed in a way that user code could directly queue the timer to the thread pool.
+ We also use this instead of Timer because CreateTimer needs to return a timer that's implicitly
+ rooted while scheduled.
+
+
+
+
+ Used to create a instance returned from
+ and uses the default implementation
+ provided by which uses ,
+ , , and
+ .
+
+
+
+ Initializes the instance.
+
+
+ Represents a timer that can have its due time and period changed.
+
+ Implementations of ,
+ , and
+ must all be thread-safe such that the timer instance may be accessed concurrently from multiple threads.
+
+
+
+
+ Changes the start time and the interval between method invocations for a timer, using
+ values to measure time intervals.
+
+
+ A representing the amount of time to delay before invoking the callback method specified when the
+ was constructed.
+ Specify to prevent the timer from restarting. Specify
+ to restart the timer immediately.
+
+
+ The time interval between invocations of the callback method specified when the Timer was constructed.
+ Specify to disable periodic signaling.
+
+ if the timer was successfully updated; otherwise, .
+
+ The or
+ parameter, in milliseconds, is less than -1 or greater than 4294967294.
+
+
+ It is the responsibility of the implementer of the ITimer interface to ensure thread safety.
+
+
+
+
+ Provide extensions methods for operations with
+ .
+
+
+ The Microsoft.Bcl.TimeProvider library interfaces are intended solely for use in building against pre-.NET 8 surface area.
+ If your code is being built against .NET 8 or higher, then this library should not be utilized.
+
+
+
+ Creates a task that completes after a specified time interval.
+
+ The with which to interpret
+ .
+
+
+ The to wait before completing the returned task, or
+ to wait indefinitely.
+
+ A cancellation token to observe while waiting for the task to complete.
+ A task that represents the time delay.
+ The argument is null.
+
+ represents a negative time interval other than
+ .
+
+
+
+
+ Gets a that will complete when this
+ completes, when the specified timeout expires, or when the specified
+ has cancellation requested.
+
+ The task for which to wait on until completion.
+
+ The timeout after which the should be faulted with a
+ if it hasn't otherwise completed.
+
+
+ The with which to interpret
+ .
+
+ The to monitor for a cancellation request.
+ The representing the asynchronous wait. It may or may not be the same instance as the current instance.
+ The argument is null.
+ The argument is null.
+
+ represents a negative time interval other than
+ .
+
+
+
+
+ Gets a that will complete when this
+ completes, when the specified timeout expires, or when the specified
+ has cancellation requested.
+
+ The task for which to wait on until completion.
+
+ The timeout after which the should be faulted with a
+ if it hasn't otherwise completed.
+
+
+ The with which to interpret
+ .
+
+ The to monitor for a cancellation request.
+ The representing the asynchronous wait. It may or may not be the same instance as the current instance.
+ The argument is null.
+ The argument is null.
+
+ represents a negative time interval other than
+ .
+
+
+
+
+ Initializes a new instance of the class that will be canceled after the specified
+ .
+
+
+ The with which to interpret the
+ .
+
+
+ The time interval to wait before canceling this
+ .
+
+
+ The is negative and not equal to
+ or greater than maximum allowed timer duration.
+
+
+ that will be canceled after the specified
+ .
+
+
+
+ The countdown for the delay starts during the call to the constructor. When the delay expires,
+ the constructed is canceled if it has
+ not been canceled already.
+
+
+ If running on .NET versions earlier than .NET 8.0, there is a constraint when invoking
+ on the resultant object.
+ This action will not terminate the initial timer indicated by . However, this restriction does not apply on .NET 8.0 and later versions.
+
+
+
+
+ '{0}' must be a non-negative and non-zero value.
+
+
+ '{0}' must be greater than or equal to '{1}'.
+
+
+ '{0}' must be less than or equal to '{1}'.
+
+
+ The operation cannot be performed when TimeProvider.LocalTimeZone is null.
+
+
+ The operation cannot be performed when TimeProvider.TimestampFrequency is zero or negative.
+
+
+
+ Attribute used to indicate a source generator should create a function for marshalling
+ arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
+
+
+ This attribute is meaningless if the source generator associated with it is not enabled.
+ The current built-in source generator only supports C# and only supplies an implementation when
+ applied to static, partial, non-generic methods.
+
+
+
+
+ Initializes a new instance of the .
+
+ Name of the library containing the import.
+
+
+
+ Gets the name of the library containing the import.
+
+
+
+
+ Gets or sets the name of the entry point to be called.
+
+
+
+
+ Gets or sets how to marshal string arguments to the method.
+
+
+ If this field is set to a value other than
+ ,
+ must not be specified.
+
+
+
+
+ Gets or sets the used to control how string arguments to the method are marshalled.
+
+
+ If this field is specified,
+ must not be specified
+ or must be set to .
+
+
+
+
+ Gets or sets whether the callee sets an error (SetLastError on Windows or errno
+ on other platforms) before returning from the attributed method.
+
+
+
+
+ Specifies how strings should be marshalled for generated p/invokes
+
+
+
+
+ Indicates the user is suppling a specific marshaller in
+ .
+
+
+
+
+ Use the platform-provided UTF-8 marshaller.
+
+
+
+
+ Use the platform-provided UTF-16 marshaller.
+
+
+
+ Specifies that null is allowed as an input even if the corresponding type disallows it.
+
+
+ Specifies that null is disallowed as an input even if the corresponding type allows it.
+
+
+ Specifies that an output may be null even if the corresponding type disallows it.
+
+
+ Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.
+
+
+
+ Specifies that when a method returns
+ , the parameter may be null even if the corresponding type disallows it.
+
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this value, the associated parameter may be null.
+
+
+
+ Gets the return value condition.
+
+
+
+ Specifies that when a method returns
+ , the parameter will not be null even if the corresponding type allows it.
+
+
+
+ Initializes the attribute with the specified return value condition.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+
+ Gets the return value condition.
+
+
+ Specifies that the output will be non-null if the named parameter is non-null.
+
+
+ Initializes the attribute with the associated parameter name.
+
+ The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
+
+
+
+ Gets the associated parameter name.
+
+
+ Applied to a method that will never return under any circumstance.
+
+
+ Specifies that the method will not return if the associated Boolean parameter is passed the specified value.
+
+
+ Initializes the attribute with the specified parameter value.
+
+ The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
+ the associated parameter matches this value.
+
+
+
+ Gets the condition parameter value.
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values.
+
+
+ Initializes the attribute with a field or property member.
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the list of field and property members.
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets field or property member names.
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.
+
+
+ Initializes the attribute with the specified return value condition and a field or property member.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the specified return value condition and list of field and property members.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets the return value condition.
+
+
+ Gets field or property member names.
+
+
+
\ No newline at end of file
diff --git a/Assets/Packages/ObservableCollections.3.3.4/lib/netstandard2.1/ObservableCollections.xml b/Assets/Packages/ObservableCollections.3.3.4/lib/netstandard2.1/ObservableCollections.xml
index 1a95725..718af3c 100644
--- a/Assets/Packages/ObservableCollections.3.3.4/lib/netstandard2.1/ObservableCollections.xml
+++ b/Assets/Packages/ObservableCollections.3.3.4/lib/netstandard2.1/ObservableCollections.xml
@@ -1,391 +1,404 @@
+
-
- ObservableCollections
-
-
-
- NOTE: when replace successfully, list has been sorted.
-
-
-
- ReadOnly cloned collection.
-
-
-
-
- Contract:
- IsSingleItem ? (NewItem, OldItem) : (NewItems, OldItems)
- Action.Add
- NewItem, NewItems, NewStartingIndex
- Action.Remove
- OldItem, OldItems, OldStartingIndex
- Action.Replace
- NewItem, NewItems, OldItem, OldItems, (NewStartingIndex, OldStartingIndex = samevalue)
- Action.Move
- NewStartingIndex, OldStartingIndex
- Action.Reset
- SortOperation(IsClear, IsReverse, Comparer)
-
-
-
-
- Create faster, compact INotifyCollectionChanged view, however it does not support ***Range.
-
-
-
-
- Create faster, compact INotifyCollectionChanged view, however it does not support ***Range.
-
-
-
-
- similar as AsSpan but modify size to create fixed-size span.
-
-
-
-
- An attribute that allows parameters to receive the expression of other parameters.
-
-
-
-
- Initializes a new instance of the class.
-
- The condition parameter value.
-
-
-
- Gets the parameter name the expression is retrieved from.
-
-
-
-
- Initialize the attribute to refer to the method on the type.
-
- The type of the builder to use to construct the collection.
- The name of the method on the builder to use to construct the collection.
-
- must refer to a static method that accepts a single parameter of
- type and returns an instance of the collection being built containing
- a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
-
-
-
-
- Gets the type of the builder to use to construct the collection.
-
-
-
-
- Gets the name of the method on the builder to use to construct the collection.
-
-
- This should match the metadata name of the target method.
- For example, this might be ".ctor" if targeting the type's constructor.
-
-
-
-
- Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
-
-
-
-
- Creates a new instance of the type.
-
- The name of the feature to indicate.
-
-
-
- The name of the compiler feature.
-
-
-
-
- If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand .
-
-
-
-
- The used for the ref structs C# feature.
-
-
-
-
- The used for the required members C# feature.
-
-
-
-
- Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
-
-
-
-
- Initializes a new instance of the class.
-
- The name of the argument that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Initializes a new instance of the class.
-
- The names of the arguments that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Gets the names of the arguments that should be passed to the handler.
-
- may be used as the name of the receiver in an instance method.
-
-
-
- Indicates the attributed type is to be used as an interpolated string handler.
-
-
-
-
- Reserved to be used by the compiler for tracking metadata.
- This class should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that a method should be called
- in its containing module's initializer.
-
-
- When one or more valid methods
- with this attribute are found in a compilation, the compiler will
- emit a module initializer which calls each of the attributed methods.
-
- Certain requirements are imposed on any method targeted with this attribute:
- - The method must be `static`.
- - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
- - The method must be parameterless.
- - The method must return `void`.
- - The method must not be generic or be contained in a generic type.
- - The method's effective accessibility must be `internal` or `public`.
-
- The specification for module initializers in the .NET runtime can be found here:
- https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
-
-
-
-
- Specifies that a type has required members or that a member is required.
-
-
-
-
- Reserved for use by a compiler for tracking metadata.
- This attribute should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that the .locals init flag should not be set in method headers.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified message.
-
- An optional message associated with this attribute instance.
-
-
-
- Returns the optional message associated with this attribute instance.
-
-
-
-
- Returns the optional URL associated with this attribute instance.
-
-
-
-
- Indicates that an API is experimental and it may change in the future.
-
-
- This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
- feature is used. Authors can use this attribute to ship preview features in their assemblies.
-
-
-
-
- Initializes a new instance of the class,
- specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The ID that the compiler will use when reporting a use of the API the attribute applies to.
-
-
-
- Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The unique diagnostic ID.
-
- The diagnostic ID is shown in build output for warnings and errors.
- This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
-
-
-
-
- Gets or sets the URL for corresponding documentation.
- The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
-
- The format string that represents a URL to corresponding documentation.
- An example format string is https://contoso.com/obsoletion-warnings/{0}.
-
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values.
-
-
-
-
- Initializes the attribute with a field or property member.
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the list of field and property members.
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that the method or property will ensure that the listed field and property
- members have not-null values when returning with the specified return value condition.
-
-
-
-
- Initializes the attribute with the specified return value condition and a field or property member.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the specified return value condition and list of field and property members.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets the return value condition.
-
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that this constructor sets all required members for the current type,
- and callers do not need to set any required members themselves.
-
-
-
-
- Specifies the syntax used in a string.
-
-
-
-
- Initializes the with the identifier of the syntax used.
-
- The syntax identifier.
-
-
- Initializes the with the identifier of the syntax used.
- The syntax identifier.
- Optional arguments associated with the specific syntax employed.
-
-
- Gets the identifier of the syntax used.
-
-
- Optional arguments associated with the specific syntax employed.
-
-
- The syntax identifier for strings containing composite formats for string formatting.
-
-
- The syntax identifier for strings containing date format specifiers.
-
-
- The syntax identifier for strings containing date and time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing JavaScript Object Notation (JSON).
-
-
- The syntax identifier for strings containing numeric format specifiers.
-
-
- The syntax identifier for strings containing regular expressions.
-
-
- The syntax identifier for strings containing time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing URIs.
-
-
- The syntax identifier for strings containing XML.
-
-
-
- Used to indicate a byref escapes and is not scoped.
-
-
-
- There are several cases where the C# compiler treats a as implicitly
- - where the compiler does not allow the to escape the method.
-
-
- For example:
-
- for instance methods.
- parameters that refer to types.
- parameters.
-
-
-
- This attribute is used in those instances where the should be allowed to escape.
-
-
- Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
- API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
-
-
-
-
-
+
+ ObservableCollections
+
+
+
+ NOTE: when replace successfully, list has been sorted.
+
+
+
+ ReadOnly cloned collection.
+
+
+
+
+ Contract:
+ IsSingleItem ? (NewItem, OldItem) : (NewItems, OldItems)
+ Action.Add
+ NewItem, NewItems, NewStartingIndex
+ Action.Remove
+ OldItem, OldItems, OldStartingIndex
+ Action.Replace
+ NewItem, NewItems, OldItem, OldItems, (NewStartingIndex, OldStartingIndex = samevalue)
+ Action.Move
+ NewStartingIndex, OldStartingIndex
+ Action.Reset
+ SortOperation(IsClear, IsReverse, Comparer)
+
+
+
+
+ Create faster, compact INotifyCollectionChanged view, however it does not support ***Range.
+
+
+
+
+ Create faster, compact INotifyCollectionChanged view, however it does not support ***Range.
+
+
+
+
+ similar as AsSpan but modify size to create fixed-size span.
+
+
+
+
+ An attribute that allows parameters to receive the expression of other parameters.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The condition parameter value.
+
+
+
+ Gets the parameter name the expression is retrieved from.
+
+
+
+
+ Initialize the attribute to refer to the method on the
+ type.
+
+ The type of the builder to use to construct the collection.
+ The name of the method on the builder to use to construct the collection.
+
+ must refer to a static method that accepts a single parameter of
+ type and returns an instance of the collection being built containing
+ a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
+
+
+
+
+ Gets the type of the builder to use to construct the collection.
+
+
+
+
+ Gets the name of the method on the builder to use to construct the collection.
+
+
+ This should match the metadata name of the target method.
+ For example, this might be ".ctor" if targeting the type's constructor.
+
+
+
+
+ Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
+
+
+
+
+ Creates a new instance of the
+ type.
+
+ The name of the feature to indicate.
+
+
+
+ The name of the compiler feature.
+
+
+
+
+ If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand
+ .
+
+
+
+
+ The used for the ref structs C# feature.
+
+
+
+
+ The used for the required members C# feature.
+
+
+
+
+ Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The name of the argument that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The names of the arguments that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Gets the names of the arguments that should be passed to the handler.
+
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Indicates the attributed type is to be used as an interpolated string handler.
+
+
+
+
+ Reserved to be used by the compiler for tracking metadata.
+ This class should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that a method should be called
+ in its containing module's initializer.
+
+
+ When one or more valid methods
+ with this attribute are found in a compilation, the compiler will
+ emit a module initializer which calls each of the attributed methods.
+
+ Certain requirements are imposed on any method targeted with this attribute:
+ - The method must be `static`.
+ - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
+ - The method must be parameterless.
+ - The method must return `void`.
+ - The method must not be generic or be contained in a generic type.
+ - The method's effective accessibility must be `internal` or `public`.
+
+ The specification for module initializers in the .NET runtime can be found here:
+ https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
+
+
+
+
+ Specifies that a type has required members or that a member is required.
+
+
+
+
+ Reserved for use by a compiler for tracking metadata.
+ This attribute should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that the .locals init flag should not be set in method headers.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+
+
+
+ Initializes a new instance of the
+ class with the specified message.
+
+ An optional message associated with this attribute instance.
+
+
+
+ Returns the optional message associated with this attribute instance.
+
+
+
+
+ Returns the optional URL associated with this attribute instance.
+
+
+
+
+ Indicates that an API is experimental and it may change in the future.
+
+
+ This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
+ feature is used. Authors can use this attribute to ship preview features in their assemblies.
+
+
+
+
+ Initializes a new instance of the class,
+ specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+
+
+ Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The unique diagnostic ID.
+
+ The diagnostic ID is shown in build output for warnings and errors.
+ This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
+
+
+
+
+ Gets or sets the URL for corresponding documentation.
+ The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
+
+ The format string that represents a URL to corresponding documentation.
+ An example format string is https://contoso.com/obsoletion-warnings/{0}.
+
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values.
+
+
+
+
+ Initializes the attribute with a field or property member.
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the list of field and property members.
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that the method or property will ensure that the listed field and property
+ members have not-null values when returning with the specified return value condition.
+
+
+
+
+ Initializes the attribute with the specified return value condition and a field or property member.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the specified return value condition and list of field and property members.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets the return value condition.
+
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that this constructor sets all required members for the current type,
+ and callers do not need to set any required members themselves.
+
+
+
+
+ Specifies the syntax used in a string.
+
+
+
+
+ Initializes the with the identifier of the syntax used.
+
+ The syntax identifier.
+
+
+ Initializes the with the identifier of the syntax used.
+ The syntax identifier.
+ Optional arguments associated with the specific syntax employed.
+
+
+ Gets the identifier of the syntax used.
+
+
+ Optional arguments associated with the specific syntax employed.
+
+
+ The syntax identifier for strings containing composite formats for string formatting.
+
+
+ The syntax identifier for strings containing date format specifiers.
+
+
+ The syntax identifier for strings containing date and time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing JavaScript Object Notation (JSON).
+
+
+ The syntax identifier for strings containing numeric format specifiers.
+
+
+ The syntax identifier for strings containing regular expressions.
+
+
+ The syntax identifier for strings containing time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing URIs.
+
+
+ The syntax identifier for strings containing XML.
+
+
+
+ Used to indicate a byref escapes and is not scoped.
+
+
+
+ There are several cases where the C# compiler treats a as implicitly
+ - where the compiler does not allow the to escape the method.
+
+
+ For example:
+
+ for instance methods.
+
+ parameters that refer to
+ types.
+
+ parameters.
+
+
+
+ This attribute is used in those instances where the should be allowed to escape.
+
+
+ Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
+ API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
+
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Packages/ObservableCollections.R3.3.3.4/lib/netstandard2.1/ObservableCollections.R3.xml b/Assets/Packages/ObservableCollections.R3.3.3.4/lib/netstandard2.1/ObservableCollections.R3.xml
index 6b72eca..c64ffaf 100644
--- a/Assets/Packages/ObservableCollections.R3.3.3.4/lib/netstandard2.1/ObservableCollections.R3.xml
+++ b/Assets/Packages/ObservableCollections.R3.3.3.4/lib/netstandard2.1/ObservableCollections.R3.xml
@@ -1,352 +1,364 @@
+
-
- ObservableCollections.R3
-
-
-
-
- Indicates that an API is experimental and it may change in the future.
-
-
- This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
- feature is used. Authors can use this attribute to ship preview features in their assemblies.
-
-
-
-
- Initializes a new instance of the class,
- specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The ID that the compiler will use when reporting a use of the API the attribute applies to.
-
-
-
- Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The unique diagnostic ID.
-
- The diagnostic ID is shown in build output for warnings and errors.
- This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
-
-
-
-
- Gets or sets the URL for corresponding documentation.
- The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
-
- The format string that represents a URL to corresponding documentation.
- An example format string is https://contoso.com/obsoletion-warnings/{0}.
-
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values.
-
-
-
-
- Initializes the attribute with a field or property member.
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the list of field and property members.
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that the method or property will ensure that the listed field and property
- members have not-null values when returning with the specified return value condition.
-
-
-
-
- Initializes the attribute with the specified return value condition and a field or property member.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the specified return value condition and list of field and property members.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets the return value condition.
-
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that this constructor sets all required members for the current type,
- and callers do not need to set any required members themselves.
-
-
-
-
- Specifies the syntax used in a string.
-
-
-
-
- Initializes the with the identifier of the syntax used.
-
- The syntax identifier.
-
-
- Initializes the with the identifier of the syntax used.
- The syntax identifier.
- Optional arguments associated with the specific syntax employed.
-
-
- Gets the identifier of the syntax used.
-
-
- Optional arguments associated with the specific syntax employed.
-
-
- The syntax identifier for strings containing composite formats for string formatting.
-
-
- The syntax identifier for strings containing date format specifiers.
-
-
- The syntax identifier for strings containing date and time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing JavaScript Object Notation (JSON).
-
-
- The syntax identifier for strings containing numeric format specifiers.
-
-
- The syntax identifier for strings containing regular expressions.
-
-
- The syntax identifier for strings containing time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing URIs.
-
-
- The syntax identifier for strings containing XML.
-
-
-
- Used to indicate a byref escapes and is not scoped.
-
-
-
- There are several cases where the C# compiler treats a as implicitly
- - where the compiler does not allow the to escape the method.
-
-
- For example:
-
- for instance methods.
- parameters that refer to types.
- parameters.
-
-
-
- This attribute is used in those instances where the should be allowed to escape.
-
-
- Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
- API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
-
-
-
-
-
- An attribute that allows parameters to receive the expression of other parameters.
-
-
-
-
- Initializes a new instance of the class.
-
- The condition parameter value.
-
-
-
- Gets the parameter name the expression is retrieved from.
-
-
-
-
- Initialize the attribute to refer to the method on the type.
-
- The type of the builder to use to construct the collection.
- The name of the method on the builder to use to construct the collection.
-
- must refer to a static method that accepts a single parameter of
- type and returns an instance of the collection being built containing
- a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
-
-
-
-
- Gets the type of the builder to use to construct the collection.
-
-
-
-
- Gets the name of the method on the builder to use to construct the collection.
-
-
- This should match the metadata name of the target method.
- For example, this might be ".ctor" if targeting the type's constructor.
-
-
-
-
- Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
-
-
-
-
- Creates a new instance of the type.
-
- The name of the feature to indicate.
-
-
-
- The name of the compiler feature.
-
-
-
-
- If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand .
-
-
-
-
- The used for the ref structs C# feature.
-
-
-
-
- The used for the required members C# feature.
-
-
-
-
- Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
-
-
-
-
- Initializes a new instance of the class.
-
- The name of the argument that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Initializes a new instance of the class.
-
- The names of the arguments that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Gets the names of the arguments that should be passed to the handler.
-
- may be used as the name of the receiver in an instance method.
-
-
-
- Indicates the attributed type is to be used as an interpolated string handler.
-
-
-
-
- Reserved to be used by the compiler for tracking metadata.
- This class should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that a method should be called
- in its containing module's initializer.
-
-
- When one or more valid methods
- with this attribute are found in a compilation, the compiler will
- emit a module initializer which calls each of the attributed methods.
-
- Certain requirements are imposed on any method targeted with this attribute:
- - The method must be `static`.
- - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
- - The method must be parameterless.
- - The method must return `void`.
- - The method must not be generic or be contained in a generic type.
- - The method's effective accessibility must be `internal` or `public`.
-
- The specification for module initializers in the .NET runtime can be found here:
- https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
-
-
-
-
- Specifies that a type has required members or that a member is required.
-
-
-
-
- Reserved for use by a compiler for tracking metadata.
- This attribute should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that the .locals init flag should not be set in method headers.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified message.
-
- An optional message associated with this attribute instance.
-
-
-
- Returns the optional message associated with this attribute instance.
-
-
-
-
- Returns the optional URL associated with this attribute instance.
-
-
-
-
+
+ ObservableCollections.R3
+
+
+
+
+ Indicates that an API is experimental and it may change in the future.
+
+
+ This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
+ feature is used. Authors can use this attribute to ship preview features in their assemblies.
+
+
+
+
+ Initializes a new instance of the class,
+ specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+
+
+ Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The unique diagnostic ID.
+
+ The diagnostic ID is shown in build output for warnings and errors.
+ This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
+
+
+
+
+ Gets or sets the URL for corresponding documentation.
+ The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
+
+ The format string that represents a URL to corresponding documentation.
+ An example format string is https://contoso.com/obsoletion-warnings/{0}.
+
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values.
+
+
+
+
+ Initializes the attribute with a field or property member.
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the list of field and property members.
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that the method or property will ensure that the listed field and property
+ members have not-null values when returning with the specified return value condition.
+
+
+
+
+ Initializes the attribute with the specified return value condition and a field or property member.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the specified return value condition and list of field and property members.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets the return value condition.
+
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that this constructor sets all required members for the current type,
+ and callers do not need to set any required members themselves.
+
+
+
+
+ Specifies the syntax used in a string.
+
+
+
+
+ Initializes the with the identifier of the syntax used.
+
+ The syntax identifier.
+
+
+ Initializes the with the identifier of the syntax used.
+ The syntax identifier.
+ Optional arguments associated with the specific syntax employed.
+
+
+ Gets the identifier of the syntax used.
+
+
+ Optional arguments associated with the specific syntax employed.
+
+
+ The syntax identifier for strings containing composite formats for string formatting.
+
+
+ The syntax identifier for strings containing date format specifiers.
+
+
+ The syntax identifier for strings containing date and time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing JavaScript Object Notation (JSON).
+
+
+ The syntax identifier for strings containing numeric format specifiers.
+
+
+ The syntax identifier for strings containing regular expressions.
+
+
+ The syntax identifier for strings containing time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing URIs.
+
+
+ The syntax identifier for strings containing XML.
+
+
+
+ Used to indicate a byref escapes and is not scoped.
+
+
+
+ There are several cases where the C# compiler treats a as implicitly
+ - where the compiler does not allow the to escape the method.
+
+
+ For example:
+
+ for instance methods.
+
+ parameters that refer to
+ types.
+
+ parameters.
+
+
+
+ This attribute is used in those instances where the should be allowed to escape.
+
+
+ Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
+ API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
+
+
+
+
+
+ An attribute that allows parameters to receive the expression of other parameters.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The condition parameter value.
+
+
+
+ Gets the parameter name the expression is retrieved from.
+
+
+
+
+ Initialize the attribute to refer to the method on the
+ type.
+
+ The type of the builder to use to construct the collection.
+ The name of the method on the builder to use to construct the collection.
+
+ must refer to a static method that accepts a single parameter of
+ type and returns an instance of the collection being built containing
+ a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
+
+
+
+
+ Gets the type of the builder to use to construct the collection.
+
+
+
+
+ Gets the name of the method on the builder to use to construct the collection.
+
+
+ This should match the metadata name of the target method.
+ For example, this might be ".ctor" if targeting the type's constructor.
+
+
+
+
+ Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
+
+
+
+
+ Creates a new instance of the
+ type.
+
+ The name of the feature to indicate.
+
+
+
+ The name of the compiler feature.
+
+
+
+
+ If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand
+ .
+
+
+
+
+ The used for the ref structs C# feature.
+
+
+
+
+ The used for the required members C# feature.
+
+
+
+
+ Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The name of the argument that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The names of the arguments that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Gets the names of the arguments that should be passed to the handler.
+
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Indicates the attributed type is to be used as an interpolated string handler.
+
+
+
+
+ Reserved to be used by the compiler for tracking metadata.
+ This class should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that a method should be called
+ in its containing module's initializer.
+
+
+ When one or more valid methods
+ with this attribute are found in a compilation, the compiler will
+ emit a module initializer which calls each of the attributed methods.
+
+ Certain requirements are imposed on any method targeted with this attribute:
+ - The method must be `static`.
+ - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
+ - The method must be parameterless.
+ - The method must return `void`.
+ - The method must not be generic or be contained in a generic type.
+ - The method's effective accessibility must be `internal` or `public`.
+
+ The specification for module initializers in the .NET runtime can be found here:
+ https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
+
+
+
+
+ Specifies that a type has required members or that a member is required.
+
+
+
+
+ Reserved for use by a compiler for tracking metadata.
+ This attribute should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that the .locals init flag should not be set in method headers.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+
+
+
+ Initializes a new instance of the
+ class with the specified message.
+
+ An optional message associated with this attribute instance.
+
+
+
+ Returns the optional message associated with this attribute instance.
+
+
+
+
+ Returns the optional URL associated with this attribute instance.
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Packages/R3.1.3.0/lib/netstandard2.1/R3.xml b/Assets/Packages/R3.1.3.0/lib/netstandard2.1/R3.xml
index 7340164..164013b 100644
--- a/Assets/Packages/R3.1.3.0/lib/netstandard2.1/R3.xml
+++ b/Assets/Packages/R3.1.3.0/lib/netstandard2.1/R3.xml
@@ -1,446 +1,471 @@
+
-
- R3
-
-
-
- All values are queued, and the next value waits for the completion of the asynchronous method.
-
-
- Drop new value when async operation is running.
-
-
- If the previous asynchronous method is running, it is cancelled and the next asynchronous method is executed.
-
-
- All values are sent immediately to the asynchronous method.
-
-
- All values are sent immediately to the asynchronous method, but the results are queued and passed to the next operator in order.
-
-
- Send the first value and the last value while the asynchronous method is running.
-
-
- ObserveOn SynchronizationContext.Current
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
-
- Similar as ObserveOn(CurrentThreadScheduler) in dotnet/reactive, place the execution order of recursive calls after the call is completed.
-
-
-
- This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
-
-
-
- Convert INotifyPropertyChanged to Observable.
- `propertySelector` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- Convert INotifyPropertyChanged to Observable.
- `propertySelector1` and `propertySelector2` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- Convert INotifyPropertyChanged to Observable.
- `propertySelector1`, `propertySelector2`, and `propertySelector3` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- Convert INotifyPropertyChanging to Observable.
- `propertySelector` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- Convert INotifyPropertyChanging to Observable.
- `propertySelector1` and `propertySelector2` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- Convert INotifyPropertyChanging to Observable.
- `propertySelector1`, `propertySelector2`, and `propertySelector3` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
-
-
-
-
- An attribute that allows parameters to receive the expression of other parameters.
-
-
-
-
- Initializes a new instance of the class.
-
- The condition parameter value.
-
-
-
- Gets the parameter name the expression is retrieved from.
-
-
-
-
- Initialize the attribute to refer to the method on the type.
-
- The type of the builder to use to construct the collection.
- The name of the method on the builder to use to construct the collection.
-
- must refer to a static method that accepts a single parameter of
- type and returns an instance of the collection being built containing
- a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
-
-
-
-
- Gets the type of the builder to use to construct the collection.
-
-
-
-
- Gets the name of the method on the builder to use to construct the collection.
-
-
- This should match the metadata name of the target method.
- For example, this might be ".ctor" if targeting the type's constructor.
-
-
-
-
- Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
-
-
-
-
- Creates a new instance of the type.
-
- The name of the feature to indicate.
-
-
-
- The name of the compiler feature.
-
-
-
-
- If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand .
-
-
-
-
- The used for the ref structs C# feature.
-
-
-
-
- The used for the required members C# feature.
-
-
-
-
- Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
-
-
-
-
- Initializes a new instance of the class.
-
- The name of the argument that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Initializes a new instance of the class.
-
- The names of the arguments that should be passed to the handler.
- may be used as the name of the receiver in an instance method.
-
-
-
- Gets the names of the arguments that should be passed to the handler.
-
- may be used as the name of the receiver in an instance method.
-
-
-
- Indicates the attributed type is to be used as an interpolated string handler.
-
-
-
-
- Reserved to be used by the compiler for tracking metadata.
- This class should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that a method should be called
- in its containing module's initializer.
-
-
- When one or more valid methods
- with this attribute are found in a compilation, the compiler will
- emit a module initializer which calls each of the attributed methods.
-
- Certain requirements are imposed on any method targeted with this attribute:
- - The method must be `static`.
- - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
- - The method must be parameterless.
- - The method must return `void`.
- - The method must not be generic or be contained in a generic type.
- - The method's effective accessibility must be `internal` or `public`.
-
- The specification for module initializers in the .NET runtime can be found here:
- https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
-
-
-
-
- Specifies that a type has required members or that a member is required.
-
-
-
-
- Reserved for use by a compiler for tracking metadata.
- This attribute should not be used by developers in source code.
-
-
-
-
- Used to indicate to the compiler that the .locals init flag should not be set in method headers.
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Initializes a new instance of the class with the specified message.
-
- An optional message associated with this attribute instance.
-
-
-
- Returns the optional message associated with this attribute instance.
-
-
-
-
- Returns the optional URL associated with this attribute instance.
-
-
-
-
- Types and Methods attributed with StackTraceHidden will be omitted from the stack trace text shown in StackTrace.ToString()
- and Exception.StackTrace
-
-
-
-
- Initializes a new instance of the class.
-
-
-
-
- Indicates that an API is experimental and it may change in the future.
-
-
- This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
- feature is used. Authors can use this attribute to ship preview features in their assemblies.
-
-
-
-
- Initializes a new instance of the class,
- specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The ID that the compiler will use when reporting a use of the API the attribute applies to.
-
-
-
- Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
-
- The unique diagnostic ID.
-
- The diagnostic ID is shown in build output for warnings and errors.
- This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
-
-
-
-
- Gets or sets the URL for corresponding documentation.
- The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
-
- The format string that represents a URL to corresponding documentation.
- An example format string is https://contoso.com/obsoletion-warnings/{0}.
-
-
-
- Specifies that the method or property will ensure that the listed field and property members have not-null values.
-
-
-
-
- Initializes the attribute with a field or property member.
-
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the list of field and property members.
-
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that the method or property will ensure that the listed field and property
- members have not-null values when returning with the specified return value condition.
-
-
-
-
- Initializes the attribute with the specified return value condition and a field or property member.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The field or property member that is promised to be not-null.
-
-
-
- Initializes the attribute with the specified return value condition and list of field and property members.
-
- The return value condition. If the method returns this value, the associated parameter will not be null.
- The list of field and property members that are promised to be not-null.
-
-
-
- Gets the return value condition.
-
-
-
-
- Gets field or property member names.
-
-
-
-
- Specifies that this constructor sets all required members for the current type,
- and callers do not need to set any required members themselves.
-
-
-
-
- Specifies the syntax used in a string.
-
-
-
-
- Initializes the with the identifier of the syntax used.
-
- The syntax identifier.
-
-
- Initializes the with the identifier of the syntax used.
- The syntax identifier.
- Optional arguments associated with the specific syntax employed.
-
-
- Gets the identifier of the syntax used.
-
-
- Optional arguments associated with the specific syntax employed.
-
-
- The syntax identifier for strings containing composite formats for string formatting.
-
-
- The syntax identifier for strings containing date format specifiers.
-
-
- The syntax identifier for strings containing date and time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing JavaScript Object Notation (JSON).
-
-
- The syntax identifier for strings containing numeric format specifiers.
-
-
- The syntax identifier for strings containing regular expressions.
-
-
- The syntax identifier for strings containing time format specifiers.
-
-
- The syntax identifier for strings containing format specifiers.
-
-
- The syntax identifier for strings containing URIs.
-
-
- The syntax identifier for strings containing XML.
-
-
-
- Used to indicate a byref escapes and is not scoped.
-
-
-
- There are several cases where the C# compiler treats a as implicitly
- - where the compiler does not allow the to escape the method.
-
-
- For example:
-
- for instance methods.
- parameters that refer to types.
- parameters.
-
-
-
- This attribute is used in those instances where the should be allowed to escape.
-
-
- Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
- API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
-
-
-
-
-
+
+ R3
+
+
+
+ All values are queued, and the next value waits for the completion of the asynchronous method.
+
+
+ Drop new value when async operation is running.
+
+
+ If the previous asynchronous method is running, it is cancelled and the next asynchronous method is executed.
+
+
+ All values are sent immediately to the asynchronous method.
+
+
+ All values are sent immediately to the asynchronous method, but the results are queued and passed to the next operator in order.
+
+
+ Send the first value and the last value while the asynchronous method is running.
+
+
+ ObserveOn SynchronizationContext.Current
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+
+ Similar as ObserveOn(CurrentThreadScheduler) in dotnet/reactive, place the execution order of recursive calls after the call is completed.
+
+
+
+ This option is only valid for AwaitOperation.Parallel and AwaitOperation.SequentialParallel. It sets the number of concurrent executions. If set to -1, there is no limit.
+
+
+
+ Convert INotifyPropertyChanged to Observable.
+ `propertySelector` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ Convert INotifyPropertyChanged to Observable.
+ `propertySelector1` and `propertySelector2` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ Convert INotifyPropertyChanged to Observable.
+ `propertySelector1`, `propertySelector2`, and `propertySelector3` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ Convert INotifyPropertyChanging to Observable.
+ `propertySelector` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ Convert INotifyPropertyChanging to Observable.
+ `propertySelector1` and `propertySelector2` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ Convert INotifyPropertyChanging to Observable.
+ `propertySelector1`, `propertySelector2`, and `propertySelector3` must be a Func specifying a simple property. For example, it extracts "Foo" from `x => x.Foo`.
+
+
+
+
+ An attribute that allows parameters to receive the expression of other parameters.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The condition parameter value.
+
+
+
+ Gets the parameter name the expression is retrieved from.
+
+
+
+
+ Initialize the attribute to refer to the method on the
+ type.
+
+ The type of the builder to use to construct the collection.
+ The name of the method on the builder to use to construct the collection.
+
+ must refer to a static method that accepts a single parameter of
+ type and returns an instance of the collection being built containing
+ a copy of the data from that span. In future releases of .NET, additional patterns may be supported.
+
+
+
+
+ Gets the type of the builder to use to construct the collection.
+
+
+
+
+ Gets the name of the method on the builder to use to construct the collection.
+
+
+ This should match the metadata name of the target method.
+ For example, this might be ".ctor" if targeting the type's constructor.
+
+
+
+
+ Indicates that compiler support for a particular feature is required for the location where this attribute is applied.
+
+
+
+
+ Creates a new instance of the
+ type.
+
+ The name of the feature to indicate.
+
+
+
+ The name of the compiler feature.
+
+
+
+
+ If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand
+ .
+
+
+
+
+ The used for the ref structs C# feature.
+
+
+
+
+ The used for the required members C# feature.
+
+
+
+
+ Indicates which arguments to a method involving an interpolated string handler should be passed to that handler.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The name of the argument that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Initializes a new instance of the
+ class.
+
+ The names of the arguments that should be passed to the handler.
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Gets the names of the arguments that should be passed to the handler.
+
+ may be used as the name of the receiver in an instance method.
+
+
+
+ Indicates the attributed type is to be used as an interpolated string handler.
+
+
+
+
+ Reserved to be used by the compiler for tracking metadata.
+ This class should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that a method should be called
+ in its containing module's initializer.
+
+
+ When one or more valid methods
+ with this attribute are found in a compilation, the compiler will
+ emit a module initializer which calls each of the attributed methods.
+
+ Certain requirements are imposed on any method targeted with this attribute:
+ - The method must be `static`.
+ - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc.
+ - The method must be parameterless.
+ - The method must return `void`.
+ - The method must not be generic or be contained in a generic type.
+ - The method's effective accessibility must be `internal` or `public`.
+
+ The specification for module initializers in the .NET runtime can be found here:
+ https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer
+
+
+
+
+ Specifies that a type has required members or that a member is required.
+
+
+
+
+ Reserved for use by a compiler for tracking metadata.
+ This attribute should not be used by developers in source code.
+
+
+
+
+ Used to indicate to the compiler that the .locals init flag should not be set in method headers.
+
+
+
+
+ Initializes a new instance of the
+ class.
+
+
+
+
+ Initializes a new instance of the
+ class with the specified message.
+
+ An optional message associated with this attribute instance.
+
+
+
+ Returns the optional message associated with this attribute instance.
+
+
+
+
+ Returns the optional URL associated with this attribute instance.
+
+
+
+
+ Types and Methods attributed with StackTraceHidden will be omitted from the stack trace text shown in StackTrace.ToString()
+ and Exception.StackTrace
+
+
+
+
+ Initializes a new instance of the class.
+
+
+
+
+ Indicates that an API is experimental and it may change in the future.
+
+
+ This attribute allows call sites to be flagged with a diagnostic that indicates that an experimental
+ feature is used. Authors can use this attribute to ship preview features in their assemblies.
+
+
+
+
+ Initializes a new instance of the class,
+ specifying the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+
+
+ Gets the ID that the compiler will use when reporting a use of the API the attribute applies to.
+
+ The unique diagnostic ID.
+
+ The diagnostic ID is shown in build output for warnings and errors.
+ This property represents the unique ID that can be used to suppress the warnings or errors, if needed.
+
+
+
+
+ Gets or sets the URL for corresponding documentation.
+ The API accepts a format string instead of an actual URL, creating a generic URL that includes the diagnostic ID.
+
+ The format string that represents a URL to corresponding documentation.
+ An example format string is https://contoso.com/obsoletion-warnings/{0}.
+
+
+
+ Specifies that the method or property will ensure that the listed field and property members have not-null values.
+
+
+
+
+ Initializes the attribute with a field or property member.
+
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the list of field and property members.
+
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that the method or property will ensure that the listed field and property
+ members have not-null values when returning with the specified return value condition.
+
+
+
+
+ Initializes the attribute with the specified return value condition and a field or property member.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The field or property member that is promised to be not-null.
+
+
+
+ Initializes the attribute with the specified return value condition and list of field and property members.
+
+ The return value condition. If the method returns this value, the associated parameter will not be null.
+ The list of field and property members that are promised to be not-null.
+
+
+
+ Gets the return value condition.
+
+
+
+
+ Gets field or property member names.
+
+
+
+
+ Specifies that this constructor sets all required members for the current type,
+ and callers do not need to set any required members themselves.
+
+
+
+
+ Specifies the syntax used in a string.
+
+
+
+
+ Initializes the with the identifier of the syntax used.
+
+ The syntax identifier.
+
+
+ Initializes the with the identifier of the syntax used.
+ The syntax identifier.
+ Optional arguments associated with the specific syntax employed.
+
+
+ Gets the identifier of the syntax used.
+
+
+ Optional arguments associated with the specific syntax employed.
+
+
+ The syntax identifier for strings containing composite formats for string formatting.
+
+
+ The syntax identifier for strings containing date format specifiers.
+
+
+ The syntax identifier for strings containing date and time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing JavaScript Object Notation (JSON).
+
+
+ The syntax identifier for strings containing numeric format specifiers.
+
+
+ The syntax identifier for strings containing regular expressions.
+
+
+ The syntax identifier for strings containing time format specifiers.
+
+
+ The syntax identifier for strings containing format specifiers.
+
+
+ The syntax identifier for strings containing URIs.
+
+
+ The syntax identifier for strings containing XML.
+
+
+
+ Used to indicate a byref escapes and is not scoped.
+
+
+
+ There are several cases where the C# compiler treats a as implicitly
+ - where the compiler does not allow the to escape the method.
+
+
+ For example:
+
+ for instance methods.
+
+ parameters that refer to
+ types.
+
+ parameters.
+
+
+
+ This attribute is used in those instances where the should be allowed to escape.
+
+
+ Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for
+ API authors to understand the lifetime implications of applying this attribute and how it may impact their users.
+
+
+
+
+
\ No newline at end of file
diff --git a/Assets/Packages/System.ComponentModel.Annotations.5.0.0/lib/netstandard2.1/System.ComponentModel.Annotations.xml b/Assets/Packages/System.ComponentModel.Annotations.5.0.0/lib/netstandard2.1/System.ComponentModel.Annotations.xml
index 9b05806..15261f9 100644
--- a/Assets/Packages/System.ComponentModel.Annotations.5.0.0/lib/netstandard2.1/System.ComponentModel.Annotations.xml
+++ b/Assets/Packages/System.ComponentModel.Annotations.5.0.0/lib/netstandard2.1/System.ComponentModel.Annotations.xml
@@ -1,4 +1,5 @@
+
System.ComponentModel.Annotations
@@ -7,17 +8,29 @@
Extends the metadata information for a class by adding attributes and property information that is defined in an associated class.
-
- Initializes a new instance of the class by using the specified type.
+
+
+ Initializes a new instance of the
+ class by using the specified type.
+
The type for which the metadata provider is created.
-
- Initializes a new instance of the class by using the specified metadata provider type and associated type.
+
+
+ Initializes a new instance of the
+ class by using the specified metadata provider type and associated type.
+
The type for which the metadata provider is created.
The associated type that contains the metadata.
- The value of is .
+
+ The value of is
+ .
+
-
+ Gets a type descriptor for the specified type and object.
The type of object to retrieve the type descriptor for.
An instance of the type.
@@ -26,16 +39,27 @@
Specifies that an entity member represents a data relationship, such as a foreign key relationship.
-
- Initializes a new instance of the class.
+
+
+ Initializes a new instance of the
+ class.
+
The name of the association.
- A comma-separated list of the property names of the key values on the side of the association.
- A comma-separated list of the property names of the key values on the side of the association.
+
+ A comma-separated list of the property names of the key values on the
+ side of the association.
+
+
+ A comma-separated list of the property names of the key values on the
+ side of the association.
+
Gets or sets a value that indicates whether the association member represents a foreign key.
- if the association represents a foreign key; otherwise, .
+ if the association represents a foreign key; otherwise, .
+
Gets the name of the association.
@@ -46,22 +70,37 @@
A comma-separated list of the property names that represent the key values on the OtherKey side of the association.
- Gets a collection of individual key members that are specified in the property.
- A collection of individual key members that are specified in the property.
+
+ Gets a collection of individual key members that are specified in the
+ property.
+
+
+ A collection of individual key members that are specified in the
+ property.
+ Gets the property names of the key values on the ThisKey side of the association.A comma-separated list of the property names that represent the key values on the ThisKey side of the association.
- Gets a collection of individual key members that are specified in the property.
- A collection of individual key members that are specified in the property.
+
+ Gets a collection of individual key members that are specified in the
+ property.
+
+
+ A collection of individual key members that are specified in the
+ property.
+ Provides an attribute that compares two properties.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The property to compare with the current property.
@@ -69,12 +108,14 @@
The name of the field that caused the validation failure.
The formatted error message.
-
+ Determines whether a specified object is valid.
The object to validate.
An object that contains information about the validation request.
- if is valid; otherwise, .
+ if is valid; otherwise, .
+
Gets the property to compare with the current property.
@@ -87,31 +128,42 @@
Gets a value that indicates whether the attribute requires validation context.
- if the attribute requires validation context; otherwise, .
+ if the attribute requires validation context; otherwise, .
+
Specifies that a property participates in optimistic concurrency checks.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Specifies that a data field value is a credit card number.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Determines whether the specified credit card number is valid.
The value to validate.
- if the credit card number is valid; otherwise, .
+ if the credit card number is valid; otherwise, .
+
Specifies a custom validation method that is used to validate a property or class instance.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The type that contains the method that performs custom validation.
The method that performs custom validation.
@@ -186,15 +238,23 @@
Specifies the name of an additional type to associate with a data field.
-
- Initializes a new instance of the class by using the specified type name.
+
+
+ Initializes a new instance of the
+ class by using the specified type name.
+
The name of the type to associate with the data field.
- Initializes a new instance of the class by using the specified field template name.
+
+ Initializes a new instance of the
+ class by using the specified field template name.
+
The name of the custom field template to associate with the data field.
- is or an empty string ("").
+ is or an empty string ("").
+
Returns the name of the type that is associated with the data field.
@@ -206,7 +266,8 @@
The data field value to validate.
The current attribute is ill-formed.
- always.
+ always.
+
Gets the name of custom field template that is associated with the data field.
@@ -224,57 +285,149 @@
Provides a general-purpose attribute that lets you specify localizable strings for types and members of entity partial classes.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Returns the value of the property.
- The value of if the property has been initialized; otherwise, .
+
+ Returns the value of the
+ property.
+
+
+ The value of
+ if the property has been initialized; otherwise, .
+ Returns a value that indicates whether UI should be generated automatically in order to display filtering for this field.
- The value of if the property has been initialized; otherwise, .
+
+ The value of
+ if the property has been initialized; otherwise, .
+
- Returns the value of the property.
- The property and the property are initialized, but a public static property that has a name that matches the value could not be found for the property.
- The localized description, if the has been specified and the property represents a resource key; otherwise, the non-localized value of the property.
+
+ Returns the value of the
+ property.
+
+
+ The
+ property and the
+ property are initialized, but a public static property that has a name that matches the
+ value could not be found for the
+ property.
+
+
+ The localized description, if the
+ has been specified and the
+ property represents a resource key; otherwise, the non-localized value of the
+ property.
+
- Returns the value of the property.
- Both the property and properties were set, but a public static property with a name matching the value couldn't be found on the .
- A value that will be used for grouping fields in the UI, if has been initialized; otherwise, . If the property has been specified and the property represents a resource key, a localized string is returned; otherwise, a non-localized string is returned.
+
+ Returns the value of the
+ property.
+
+
+ Both the
+ property and
+ properties were set, but a public static property with a name matching the
+ value couldn't be found on the
+ .
+
+
+ A value that will be used for grouping fields in the UI, if
+ has been initialized; otherwise,
+ . If the
+ property has been specified and the
+ property represents a resource key, a localized string is returned; otherwise, a non-localized string is returned.
+ Returns a value that is used for field display in the UI.
- The property and the property are initialized, but a public static property that has a name that matches the value could not be found for the property.
- The localized string for the property, if the property has been specified and the property represents a resource key; otherwise, the non-localized value of the property.
+
+ The
+ property and the
+ property are initialized, but a public static property that has a name that matches the
+ value could not be found for the
+ property.
+
+
+ The localized string for the
+ property, if the
+ property has been specified and the
+ property represents a resource key; otherwise, the non-localized value of the
+ property.
+
- Returns the value of the property.
- The value of the property, if it has been set; otherwise, .
+
+ Returns the value of the
+ property.
+
+
+ The value of the property, if it has been set; otherwise,
+ .
+
- Returns the value of the property.
- Both the property and properties were set, but a public static property with a name matching the value couldn't be found on the .
- The localized string for the property if the property has been specified and if the property represents a resource key; otherwise, the non-localized value of the property.
+
+ Returns the value of the
+ property.
+
+
+ Both the
+ property and
+ properties were set, but a public static property with a name matching the
+ value couldn't be found on the
+ .
+
+
+ The localized string for the
+ property if the
+ property has been specified and if the
+ property represents a resource key; otherwise, the non-localized value of the
+ property.
+
- Returns the value of the property.
- Both the property and properties were set,
-but a public static property with a name matching the value couldn't be found on the .
- The localized string for the property if the property has been specified and if the property represents a resource key; otherwise, the non-localized value of the value property.
+
+ Returns the value of the
+ property.
+
+
+ Both the property and
+ properties were set,
+ but a public static property with a name matching the
+ value couldn't be found on the
+ .
+
+
+ The localized string for the
+ property if the
+ property has been specified and if the
+ property represents a resource key; otherwise, the non-localized value of the
+ value property.
+ Gets or sets a value that indicates whether UI should be generated automatically in order to display this field.An attempt was made to get the property value before it was set.
- if UI should be generated automatically to display this field; otherwise, .
+ if UI should be generated automatically to display this field; otherwise,
+ .
+
Gets or sets a value that indicates whether filtering UI is automatically displayed for this field.An attempt was made to get the property value before it was set.
- if UI should be generated automatically to display filtering for this field; otherwise, .
+ if UI should be generated automatically to display filtering for this field; otherwise,
+ .
+
Gets or sets a value that is used to display a description in the UI.
@@ -298,8 +451,20 @@ but a public static property with a name matching the
- Gets or sets the type that contains the resources for the , , , and properties.
- The type of the resource that contains the , , , and properties.
+
+ Gets or sets the type that contains the resources for the
+ ,
+ ,
+ , and
+ properties.
+
+
+ The type of the resource that contains the
+ ,
+ ,
+ , and
+ properties.
+ Gets or sets a value that is used for the grid column label.
@@ -309,20 +474,32 @@ but a public static property with a name matching the
- Initializes a new instance of the class by using the specified column.
+
+ Initializes a new instance of the
+ class by using the specified column.
+
The name of the column to use as the display column.
- Initializes a new instance of the class by using the specified display and sort columns.
+
+ Initializes a new instance of the
+ class by using the specified display and sort columns.
+
The name of the column to use as the display column.
The name of the column to use for sorting.
-
- Initializes a new instance of the class by using the specified display column, and the specified sort column and sort order.
+
+
+ Initializes a new instance of the
+ class by using the specified display column, and the specified sort column and sort order.
+
The name of the column to use as the display column.
The name of the column to use for sorting.
- to sort in descending order; otherwise, . The default is .
+ to sort in descending order; otherwise, . The default is
+ .
+
Gets the name of the column to use as the display field.
@@ -335,33 +512,68 @@ but a public static property with a name matching the Gets a value that indicates whether to sort in descending or ascending order.
- if the column will be sorted in descending order; otherwise, .
+ if the column will be sorted in descending order; otherwise, .
+
Specifies how data fields are displayed and formatted by ASP.NET Dynamic Data.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Returns the UI display string for .
- Both the and properties are set, but a public static property with a name matching the value cannot be found on the .
+
+ Returns the UI display string for
+ .
+
+
+ Both the
+ and
+ properties are set, but a public static property with a name matching the
+ value cannot be found on the
+ .
+ The UI display string.
- If has not been specified, the value of is returned.
- If has been specified and represents a resource key within that resource type, the localized value is returned.
- If and have not been set, returns .
+
+ If
+ has not been specified, the value of
+ is returned.
+
+
+ If
+ has been specified and
+ represents a resource key within that resource type, the localized value is returned.
+
+
+ If and
+
+ have not been set, returns .
+
- Gets or sets a value that indicates whether the formatting string that is specified by the property is applied to the field value when the data field is in edit mode.
+
+ Gets or sets a value that indicates whether the formatting string that is specified by the
+ property is applied to the field value when the data field is in edit mode.
+
- if the formatting string applies to the field value in edit mode; otherwise, . The default is .
+ if the formatting string applies to the field value in edit mode; otherwise,
+ . The default is .
+
- Gets or sets a value that indicates whether empty string values ("") are automatically converted to when the data field is updated in the data source.
+
+ Gets or sets a value that indicates whether empty string values ("") are automatically converted to
+ when the data field is updated in the data source.
+
- if empty string values are automatically converted to ; otherwise, . The default is .
+ if empty string values are automatically converted to ; otherwise,
+ . The default is .
+
Gets or sets the display format for the field value.
@@ -370,59 +582,80 @@ but a public static property with a name matching the Gets or sets a value that indicates whether the field should be HTML-encoded.
- if the field should be HTML-encoded; otherwise, .
+ if the field should be HTML-encoded; otherwise, .
+
Gets or sets the text that is displayed for a field when the field's value is .The text that is displayed for a field when the field's value is . The default is an empty string (""), which indicates that this property is not set.
- Gets or sets the that contains the resources for .
-
-Using along with , allows the method to return localized values.
+
+ Gets or sets the that contains the resources for
+ .
+
+ Using
+ along with , allows the
+ method to return localized values.
+ Indicates whether a data field is editable.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- to specify that field is editable; otherwise, .
+ to specify that field is editable; otherwise, .
+
Gets a value that indicates whether a field is editable.
- if the field is editable; otherwise, .
+ if the field is editable; otherwise, .
+
Gets or sets a value that indicates whether an initial value is enabled.
- if an initial value is enabled; otherwise, .
+ if an initial value is enabled; otherwise, .
+
Validates an email address.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Determines whether the specified value matches the pattern of a valid email address.
The value to validate.
- if the specified value is valid or ; otherwise, .
+ if the specified value is valid or ; otherwise,
+ .
+
Enables a .NET Framework enumeration to be mapped to a data column.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The type of the enumeration.
Checks that the value of the data field is valid.
The data field value to validate.
- if the data field value is valid; otherwise, .
+ if the data field value is valid; otherwise, .
+
Gets or sets the enumeration type.
@@ -432,7 +665,10 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Applies formatting to an error message, based on the data field where the error occurred.
@@ -443,7 +679,8 @@ Using A comma delimited list of valid file extensions.
- if the file name extension is valid; otherwise, .
+ if the file name extension is valid; otherwise, .
+
Gets or sets the file name extensions.
@@ -453,16 +690,26 @@ Using
- Initializes a new instance of the class by using the filter UI hint.
+
+ Initializes a new instance of the
+ class by using the filter UI hint.
+
The name of the control to use for filtering.
- Initializes a new instance of the class by using the filter UI hint and presentation layer name.
+
+ Initializes a new instance of the
+ class by using the filter UI hint and presentation layer name.
+
The name of the control to use for filtering.
The name of the presentation layer that supports this control.
-
- Initializes a new instance of the class by using the filter UI hint, presentation layer name, and control parameters.
+
+
+ Initializes a new instance of the
+ class by using the filter UI hint, presentation layer name, and control parameters.
+
The name of the control to use for filtering.
The name of the presentation layer that supports this control.
The list of parameters for the control.
@@ -471,7 +718,9 @@ Using The object to compare with this attribute instance.
- if the passed object is equal to this attribute instance; otherwise, .
+ if the passed object is equal to this attribute instance; otherwise,
+ .
+
Returns the hash code for this attribute instance.
@@ -493,7 +742,8 @@ Using Provides a way for an object to be validated.
-
+ Determines whether the specified object is valid.
The validation context.
A collection that holds failed-validation information.
@@ -502,16 +752,26 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Specifies the maximum length of array or string data allowed in a property.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Initializes a new instance of the class based on the parameter.
+
+ Initializes a new instance of the
+ class based on the
+ parameter.
+
The maximum allowable length of array or string data.
@@ -524,7 +784,9 @@ Using The object to validate.
Length is zero or less than negative one.
- if the value is null, or if the value is less than or equal to the specified maximum length; otherwise, .
+ if the value is null, or if the value is less than or equal to the specified maximum length; otherwise,
+ .
+
Gets the maximum allowable length of the array or string data.
@@ -534,10 +796,14 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The metadata class to reference.
- is .
+ is .
+
Gets the metadata class that is associated with a data-model partial class.
@@ -547,7 +813,10 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The length of the array or string data.
@@ -560,7 +829,8 @@ Using The object to validate.
Length is less than zero.
- if the specified object is valid; otherwise, .
+ if the specified object is valid; otherwise, .
+
Gets or sets the minimum allowable length of the array or string data.
@@ -570,34 +840,49 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Determines whether the specified phone number is in a valid phone number format.
The value to validate.
- if the phone number is valid; otherwise, .
+ if the phone number is valid; otherwise, .
+
Specifies the numeric range constraints for the value of a data field.
- Initializes a new instance of the class by using the specified minimum and maximum values.
+
+ Initializes a new instance of the
+ class by using the specified minimum and maximum values.
+
Specifies the minimum value allowed for the data field value.
Specifies the maximum value allowed for the data field value.
- Initializes a new instance of the class by using the specified minimum and maximum values.
+
+ Initializes a new instance of the
+ class by using the specified minimum and maximum values.
+
Specifies the minimum value allowed for the data field value.
Specifies the maximum value allowed for the data field value.
-
- Initializes a new instance of the class by using the specified minimum and maximum values and the specific type.
+
+
+ Initializes a new instance of the
+ class by using the specified minimum and maximum values and the specific type.
+
Specifies the type of the object to test.
Specifies the minimum value allowed for the data field value.
Specifies the maximum value allowed for the data field value.
- is .
+ is .
+
Formats the error message that is displayed when range validation fails.
@@ -611,12 +896,21 @@ Using The data field value was outside the allowed range.
The current attribute is ill-formed.
- if the specified value is in the range; otherwise, .
+ if the specified value is in the range; otherwise, .
+
- Gets or sets a value that determines whether any conversions of the value being validated to as set by the type parameter of the constructor use the invariant culture or the current culture.
+
+ Gets or sets a value that determines whether any conversions of the value being validated to
+ as set by the type
+ parameter of the
+
+ constructor use the invariant culture or the current culture.
+
- to use the invariant culture for any conversions; to use the culture that is current at the time of the validation.
+ to use the invariant culture for any conversions; to use the culture that is current at the time of the validation.
+
Gets the maximum allowed field value.
@@ -631,22 +925,33 @@ Using
- Gets or sets a value that determines whether string values for and are parsed using the invariant culture rather than the current culture.
+
+ Gets or sets a value that determines whether string values for
+ and
+ are parsed using the invariant culture rather than the current culture.
+ Specifies that a data field value in ASP.NET Dynamic Data must match the specified regular expression.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The regular expression that is used to validate the data field value.
- is .
+ is .
+
Formats the error message to display if the regular expression validation fails.
The name of the field that caused the validation failure.
The current attribute is ill-formed.
- The is not a valid regular expression.
+
+ The
+ is not a valid regular expression.
+ The formatted error message.
@@ -655,9 +960,11 @@ Using The data field value did not match the regular expression pattern.
The current attribute is ill-formed.
- is not a valid regular expression.
+ is not a valid regular expression.
+
- if validation is successful; otherwise, .
+ if validation is successful; otherwise, .
+
Gets or sets the amount of time in milliseconds to execute a single matching operation before the operation times out.
@@ -671,40 +978,60 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Checks that the value of the required data field is not empty.
The data field value to validate.
- The data field value was .
+
+ The data field value was
+ .
+
- if validation is successful; otherwise, .
+ if validation is successful; otherwise, .
+
Gets or sets a value that indicates whether an empty string is allowed.
- if an empty string is allowed; otherwise, . The default value is .
+ if an empty string is allowed; otherwise, . The default value is
+ .
+
Specifies whether a class or data column uses scaffolding.
- Initializes a new instance of using the property.
+
+ Initializes a new instance of
+ using the
+ property.
+
The value that specifies whether scaffolding is enabled.
Gets or sets the value that specifies whether scaffolding is enabled.
- if scaffolding is enabled; otherwise, .
+ if scaffolding is enabled; otherwise, .
+
Represents the database column that a property is mapped to.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The name of the column the property is mapped to.
@@ -723,13 +1050,20 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Specifies how the database generates values for a property.
-
- Initializes a new instance of the class.
+
+
+ Initializes a new instance of the
+ class.
+
The database generated option.
@@ -752,7 +1086,10 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The name of the associated navigation property, or the name of one or more associated foreign keys.
@@ -763,7 +1100,10 @@ Using
- Initializes a new instance of the class using the specified property.
+
+ Initializes a new instance of the
+ class using the specified property.
+
The navigation property representing the other end of the same relationship.
@@ -774,13 +1114,19 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Specifies the database table that a class is mapped to.
- Initializes a new instance of the class using the specified name of the table.
+
+ Initializes a new instance of the
+ class using the specified name of the table.
+
The name of the table the class is mapped to.
@@ -795,18 +1141,21 @@ Using
- Initializes a new instance of the class by using a specified maximum length.
+
+ Initializes a new instance of the
+ class by using a specified maximum length.
+
The maximum length of a string.
Applies formatting to a specified error message.
The name of the field that caused the validation failure.
- is negative.
-
- -or-
-
- is less than .
+ is negative.
+
+ -or-
+ is less than .
+
The current attribute is ill-formed.The formatted error message.
@@ -814,14 +1163,16 @@ Using The object to validate.
- is negative.
-
- -or-
-
- is less than .
+ is negative.
+
+ -or-
+ is less than
+ .
+
The current attribute is ill-formed.
- if the specified object is valid; otherwise, .
+ if the specified object is valid; otherwise, .
+
Gets or sets the maximum length of a string.
@@ -835,37 +1186,53 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Specifies the template or user control that Dynamic Data uses to display a data field.
- Initializes a new instance of the class by using a specified user control.
+
+ Initializes a new instance of the
+ class by using a specified user control.
+
The user control to use to display the data field.
- Initializes a new instance of the class using the specified user control and specified presentation layer.
+
+ Initializes a new instance of the
+ class using the specified user control and specified presentation layer.
+
The user control (field template) to use to display the data field.
The presentation layer that uses the class. Can be set to "HTML", "Silverlight", "WPF", or "WinForms".
-
- Initializes a new instance of the class by using the specified user control, presentation layer, and control parameters.
+
+
+ Initializes a new instance of the
+ class by using the specified user control, presentation layer, and control parameters.
+
The user control (field template) to use to display the data field.
The presentation layer that uses the class. Can be set to "HTML", "Silverlight", "WPF", or "WinForms".
The object to use to retrieve values from any data sources.
- is or it is a constraint key.
-
- -or-
-
- The value of is not a string.
+ is
+ or it is a constraint key.
+
+ -or-
+
+ The value of is not a string.
+
Gets a value that indicates whether this instance is equal to the specified object.
The object to compare with this instance, or a reference.
- if the specified object is equal to this instance; otherwise, .
+ if the specified object is equal to this instance; otherwise, .
+
Gets the hash code for the current instance of the attribute.
@@ -877,7 +1244,10 @@ Using
- Gets or sets the presentation layer that uses the class.
+
+ Gets or sets the presentation layer that uses the
+ class.
+ The presentation layer that is used by this class.
@@ -888,28 +1258,43 @@ Using
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+ Validates the format of the specified URL.
The URL to validate.
- if the URL format is valid or ; otherwise, .
+ if the URL format is valid or ; otherwise,
+ .
+
Serves as the base class for all validation attributes.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Initializes a new instance of the class by using the function that enables access to validation resources.
+
+ Initializes a new instance of the
+ class by using the function that enables access to validation resources.
+
The function that enables access to validation resources.
- is .
+ is .
+
- Initializes a new instance of the class by using the error message to associate with a validation control.
+
+ Initializes a new instance of the
+ class by using the error message to associate with a validation control.
+
The error message to associate with a validation control.
@@ -918,15 +1303,20 @@ Using The current attribute is malformed.
An instance of the formatted error message.
-
+ Checks whether the specified value is valid with respect to the current validation attribute.
The value to validate.
The context information about the validation operation.
The current attribute is malformed.
- is .
+ is .
+
- has not been implemented by a derived class.
+
+ has not been implemented by a derived class.
+
An instance of the class.
@@ -935,32 +1325,46 @@ Using The current attribute is malformed.
Neither overload of has been implemented by a derived class.
- if the specified value is valid; otherwise, .
+ if the specified value is valid; otherwise, .
+
-
+ Validates the specified value with respect to the current validation attribute.
The value to validate.
The context information about the validation operation.
The current attribute is malformed.
- has not been implemented by a derived class.
+
+ has not been implemented by a derived class.
+
An instance of the class.
-
+ Validates the specified object.
The object to validate.
- The object that describes the context where the validation checks are performed. This parameter cannot be .
+
+ The
+ object that describes the context where the validation checks are performed. This parameter cannot be
+ .
+
Validation failed.The current attribute is malformed.
- has not been implemented by a derived class.
+
+ has not been implemented by a derived class.
+
Validates the specified object.
The value of the object to validate.
The name to include in the error message.
- is not valid.
+ is not valid.
+
The current attribute is malformed.
@@ -968,7 +1372,10 @@ Using
- Gets or sets the error message resource name to use in order to look up the property value if validation fails.
+
+ Gets or sets the error message resource name to use in order to look up the
+ property value if validation fails.
+ The error message resource that is associated with a validation control.
@@ -982,39 +1389,58 @@ Using Gets a value that indicates whether the attribute requires validation context.
- if the attribute requires validation context; otherwise, .
+ if the attribute requires validation context; otherwise, .
+
Describes the context in which a validation check is performed.
- Initializes a new instance of the class using the specified object instance.
+
+ Initializes a new instance of the
+ class using the specified object instance.
+
The object instance to validate. It cannot be .
- is .
-
-
- Initializes a new instance of the class using the specified object and an optional property bag.
+ is .
+
+
+
+
+ Initializes a new instance of the
+ class using the specified object and an optional property bag.
+
The object instance to validate. It cannot be
An optional set of key/value pairs to make available to consumers.
- is .
-
-
- Initializes a new instance of the class using the service provider and dictionary of service consumers.
+ is .
+
+
+
+
+ Initializes a new instance of the
+ class using the service provider and dictionary of service consumers.
+
The object to validate. This parameter is required.
The object that implements the interface. This parameter is optional.
A dictionary of key/value pairs to make available to the service consumers. This parameter is optional.
- is .
+ is .
+
Returns the service that provides custom validation.
The type of the service to use for validation.
An instance of the service, or if the service is not available.
-
- Initializes the using a service provider that can return service instances by type when is called.
+
+
+ Initializes the using a service provider that can return service instances by type when
+ is called.
+
The service provider.
@@ -1038,67 +1464,119 @@ Using
- Represents the exception that occurs during validation of a data field when the class is used.
+
+ Represents the exception that occurs during validation of a data field when the
+ class is used.
+
- Initializes a new instance of the class using an error message generated by the system.
-
-
- Initializes a new instance of the class by using a validation result, a validation attribute, and the value of the current exception.
+
+ Initializes a new instance of the
+ class using an error message generated by the system.
+
+
+
+
+ Initializes a new instance of the
+ class by using a validation result, a validation attribute, and the value of the current exception.
+
The list of validation results.
The attribute that caused the current exception.
The value of the object that caused the attribute to trigger the validation error.
-
- Initializes a new instance of the class using serialized data.
+
+
+ Initializes a new instance of the
+ class using serialized data.
+
The object that holds the serialized data.
Context information about the source or destination of the serialized object.
- Initializes a new instance of the class using a specified error message.
+
+ Initializes a new instance of the
+ class using a specified error message.
+
A specified message that states the error.
-
- Initializes a new instance of the class using a specified error message, a validation attribute, and the value of the current exception.
+
+
+ Initializes a new instance of the
+ class using a specified error message, a validation attribute, and the value of the current exception.
+
The message that states the error.
The attribute that caused the current exception.
The value of the object that caused the attribute to trigger validation error.
- Initializes a new instance of the class using a specified error message and a collection of inner exception instances.
+
+ Initializes a new instance of the
+ class using a specified error message and a collection of inner exception instances.
+
The error message.
The collection of validation exceptions.
- Gets the instance of the class that triggered this exception.
+
+ Gets the instance of the
+ class that triggered this exception.
+ An instance of the validation attribute type that triggered this exception.
- Gets the instance that describes the validation error.
+
+ Gets the
+ instance that describes the validation error.
+ The instance that describes the validation error.
- Gets the value of the object that causes the class to trigger this exception.
- The value of the object that caused the class to trigger the validation error.
+
+ Gets the value of the object that causes the
+ class to trigger this exception.
+
+
+ The value of the object that caused the
+ class to trigger the validation error.
+ Represents a container for the results of a validation request.
- Represents the success of the validation ( if validation was successful; otherwise, ).
-
-
- Initializes a new instance of the class by using a object.
+
+ Represents the success of the validation ( if validation was successful; otherwise,
+ ).
+
+
+
+
+ Initializes a new instance of the
+ class by using a
+ object.
+
The validation result object.
- is .
+ is .
+
- Initializes a new instance of the class by using an error message.
+
+ Initializes a new instance of the
+ class by using an error message.
+
The error message.
-
- Initializes a new instance of the class by using an error message and a list of members that have validation errors.
+
+
+ Initializes a new instance of the
+ class by using an error message and a list of members that have validation errors.
+
The error message.
The list of member names that have validation errors.
@@ -1115,96 +1593,144 @@ Using
- Defines a helper class that can be used to validate objects, properties, and methods when it is included in their associated attributes.
+
+ Defines a helper class that can be used to validate objects, properties, and methods when it is included in their associated
+ attributes.
+
-
+ Determines whether the specified object is valid using the validation context and validation results collection.
The object to validate.
The context that describes the object to validate.
A collection to hold each failed validation.
- is .
+ is .
+
- doesn't match the on .
+ doesn't match the
+ on
+ .
+
- if the object validates; otherwise, .
+ if the object validates; otherwise, .
+
-
+ Determines whether the specified object is valid using the validation context, validation results collection, and a value that specifies whether to validate all properties.
The object to validate.
The context that describes the object to validate.
A collection to hold each failed validation.
- to validate all properties; if , only required attributes are validated.
+ to validate all properties; if , only required attributes are validated.
+
- is .
+ is .
+
- doesn't match theon .
+ doesn't match the
+ on
+ .
+
- if the object validates; otherwise, .
+ if the object validates; otherwise, .
+
-
+ Validates the property.
The value to validate.
The context that describes the property to validate.
A collection to hold each failed validation.
- cannot be assigned to the property.
-
- -or-
-
- is .
- The property of is not a valid property.
+ cannot be assigned to the property.
+
+ -or-
+ is .
+
+
+ The
+ property of
+ is not a valid property.
+
- if the property validates; otherwise, .
+ if the property validates; otherwise, .
+
-
+ Returns a value that indicates whether the specified value is valid with the specified attributes.
The value to validate.
The context that describes the object to validate.
A collection to hold failed validations.
The validation attributes.
- if the object validates; otherwise, .
+ if the object validates; otherwise, .
+
-
+ Determines whether the specified object is valid using the validation context.
The object to validate.
The context that describes the object to validate.
The object is not valid.
- is .
+ is .
+
- doesn't match the on .
+ doesn't match the
+ on
+ .
+
-
+ Determines whether the specified object is valid using the validation context, and a value that specifies whether to validate all properties.
The object to validate.
The context that describes the object to validate.
- to validate all properties; otherwise, .
+ to validate all properties; otherwise, .
+
- is not valid.
+ is not valid.
+
- is .
+ is .
+
- doesn't match the on .
+ doesn't match the
+ on
+ .
+
-
+ Validates the property.
The value to validate.
The context that describes the property to validate.
- cannot be assigned to the property.
- The parameter is not valid.
+ cannot be assigned to the property.
+
+
+ The
+ parameter is not valid.
+
-
+ Validates the specified attributes.
The value to validate.
The context that describes the object to validate.
The validation attributes.
- The parameter is .
- The parameter does not validate with the parameter.
+
+ The parameter is
+ .
+
+
+ The
+ parameter does not validate with the parameter.
+
\ No newline at end of file
diff --git a/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml b/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
index 9d79492..046bbdb 100644
--- a/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
+++ b/Assets/Packages/System.Runtime.CompilerServices.Unsafe.6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml
@@ -1,4 +1,5 @@
+
System.Runtime.CompilerServices.Unsafe
@@ -55,7 +56,9 @@
The second reference to compare.
The type of reference.
- if and point to the same location; otherwise, .
+ if and point to the same location; otherwise,
+ .
+
Casts the given object to the specified type.
@@ -161,7 +164,9 @@
The second value to compare.
The type of the reference.
- if is greater than ; otherwise, .
+ if is greater than ; otherwise,
+ .
+
Returns a value that indicates whether a specified reference is less than another specified reference.
@@ -169,14 +174,17 @@
The second value to compare.
The type of the reference.
- if is less than ; otherwise, .
+ if is less than ; otherwise,
+ .
+
Determines if a given reference to a value of type is a null reference.
The reference to check.
The type of the reference.
- if is a null reference; otherwise, .
+ if is a null reference; otherwise, .
+
Returns a reference to a value of type that is a null reference.
@@ -258,15 +266,17 @@
The value to unbox.
The type to be unboxed.
- is , and is a non-nullable value type.
+ is , and is a non-nullable value type.
+
is not a boxed value type.
-
--or-
- is not a boxed .
+ -or-
+ is not a boxed .
+
- cannot be found.
+ cannot be found.
+
A to the boxed value .
diff --git a/Assets/Packages/System.Threading.Channels.8.0.0/lib/netstandard2.1/System.Threading.Channels.xml b/Assets/Packages/System.Threading.Channels.8.0.0/lib/netstandard2.1/System.Threading.Channels.xml
index 20275dc..8cda323 100644
--- a/Assets/Packages/System.Threading.Channels.8.0.0/lib/netstandard2.1/System.Threading.Channels.xml
+++ b/Assets/Packages/System.Threading.Channels.8.0.0/lib/netstandard2.1/System.Threading.Channels.xml
@@ -1,4 +1,5 @@
+
System.Threading.Channels
@@ -20,7 +21,10 @@
Waits for space to be available in order to complete the write operation.
- Provides options that control the behavior of bounded instances.
+
+ Provides options that control the behavior of bounded
+ instances.
+ Initializes the options.
@@ -41,16 +45,21 @@
Specifies the type of data in the channel.The created channel.
-
+ Creates a channel with the specified maximum capacity.
Options that guide the behavior of the channel.
Specifies the type of data in the channel.The created channel.
-
+ Creates a channel subject to the provided options.
Options that guide the behavior of the channel.
- Delegate that will be called when item is being dropped from channel. See .
+
+ Delegate that will be called when item is being dropped from channel. See
+ .
+
Specifies the type of data in the channel.The created channel.
@@ -59,33 +68,42 @@
The type of data in the channel.The created channel.
-
+ Creates an unbounded channel subject to the provided options.
Options that guide the behavior of the channel.
Specifies the type of data in the channel.The created channel.
- Provides a base class for channels that support reading and writing elements of type .
+
+ Provides a base class for channels that support reading and writing elements of type
+ .
+ Specifies the type of data readable and writable in the channel.Initializes an instance of the class.
- Provides a base class for channels that support reading elements of type and writing elements of type .
+
+ Provides a base class for channels that support reading elements of type
+ and writing elements of type .
+ Specifies the type of data that may be written to the channel.Specifies the type of data that may be read from the channel.Initializes an instance of the class.
-
+ Implicit cast from a to its readable half.
The being cast.
The readable half.
-
+ Implicit cast from a to its writable half.
The being cast.
The writable half.
@@ -100,23 +118,39 @@
Exception thrown when a channel is used after it's been closed.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The exception that is the cause of this exception.
-
- Initializes a new instance of the class with serialized data.
+
+
+ Initializes a new instance of the
+ class with serialized data.
+
The object that holds the serialized object data.
The contextual information about the source or destination.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The message that describes the error.
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
The message that describes the error.
The exception that is the cause of this exception.
@@ -129,17 +163,20 @@
if operations performed on a channel may synchronously invoke continuations subscribed to
- notifications of pending async operations; if all continuations should be invoked asynchronously.
+ notifications of pending async operations; if all continuations should be invoked asynchronously.
+
readers from the channel guarantee that there will only ever be at most one read operation at a time;
- if no such constraint is guaranteed.
+ if no such constraint is guaranteed.
+
if writers to the channel guarantee that there will only ever be at most one write operation
- at a time; if no such constraint is guaranteed.
+ at a time; if no such constraint is guaranteed.
+
Provides a base class for reading from a channel.
@@ -162,34 +199,49 @@
Attempts to peek at an item from the channel.
The peeked item, or a default value if no item could be peeked.
- if an item was read; otherwise, .
+ if an item was read; otherwise, .
+
Attempts to read an item from the channel.
The read item, or a default value if no item could be read.
- if an item was read; otherwise, .
+ if an item was read; otherwise, .
+
Returns a that will complete when data is available to read.
A used to cancel the wait operation.
- A that will complete with a result when data is available to read
- or with a result when no further data will ever be available to be read due to the channel completing successfully.
+
+ A that will complete with a
+ result when data is available to read
+ or with a result when no further data will ever be available to be read due to the channel completing successfully.
+ If the channel completes with an exception, the task will also complete with an exception.
- Gets a value that indicates whether is available for use on this instance.
+
+ Gets a value that indicates whether is available for use on this
+ instance.
+
- Gets a value that indicates whether is available for use on this instance.
+
+ Gets a value that indicates whether
+ is available for use on this
+ instance.
+
- if peeking is supported by this channel instance; otherwise.
+ if peeking is supported by this channel instance; otherwise.
+
- Gets a that completes when no more data will ever
- be available to be read from this channel.
+
+ Gets a that completes when no more data will ever
+ be available to be read from this channel.
+ Gets the current number of items available from this channel reader.
@@ -211,21 +263,26 @@
Attempts to mark the channel as being completed, meaning no more data will be written to it.
An indicating the failure causing no more data to be written, or null for success.
- if this operation successfully completes the channel; otherwise, if the channel could not be marked for completion,
- for example due to having already been marked as such, or due to not supporting completion.
- .
+ if this operation successfully completes the channel; otherwise,
+ if the channel could not be marked for completion,
+ for example due to having already been marked as such, or due to not supporting completion.
+ .
+
Attempts to write the specified item to the channel.
The item to write.
- if the item was written; otherwise, .
+ if the item was written; otherwise, .
+
Returns a that will complete when space is available to write an item.
A used to cancel the wait operation.
- A that will complete with a result when space is available to write an item
- or with a result when no further writing will be permitted.
+
+ A that will complete with a result when space is available to write an item
+ or with a result when no further writing will be permitted.
+ Asynchronously writes an item to the channel.
@@ -234,10 +291,16 @@
A that represents the asynchronous write operation.
- Provides options that control the behavior of unbounded instances.
+
+ Provides options that control the behavior of unbounded
+ instances.
+
- Initializes a new instance of the class.
+
+ Initializes a new instance of the
+ class.
+
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl
index b611994..64a2ca6 100644
--- a/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl
+++ b/Assets/TextMesh Pro/Shaders/SDFFunctions.hlsl
@@ -1,76 +1,77 @@
float2 UnpackUV(float uv)
{
- float2 output;
- output.x = floor(uv / 4096.0);
- output.y = uv - 4096.0 * output.x;
+ float2 output;
+ output.x = floor(uv / 4096.0);
+ output.y = uv - 4096.0 * output.x;
- return output * 0.001953125;
+ return output * 0.001953125;
}
float4 BlendARGB(float4 overlying, float4 underlying)
{
- overlying.rgb *= overlying.a;
- underlying.rgb *= underlying.a;
- float3 blended = overlying.rgb + ((1 - overlying.a) * underlying.rgb);
- float alpha = underlying.a + (1 - underlying.a) * overlying.a;
- return float4(blended / alpha, alpha);
+ overlying.rgb *= overlying.a;
+ underlying.rgb *= underlying.a;
+ float3 blended = overlying.rgb + ((1 - overlying.a) * underlying.rgb);
+ float alpha = underlying.a + (1 - underlying.a) * overlying.a;
+ return float4(blended / alpha, alpha);
}
float3 GetSpecular(float3 n, float3 l)
{
- float spec = pow(max(0.0, dot(n, l)), _Reflectivity);
- return _SpecularColor.rgb * spec * _SpecularPower;
+ float spec = pow(max(0.0, dot(n, l)), _Reflectivity);
+ return _SpecularColor.rgb * spec * _SpecularPower;
}
-void GetSurfaceNormal_float(texture2D atlas, float textureWidth, float textureHeight, float2 uv, bool isFront, out float3 nornmal)
+void GetSurfaceNormal_float(texture2D atlas, float textureWidth, float textureHeight, float2 uv, bool isFront,
+ out float3 nornmal)
{
- float3 delta = float3(1.0 / textureWidth, 1.0 / textureHeight, 0.0);
+ float3 delta = float3(1.0 / textureWidth, 1.0 / textureHeight, 0.0);
- // Read "height field"
- float4 h = float4(
- SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.xz).a,
- SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.xz).a,
- SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.zy).a,
- SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.zy).a);
+ // Read "height field"
+ float4 h = float4(
+ SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.xz).a,
+ SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.xz).a,
+ SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv - delta.zy).a,
+ SAMPLE_TEXTURE2D(atlas, SamplerState_Linear_Clamp, uv + delta.zy).a);
- bool raisedBevel = _BevelType;
+ bool raisedBevel = _BevelType;
- h += _BevelOffset;
+ h += _BevelOffset;
- float bevelWidth = max(.01, _BevelWidth);
+ float bevelWidth = max(.01, _BevelWidth);
- // Track outline
- h -= .5;
- h /= bevelWidth;
- h = saturate(h + .5);
+ // Track outline
+ h -= .5;
+ h /= bevelWidth;
+ h = saturate(h + .5);
- if (raisedBevel) h = 1 - abs(h * 2.0 - 1.0);
- h = lerp(h, sin(h * 3.141592 / 2.0), float4(_BevelRoundness, _BevelRoundness, _BevelRoundness, _BevelRoundness));
- h = min(h, 1.0 - float4(_BevelClamp, _BevelClamp, _BevelClamp, _BevelClamp));
- h *= _BevelAmount * bevelWidth * _GradientScale * -2.0;
+ if (raisedBevel) h = 1 - abs(h * 2.0 - 1.0);
+ h = lerp(h, sin(h * 3.141592 / 2.0), float4(_BevelRoundness, _BevelRoundness, _BevelRoundness, _BevelRoundness));
+ h = min(h, 1.0 - float4(_BevelClamp, _BevelClamp, _BevelClamp, _BevelClamp));
+ h *= _BevelAmount * bevelWidth * _GradientScale * -2.0;
- float3 va = normalize(float3(-1.0, 0.0, h.y - h.x));
- float3 vb = normalize(float3(0.0, 1.0, h.w - h.z));
+ float3 va = normalize(float3(-1.0, 0.0, h.y - h.x));
+ float3 vb = normalize(float3(0.0, 1.0, h.w - h.z));
- float3 f = float3(1, 1, 1);
- if (isFront) f = float3(1, 1, -1);
- nornmal = cross(va, vb) * f;
+ float3 f = float3(1, 1, 1);
+ if (isFront) f = float3(1, 1, -1);
+ nornmal = cross(va, vb) * f;
}
void EvaluateLight_float(float4 faceColor, float3 n, out float4 color)
{
- n.z = abs(n.z);
- float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), 1.0));
+ n.z = abs(n.z);
+ float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), 1.0));
- float3 col = max(faceColor.rgb, 0) + GetSpecular(n, light)* faceColor.a;
- //faceColor.rgb += col * faceColor.a;
- col *= 1 - (dot(n, light) * _Diffuse);
- col *= lerp(_Ambient, 1, n.z * n.z);
+ float3 col = max(faceColor.rgb, 0) + GetSpecular(n, light) * faceColor.a;
+ //faceColor.rgb += col * faceColor.a;
+ col *= 1 - (dot(n, light) * _Diffuse);
+ col *= lerp(_Ambient, 1, n.z * n.z);
- //fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
- //faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
+ //fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
+ //faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
- color = float4(col, faceColor.a);
+ color = float4(col, faceColor.a);
}
// Add custom function to handle time in HDRP
@@ -79,19 +80,20 @@ void EvaluateLight_float(float4 faceColor, float3 n, out float4 color)
//
void GenerateUV_float(float2 inUV, float4 transform, float2 animSpeed, out float2 outUV)
{
- outUV = inUV * transform.xy + transform.zw + (animSpeed * _Time.y);
+ outUV = inUV * transform.xy + transform.zw + (animSpeed * _Time.y);
}
void ComputeUVOffset_float(float texWidth, float texHeight, float2 offset, float SDR, out float2 uvOffset)
{
- uvOffset = float2(-offset.x * SDR / texWidth, -offset.y * SDR / texHeight);
+ uvOffset = float2(-offset.x * SDR / texWidth, -offset.y * SDR / texHeight);
}
-void ScreenSpaceRatio2_float(float4x4 projection, float4 position, float2 objectScale, float screenWidth, float screenHeight, float fontScale, out float SSR)
+void ScreenSpaceRatio2_float(float4x4 projection, float4 position, float2 objectScale, float screenWidth,
+ float screenHeight, float fontScale, out float SSR)
{
- float2 pixelSize = position.w;
- pixelSize /= (objectScale * mul((float2x2)projection, float2(screenWidth, screenHeight)));
- SSR = rsqrt(dot(pixelSize, pixelSize)*2) * fontScale;
+ float2 pixelSize = position.w;
+ pixelSize /= (objectScale * mul((float2x2)projection, float2(screenWidth, screenHeight)));
+ SSR = rsqrt(dot(pixelSize, pixelSize) * 2) * fontScale;
}
// UV : Texture coordinate of the source distance field texture
@@ -99,18 +101,18 @@ void ScreenSpaceRatio2_float(float4x4 projection, float4 position, float2 object
// Filter : Enable perspective filter (soften)
void ScreenSpaceRatio_float(float2 UV, float TextureSize, bool Filter, out float SSR)
{
- if(Filter)
- {
- float2 a = float2(ddx(UV.x), ddy(UV.x));
- float2 b = float2(ddx(UV.y), ddy(UV.y));
- float s = lerp(dot(a,a), dot(b,b), 0.5);
- SSR = rsqrt(s) / TextureSize;
- }
- else
- {
- float s = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y)));
- SSR = s / TextureSize;
- }
+ if (Filter)
+ {
+ float2 a = float2(ddx(UV.x), ddy(UV.x));
+ float2 b = float2(ddx(UV.y), ddy(UV.y));
+ float s = lerp(dot(a, a), dot(b, b), 0.5);
+ SSR = rsqrt(s) / TextureSize;
+ }
+ else
+ {
+ float s = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y)));
+ SSR = s / TextureSize;
+ }
}
// SSR : Screen Space Ratio
@@ -120,59 +122,65 @@ void ScreenSpaceRatio_float(float2 UV, float TextureSize, bool Filter, out float
// IsoPerimeter : Dilate / Contract the shape
void ComputeSDF_float(float SSR, float SD, float SDR, float isoPerimeter, float softness, out float outAlpha)
{
- softness *= SSR * SDR;
- float d = (SD - 0.5) * SDR; // Signed distance to edge, in Texture space
- outAlpha = saturate((d * 2.0 * SSR + 0.5 + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness)); // Screen pixel coverage (alpha)
+ softness *= SSR * SDR;
+ float d = (SD - 0.5) * SDR; // Signed distance to edge, in Texture space
+ outAlpha = saturate((d * 2.0 * SSR + 0.5 + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
+ // Screen pixel coverage (alpha)
}
void ComputeSDF2_float(float SSR, float SD, float SDR, float2 isoPerimeter, float2 softness, out float2 outAlpha)
{
- softness *= SSR * SDR;
- float d = (SD - 0.5f) * SDR;
- outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
+ softness *= SSR * SDR;
+ float d = (SD - 0.5f) * SDR;
+ outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
}
void ComputeSDF4_float(float SSR, float SD, float SDR, float4 isoPerimeter, float4 softness, out float4 outAlpha)
{
- softness *= SSR * SDR;
- float d = (SD - 0.5f) * SDR;
- outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
+ softness *= SSR * SDR;
+ float d = (SD - 0.5f) * SDR;
+ outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
}
-void ComputeSDF44_float(float SSR, float4 SD, float SDR, float4 isoPerimeter, float4 softness, bool outline, out float4 outAlpha)
+void ComputeSDF44_float(float SSR, float4 SD, float SDR, float4 isoPerimeter, float4 softness, bool outline,
+ out float4 outAlpha)
{
- softness *= SSR * SDR;
- float4 d = (SD - 0.5f) * SDR;
- if(outline) d.w = max(max(d.x, d.y), d.z);
- outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
+ softness *= SSR * SDR;
+ float4 d = (SD - 0.5f) * SDR;
+ if (outline) d.w = max(max(d.x, d.y), d.z);
+ outAlpha = saturate((d * 2.0f * SSR + 0.5f + isoPerimeter * SDR * SSR + softness * 0.5) / (1.0 + softness));
}
void Composite_float(float4 overlying, float4 underlying, out float4 outColor)
{
- outColor = BlendARGB(overlying, underlying);
+ outColor = BlendARGB(overlying, underlying);
}
// Face only
void Layer1_float(float alpha, float4 color0, out float4 outColor)
{
- color0.a *= alpha;
- outColor = color0;
+ color0.a *= alpha;
+ outColor = color0;
}
// Face + 1 Outline
void Layer2_float(float2 alpha, float4 color0, float4 color1, out float4 outColor)
{
- color1.a *= alpha.y;
- color0.rgb *= color0.a; color1.rgb *= color1.a;
- outColor = lerp(color1, color0, alpha.x);
- outColor.rgb /= outColor.a;
+ color1.a *= alpha.y;
+ color0.rgb *= color0.a;
+ color1.rgb *= color1.a;
+ outColor = lerp(color1, color0, alpha.x);
+ outColor.rgb /= outColor.a;
}
// Face + 3 Outline
void Layer4_float(float4 alpha, float4 color0, float4 color1, float4 color2, float4 color3, out float4 outColor)
{
- color3.a *= alpha.w;
- color0.rgb *= color0.a; color1.rgb *= color1.a; color2.rgb *= color2.a; color3.rgb *= color3.a;
- outColor = lerp(lerp(lerp(color3, color2, alpha.z), color1, alpha.y), color0, alpha.x);
- outColor.rgb /= outColor.a;
-}
+ color3.a *= alpha.w;
+ color0.rgb *= color0.a;
+ color1.rgb *= color1.a;
+ color2.rgb *= color2.a;
+ color3.rgb *= color3.a;
+ outColor = lerp(lerp(lerp(color3, color2, alpha.z), color1, alpha.y), color0, alpha.x);
+ outColor.rgb /= outColor.a;
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader
index 7e0f35c..36d6ec2 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader
@@ -1,145 +1,158 @@
-Shader "TextMeshPro/Bitmap Custom Atlas" {
-
-Properties {
- _MainTex ("Font Atlas", 2D) = "white" {}
- _FaceTex ("Font Texture", 2D) = "white" {}
- _FaceColor ("Text Color", Color) = (1,1,1,1)
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _Padding ("Padding", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader{
-
- Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
-
- Stencil
- {
- Ref[_Stencil]
- Comp[_StencilComp]
- Pass[_StencilOp]
- ReadMask[_StencilReadMask]
- WriteMask[_StencilWriteMask]
- }
-
-
- Lighting Off
- Cull [_CullMode]
- ZTest [unity_GUIZTestMode]
- ZWrite Off
- Fog { Mode Off }
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask[_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
-
- struct appdata_t
- {
- float4 vertex : POSITION;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct v2f
- {
- float4 vertex : SV_POSITION;
- fixed4 color : COLOR;
- float2 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- float4 mask : TEXCOORD2;
- };
-
- uniform sampler2D _MainTex;
- uniform sampler2D _FaceTex;
- uniform float4 _FaceTex_ST;
- uniform fixed4 _FaceColor;
-
- uniform float _VertexOffsetX;
- uniform float _VertexOffsetY;
- uniform float4 _ClipRect;
- uniform float _MaskSoftnessX;
- uniform float _MaskSoftnessY;
- uniform float _UIMaskSoftnessX;
- uniform float _UIMaskSoftnessY;
- uniform int _UIVertexColorAlwaysGammaSpace;
-
- v2f vert (appdata_t v)
- {
- float4 vert = v.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
-
- float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Bitmap Custom Atlas"
+{
+
+ Properties
+ {
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _FaceTex ("Font Texture", 2D) = "white" {}
+ _FaceColor ("Text Color", Color) = (1,1,1,1)
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _Padding ("Padding", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"
+ }
+
+ Stencil
+ {
+ Ref[_Stencil]
+ Comp[_StencilComp]
+ Pass[_StencilOp]
+ ReadMask[_StencilReadMask]
+ WriteMask[_StencilWriteMask]
+ }
+
+
+ Lighting Off
+ Cull [_CullMode]
+ ZTest [unity_GUIZTestMode]
+ ZWrite Off
+ Fog
+ {
+ Mode Off
+ }
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask[_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+
+ struct appdata_t
{
- v.color.rgb = UIGammaToLinear(v.color.rgb);
+ float4 vertex : POSITION;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ float4 mask : TEXCOORD2;
+ };
+
+ uniform sampler2D _MainTex;
+ uniform sampler2D _FaceTex;
+ uniform float4 _FaceTex_ST;
+ uniform fixed4 _FaceColor;
+
+ uniform float _VertexOffsetX;
+ uniform float _VertexOffsetY;
+ uniform float4 _ClipRect;
+ uniform float _MaskSoftnessX;
+ uniform float _MaskSoftnessY;
+ uniform float _UIMaskSoftnessX;
+ uniform float _UIMaskSoftnessY;
+ uniform int _UIVertexColorAlwaysGammaSpace;
+
+ v2f vert(appdata_t v)
+ {
+ float4 vert = v.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
+
+ float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ v.color.rgb = UIGammaToLinear(v.color.rgb);
+ }
+ fixed4 faceColor = v.color;
+ faceColor *= _FaceColor;
+
+ v2f OUT;
+ OUT.vertex = vPosition;
+ OUT.color = faceColor;
+ OUT.texcoord0 = v.texcoord0;
+ OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex);
+ float2 pixelSize = vPosition.w;
+ pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0],
+ _ScreenParams.y * UNITY_MATRIX_P[1][1]));
+
+ // Clamp _ClipRect to 16bit.
+ const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+
+ return OUT;
+ }
+
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ fixed4 color = tex2D(_MainTex, IN.texcoord0) * tex2D(_FaceTex, IN.texcoord1) * IN.color;
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
+ color *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(color.a - 0.001);
+ #endif
+
+ return color;
}
- fixed4 faceColor = v.color;
- faceColor *= _FaceColor;
-
- v2f OUT;
- OUT.vertex = vPosition;
- OUT.color = faceColor;
- OUT.texcoord0 = v.texcoord0;
- OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex);
- float2 pixelSize = vPosition.w;
- pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
-
- // Clamp _ClipRect to 16bit.
- const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
-
- return OUT;
- }
-
- fixed4 frag (v2f IN) : SV_Target
- {
- fixed4 color = tex2D(_MainTex, IN.texcoord0) * tex2D(_FaceTex, IN.texcoord1) * IN.color;
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
- color *= m.x * m.y;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(color.a - 0.001);
- #endif
-
- return color;
- }
- ENDCG
- }
-}
-
- CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
-}
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader
index b89e267..e36bab5 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader
@@ -1,155 +1,176 @@
-Shader "TextMeshPro/Mobile/Bitmap" {
-
-Properties {
- _MainTex ("Font Atlas", 2D) = "white" {}
- _Color ("Text Color", Color) = (1,1,1,1)
- _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
-
- Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
-
- Stencil
- {
- Ref[_Stencil]
- Comp[_StencilComp]
- Pass[_StencilOp]
- ReadMask[_StencilReadMask]
- WriteMask[_StencilWriteMask]
- }
-
-
- Lighting Off
- Cull [_CullMode]
- ZTest [unity_GUIZTestMode]
- ZWrite Off
- Fog { Mode Off }
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask[_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma fragmentoption ARB_precision_hint_fastest
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
-
- struct appdata_t
- {
- float4 vertex : POSITION;
- fixed4 color : COLOR;
- float2 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct v2f
- {
- float4 vertex : POSITION;
- fixed4 color : COLOR;
- float2 texcoord0 : TEXCOORD0;
- float4 mask : TEXCOORD2;
- };
-
- sampler2D _MainTex;
- fixed4 _Color;
- float _DiffusePower;
-
- uniform float _VertexOffsetX;
- uniform float _VertexOffsetY;
- uniform float4 _ClipRect;
- uniform float _MaskSoftnessX;
- uniform float _MaskSoftnessY;
- uniform float _UIMaskSoftnessX;
- uniform float _UIMaskSoftnessY;
- uniform int _UIVertexColorAlwaysGammaSpace;
-
- v2f vert (appdata_t v)
- {
- v2f OUT;
- float4 vert = v.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Mobile/Bitmap"
+{
+
+ Properties
+ {
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _Color ("Text Color", Color) = (1,1,1,1)
+ _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref[_Stencil]
+ Comp[_StencilComp]
+ Pass[_StencilOp]
+ ReadMask[_StencilReadMask]
+ WriteMask[_StencilWriteMask]
+ }
+
+
+ Lighting Off
+ Cull [_CullMode]
+ ZTest [unity_GUIZTestMode]
+ ZWrite Off
+ Fog
+ {
+ Mode Off
+ }
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask[_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #pragma fragmentoption ARB_precision_hint_fastest
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+
+ struct appdata_t
{
- v.color.rgb = UIGammaToLinear(v.color.rgb);
+ float4 vertex : POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct v2f
+ {
+ float4 vertex : POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord0 : TEXCOORD0;
+ float4 mask : TEXCOORD2;
+ };
+
+ sampler2D _MainTex;
+ fixed4 _Color;
+ float _DiffusePower;
+
+ uniform float _VertexOffsetX;
+ uniform float _VertexOffsetY;
+ uniform float4 _ClipRect;
+ uniform float _MaskSoftnessX;
+ uniform float _MaskSoftnessY;
+ uniform float _UIMaskSoftnessX;
+ uniform float _UIMaskSoftnessY;
+ uniform int _UIVertexColorAlwaysGammaSpace;
+
+ v2f vert(appdata_t v)
+ {
+ v2f OUT;
+ float4 vert = v.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ v.color.rgb = UIGammaToLinear(v.color.rgb);
+ }
+ OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert));
+ OUT.color = v.color;
+ OUT.color *= _Color;
+ OUT.color.rgb *= _DiffusePower;
+ OUT.texcoord0 = v.texcoord0;
+
+ float2 pixelSize = OUT.vertex.w;
+ //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
+
+ // Clamp _ClipRect to 16bit.
+ const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+
+ return OUT;
}
- OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert));
- OUT.color = v.color;
- OUT.color *= _Color;
- OUT.color.rgb *= _DiffusePower;
- OUT.texcoord0 = v.texcoord0;
-
- float2 pixelSize = OUT.vertex.w;
- //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
-
- // Clamp _ClipRect to 16bit.
- const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
-
- return OUT;
- }
-
- fixed4 frag (v2f IN) : COLOR
- {
- fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a);
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
- color *= m.x * m.y;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(color.a - 0.001);
- #endif
-
- return color;
- }
- ENDCG
- }
-}
-
-SubShader {
- Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
- Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off }
- Blend SrcAlpha OneMinusSrcAlpha
- BindChannels {
- Bind "Color", color
- Bind "Vertex", vertex
- Bind "TexCoord", texcoord0
- }
- Pass {
- SetTexture [_MainTex] {
- constantColor [_Color] combine constant * primary, constant * texture
- }
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
-}
+
+ fixed4 frag(v2f IN) : COLOR
+ {
+ fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a);
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
+ color *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(color.a - 0.001);
+ #endif
+
+ return color;
+ }
+ ENDCG
+ }
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"
+ }
+ Lighting Off Cull Off ZTest Always ZWrite Off Fog
+ {
+ Mode Off
+ }
+ Blend SrcAlpha OneMinusSrcAlpha
+ BindChannels
+ {
+ Bind "Color", color
+ Bind "Vertex", vertex
+ Bind "TexCoord", texcoord0
+ }
+ Pass
+ {
+ SetTexture [_MainTex] {
+ constantColor [_Color] combine constant * primary, constant * texture
+ }
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader b/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader
index caa527f..af540c8 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader
@@ -1,145 +1,158 @@
-Shader "TextMeshPro/Bitmap" {
-
-Properties {
- _MainTex ("Font Atlas", 2D) = "white" {}
- _FaceTex ("Font Texture", 2D) = "white" {}
- _FaceColor ("Text Color", Color) = (1,1,1,1)
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader{
-
- Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
-
- Stencil
- {
- Ref[_Stencil]
- Comp[_StencilComp]
- Pass[_StencilOp]
- ReadMask[_StencilReadMask]
- WriteMask[_StencilWriteMask]
- }
-
-
- Lighting Off
- Cull [_CullMode]
- ZTest [unity_GUIZTestMode]
- ZWrite Off
- Fog { Mode Off }
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask[_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
-
- struct appdata_t
- {
- float4 vertex : POSITION;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct v2f
- {
- float4 vertex : SV_POSITION;
- fixed4 color : COLOR;
- float2 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- float4 mask : TEXCOORD2;
- };
-
- uniform sampler2D _MainTex;
- uniform sampler2D _FaceTex;
- uniform float4 _FaceTex_ST;
- uniform fixed4 _FaceColor;
-
- uniform float _VertexOffsetX;
- uniform float _VertexOffsetY;
- uniform float4 _ClipRect;
- uniform float _MaskSoftnessX;
- uniform float _MaskSoftnessY;
- uniform float _UIMaskSoftnessX;
- uniform float _UIMaskSoftnessY;
- uniform int _UIVertexColorAlwaysGammaSpace;
-
- v2f vert (appdata_t v)
- {
- float4 vert = v.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
-
- float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Bitmap"
+{
+
+ Properties
+ {
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _FaceTex ("Font Texture", 2D) = "white" {}
+ _FaceColor ("Text Color", Color) = (1,1,1,1)
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"
+ }
+
+ Stencil
+ {
+ Ref[_Stencil]
+ Comp[_StencilComp]
+ Pass[_StencilOp]
+ ReadMask[_StencilReadMask]
+ WriteMask[_StencilWriteMask]
+ }
+
+
+ Lighting Off
+ Cull [_CullMode]
+ ZTest [unity_GUIZTestMode]
+ ZWrite Off
+ Fog
+ {
+ Mode Off
+ }
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask[_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+
+ struct appdata_t
{
- v.color.rgb = UIGammaToLinear(v.color.rgb);
+ float4 vertex : POSITION;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ float4 mask : TEXCOORD2;
+ };
+
+ uniform sampler2D _MainTex;
+ uniform sampler2D _FaceTex;
+ uniform float4 _FaceTex_ST;
+ uniform fixed4 _FaceColor;
+
+ uniform float _VertexOffsetX;
+ uniform float _VertexOffsetY;
+ uniform float4 _ClipRect;
+ uniform float _MaskSoftnessX;
+ uniform float _MaskSoftnessY;
+ uniform float _UIMaskSoftnessX;
+ uniform float _UIMaskSoftnessY;
+ uniform int _UIVertexColorAlwaysGammaSpace;
+
+ v2f vert(appdata_t v)
+ {
+ float4 vert = v.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
+
+ float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ v.color.rgb = UIGammaToLinear(v.color.rgb);
+ }
+ fixed4 faceColor = v.color;
+ faceColor *= _FaceColor;
+
+ v2f OUT;
+ OUT.vertex = vPosition;
+ OUT.color = faceColor;
+ OUT.texcoord0 = v.texcoord0;
+ OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex);
+ float2 pixelSize = vPosition.w;
+ pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0],
+ _ScreenParams.y * UNITY_MATRIX_P[1][1]));
+
+ // Clamp _ClipRect to 16bit.
+ const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+
+ return OUT;
+ }
+
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ fixed4 color = tex2D(_MainTex, IN.texcoord0);
+ color = fixed4(tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a);
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
+ color *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(color.a - 0.001);
+ #endif
+
+ return color;
}
- fixed4 faceColor = v.color;
- faceColor *= _FaceColor;
-
- v2f OUT;
- OUT.vertex = vPosition;
- OUT.color = faceColor;
- OUT.texcoord0 = v.texcoord0;
- OUT.texcoord1 = TRANSFORM_TEX(v.texcoord1, _FaceTex);
- float2 pixelSize = vPosition.w;
- pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
-
- // Clamp _ClipRect to 16bit.
- const float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
-
- return OUT;
- }
-
- fixed4 frag (v2f IN) : SV_Target
- {
- fixed4 color = tex2D(_MainTex, IN.texcoord0);
- color = fixed4 (tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a);
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
- color *= m.x * m.y;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(color.a - 0.001);
- #endif
-
- return color;
- }
- ENDCG
- }
-}
-
- CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
-}
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader
index 757a617..7c8ba9b 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader
@@ -1,326 +1,343 @@
-Shader "TextMeshPro/Distance Field Overlay" {
-
-Properties {
- _FaceTex ("Face Texture", 2D) = "white" {}
- _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
- _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineTex ("Outline Texture", 2D) = "white" {}
- _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
- _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
- _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _Bevel ("Bevel", Range(0,1)) = 0.5
- _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
- _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
- _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
- _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
-
- _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
- _SpecularColor ("Specular", Color) = (1,1,1,1)
- _SpecularPower ("Specular", Range(0,4)) = 2.0
- _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
- _Diffuse ("Diffuse", Range(0,1)) = 0.5
- _Ambient ("Ambient", Range(1,0)) = 0.5
-
- _BumpMap ("Normal map", 2D) = "bump" {}
- _BumpOutline ("Bump Outline", Range(0,1)) = 0
- _BumpFace ("Bump Face", Range(0,1)) = 0
-
- _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
- _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
- _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
- _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
-
-
- _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
- _GlowOffset ("Offset", Range(-1,1)) = 0
- _GlowInner ("Inner", Range(0,1)) = 0.05
- _GlowOuter ("Outer", Range(0,1)) = 0.05
- _GlowPower ("Falloff", Range(1, 0)) = 0.75
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = 0.5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5.0
- _ScaleX ("Scale X", float) = 1.0
- _ScaleY ("Scale Y", float) = 1.0
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
-
- Tags
- {
- "Queue"="Overlay"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest Always
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma target 3.0
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ BEVEL_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
- #pragma shader_feature __ GLOW_ON
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
- #include "TMPro.cginc"
-
- struct vertex_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 position : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 position : SV_POSITION;
- fixed4 color : COLOR;
- float2 atlas : TEXCOORD0; // Atlas
- float4 param : TEXCOORD1; // alphaClip, scale, bias, weight
- float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw)
- float3 viewDir : TEXCOORD3;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 texcoord2 : TEXCOORD4; // u,v, scale, bias
- fixed4 underlayColor : COLOR1;
- #endif
-
- float4 textures : TEXCOORD5;
- };
-
- // Used by Unity internally to handle Texture Tiling and Offset.
- uniform float4 _FaceTex_ST;
- uniform float4 _OutlineTex_ST;
- uniform float _UIMaskSoftnessX;
- uniform float _UIMaskSoftnessY;
- uniform int _UIVertexColorAlwaysGammaSpace;
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input,output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.position;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float bias =(.5 - weight) + (.5 / scale);
-
- float alphaClip = (1.0 - _OutlineWidth*_ScaleRatioA - _OutlineSoftness*_ScaleRatioA);
-
- #if GLOW_ON
- alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB);
- #endif
-
- alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 underlayColor = _UnderlayColor;
- underlayColor.rgb *= underlayColor.a;
-
- float bScale = scale;
- bScale /= 1 + ((_UnderlaySoftness*_ScaleRatioC) * bScale);
- float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 bOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
-
- // Support for texture tiling and offset
- float2 textureUV = input.texcoord1;
- float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
- float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
-
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Distance Field Overlay"
+{
+
+ Properties
+ {
+ _FaceTex ("Face Texture", 2D) = "white" {}
+ _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
+ _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineTex ("Outline Texture", 2D) = "white" {}
+ _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
+ _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
+ _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _Bevel ("Bevel", Range(0,1)) = 0.5
+ _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
+ _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
+ _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
+ _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
+
+ _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
+ _SpecularColor ("Specular", Color) = (1,1,1,1)
+ _SpecularPower ("Specular", Range(0,4)) = 2.0
+ _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
+ _Diffuse ("Diffuse", Range(0,1)) = 0.5
+ _Ambient ("Ambient", Range(1,0)) = 0.5
+
+ _BumpMap ("Normal map", 2D) = "bump" {}
+ _BumpOutline ("Bump Outline", Range(0,1)) = 0
+ _BumpFace ("Bump Face", Range(0,1)) = 0
+
+ _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
+ _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
+ _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
+ _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
+
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
+ _GlowOffset ("Offset", Range(-1,1)) = 0
+ _GlowInner ("Inner", Range(0,1)) = 0.05
+ _GlowOuter ("Outer", Range(0,1)) = 0.05
+ _GlowPower ("Falloff", Range(1, 0)) = 0.75
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = 0.5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5.0
+ _ScaleX ("Scale X", float) = 1.0
+ _ScaleY ("Scale Y", float) = 1.0
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue"="Overlay"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest Always
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma target 3.0
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ BEVEL_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+ #pragma shader_feature __ GLOW_ON
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+ #include "TMPro.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 position : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 position : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 atlas : TEXCOORD0; // Atlas
+ float4 param : TEXCOORD1; // alphaClip, scale, bias, weight
+ float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw)
+ float3 viewDir : TEXCOORD3;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float4 texcoord2 : TEXCOORD4; // u,v, scale, bias
+ fixed4 underlayColor : COLOR1;
+ #endif
+
+ float4 textures : TEXCOORD5;
+ };
+
+ // Used by Unity internally to handle Texture Tiling and Offset.
+ uniform float4 _FaceTex_ST;
+ uniform float4 _OutlineTex_ST;
+ uniform float _UIMaskSoftnessX;
+ uniform float _UIMaskSoftnessY;
+ uniform int _UIVertexColorAlwaysGammaSpace;
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.position;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float bias = (.5 - weight) + (.5 / scale);
+
+ float alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _OutlineSoftness * _ScaleRatioA);
+
+ #if GLOW_ON
+ alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB);
+ #endif
+
+ alphaClip = alphaClip / 2.0 - (.5 / scale) - weight;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float4 underlayColor = _UnderlayColor;
+ underlayColor.rgb *= underlayColor.a;
+
+ float bScale = scale;
+ bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale);
+ float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 bOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+
+ // Support for texture tiling and offset
+ float2 textureUV = input.texcoord1;
+ float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
+ float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
+
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ output.position = vPosition;
+ output.color = input.color;
+ output.atlas = input.texcoord0;
+ output.param = float4(alphaClip, scale, bias, weight);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ output.viewDir = mul((float3x3)_EnvMatrix,
+ _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert)
+ .xyz);
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias);
+ output.underlayColor = underlayColor;
+ #endif
+ output.textures = float4(faceUV, outlineUV);
+
+ return output;
+ }
+
+
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ float c = tex2D(_MainTex, input.atlas).a;
+
+ #ifndef UNDERLAY_ON
+ clip(c - input.param.x);
+ #endif
+
+ float scale = input.param.y;
+ float bias = input.param.z;
+ float weight = input.param.w;
+ float sd = (bias - c) * scale;
+
+ float outline = (_OutlineWidth * _ScaleRatioA) * scale;
+ float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
+
+ half4 faceColor = _FaceColor;
+ half4 outlineColor = _OutlineColor;
+
+ faceColor.rgb *= input.color.rgb;
+
+ faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
+ outlineColor *= tex2D(_OutlineTex,
+ input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
+
+ faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
+
+ #if BEVEL_ON
+ float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
+ float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
+
+ float3 bump = UnpackNormal(
+ tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
+ bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
+ n = normalize(n - bump);
+
+ float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
+
+ float3 col = GetSpecular(n, light);
+ faceColor.rgb += col * faceColor.a;
+ faceColor.rgb *= 1 - (dot(n, light) * _Diffuse);
+ faceColor.rgb *= lerp(_Ambient, 1, n.z * n.z);
+
+ fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
+ faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb,
+ saturate(sd + outline * 0.5)) * faceColor.a;
+ #endif
+
+ #if UNDERLAY_ON
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
+ faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
+ faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 -
+ faceColor.a);
+ #endif
+
+ #if GLOW_ON
+ float4 glowColor = GetGlowColor(sd, scale);
+ faceColor.rgb += glowColor.rgb * glowColor.a;
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ faceColor *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(faceColor.a - 0.001);
+ #endif
+
+ return faceColor * input.color.a;
}
- output.position = vPosition;
- output.color = input.color;
- output.atlas = input.texcoord0;
- output.param = float4(alphaClip, scale, bias, weight);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
- output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz);
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias);
- output.underlayColor = underlayColor;
- #endif
- output.textures = float4(faceUV, outlineUV);
-
- return output;
- }
-
-
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
-
- float c = tex2D(_MainTex, input.atlas).a;
-
- #ifndef UNDERLAY_ON
- clip(c - input.param.x);
- #endif
-
- float scale = input.param.y;
- float bias = input.param.z;
- float weight = input.param.w;
- float sd = (bias - c) * scale;
-
- float outline = (_OutlineWidth * _ScaleRatioA) * scale;
- float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
-
- half4 faceColor = _FaceColor;
- half4 outlineColor = _OutlineColor;
-
- faceColor.rgb *= input.color.rgb;
-
- faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
- outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
-
- faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
-
- #if BEVEL_ON
- float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
- float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
-
- float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
- bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
- n = normalize(n- bump);
-
- float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
-
- float3 col = GetSpecular(n, light);
- faceColor.rgb += col*faceColor.a;
- faceColor.rgb *= 1-(dot(n, light)*_Diffuse);
- faceColor.rgb *= lerp(_Ambient, 1, n.z*n.z);
-
- fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
- faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
- #endif
-
- #if UNDERLAY_ON
- float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
- faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a);
- #endif
-
- #if UNDERLAY_INNER
- float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
- faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a);
- #endif
-
- #if GLOW_ON
- float4 glowColor = GetGlowColor(sd, scale);
- faceColor.rgb += glowColor.rgb * glowColor.a;
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- faceColor *= m.x * m.y;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(faceColor.a - 0.001);
- #endif
-
- return faceColor * input.color.a;
- }
- ENDCG
- }
-}
-
-Fallback "TextMeshPro/Mobile/Distance Field"
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+ ENDCG
+ }
+ }
+
+ Fallback "TextMeshPro/Mobile/Distance Field"
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader
index 27c14bc..29412b3 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader
@@ -1,321 +1,333 @@
-Shader "TextMeshPro/Distance Field SSD" {
-
-Properties {
- _FaceTex ("Face Texture", 2D) = "white" {}
- _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
- _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineTex ("Outline Texture", 2D) = "white" {}
- _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
- _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
- _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _Bevel ("Bevel", Range(0,1)) = 0.5
- _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
- _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
- _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
- _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
-
- _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
- _SpecularColor ("Specular", Color) = (1,1,1,1)
- _SpecularPower ("Specular", Range(0,4)) = 2.0
- _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
- _Diffuse ("Diffuse", Range(0,1)) = 0.5
- _Ambient ("Ambient", Range(1,0)) = 0.5
-
- _BumpMap ("Normal map", 2D) = "bump" {}
- _BumpOutline ("Bump Outline", Range(0,1)) = 0
- _BumpFace ("Bump Face", Range(0,1)) = 0
-
- _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
- _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
- _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
- _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
-
-
- _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
- _GlowOffset ("Offset", Range(-1,1)) = 0
- _GlowInner ("Inner", Range(0,1)) = 0.05
- _GlowOuter ("Outer", Range(0,1)) = 0.05
- _GlowPower ("Falloff", Range(1, 0)) = 0.75
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = 0.5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5.0
- _ScaleX ("Scale X", float) = 1.0
- _ScaleY ("Scale Y", float) = 1.0
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
- Tags
- {
- "Queue" = "Transparent"
- "IgnoreProjector" = "True"
- "RenderType" = "Transparent"
- }
+Shader "TextMeshPro/Distance Field SSD"
+{
- Stencil
+ Properties
{
- Ref[_Stencil]
- Comp[_StencilComp]
- Pass[_StencilOp]
- ReadMask[_StencilReadMask]
- WriteMask[_StencilWriteMask]
+ _FaceTex ("Face Texture", 2D) = "white" {}
+ _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
+ _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineTex ("Outline Texture", 2D) = "white" {}
+ _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
+ _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
+ _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _Bevel ("Bevel", Range(0,1)) = 0.5
+ _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
+ _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
+ _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
+ _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
+
+ _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
+ _SpecularColor ("Specular", Color) = (1,1,1,1)
+ _SpecularPower ("Specular", Range(0,4)) = 2.0
+ _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
+ _Diffuse ("Diffuse", Range(0,1)) = 0.5
+ _Ambient ("Ambient", Range(1,0)) = 0.5
+
+ _BumpMap ("Normal map", 2D) = "bump" {}
+ _BumpOutline ("Bump Outline", Range(0,1)) = 0
+ _BumpFace ("Bump Face", Range(0,1)) = 0
+
+ _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
+ _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
+ _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
+ _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
+
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
+ _GlowOffset ("Offset", Range(-1,1)) = 0
+ _GlowInner ("Inner", Range(0,1)) = 0.05
+ _GlowOuter ("Outer", Range(0,1)) = 0.05
+ _GlowPower ("Falloff", Range(1, 0)) = 0.75
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = 0.5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5.0
+ _ScaleX ("Scale X", float) = 1.0
+ _ScaleY ("Scale Y", float) = 1.0
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
}
- Cull[_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest[unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask[_ColorMask]
-
- Pass
+ SubShader
{
- CGPROGRAM
- #pragma target 3.0
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ BEVEL_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
- #pragma shader_feature __ GLOW_ON
- #pragma shader_feature __ FORCE_LINEAR
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
- #include "TMPro.cginc"
-
- struct vertex_t
+ Tags
{
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 position : POSITION;
- float3 normal : NORMAL;
- float4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 position : SV_POSITION;
- float4 color : COLOR;
- float2 atlas : TEXCOORD0;
- float weight : TEXCOORD1;
- float2 mask : TEXCOORD2; // Position in object space(xy)
- float3 viewDir : TEXCOORD3;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float2 texcoord2 : TEXCOORD4;
- float4 underlayColor : COLOR1;
- #endif
-
- float4 textures : TEXCOORD5;
- };
-
- // Used by Unity internally to handle Texture Tiling and Offset.
- float4 _FaceTex_ST;
- float4 _OutlineTex_ST;
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
- float4 SRGBToLinear(float4 rgba)
- {
- return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a);
+ "Queue" = "Transparent"
+ "IgnoreProjector" = "True"
+ "RenderType" = "Transparent"
}
- pixel_t VertShader(vertex_t input)
+ Stencil
{
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input,output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.position;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 underlayColor = _UnderlayColor;
- underlayColor.rgb *= underlayColor.a;
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 bOffset = float2(x, y);
- #endif
+ Ref[_Stencil]
+ Comp[_StencilComp]
+ Pass[_StencilOp]
+ ReadMask[_StencilReadMask]
+ WriteMask[_StencilWriteMask]
+ }
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ Cull[_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest[unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask[_ColorMask]
- // Support for texture tiling and offset
- float2 textureUV = input.texcoord1;
- float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
- float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
+ Pass
+ {
+ CGPROGRAM
+ #pragma target 3.0
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ BEVEL_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+ #pragma shader_feature __ GLOW_ON
+ #pragma shader_feature __ FORCE_LINEAR
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+ #include "TMPro.cginc"
+
+ struct vertex_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 position : POSITION;
+ float3 normal : NORMAL;
+ float4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 position : SV_POSITION;
+ float4 color : COLOR;
+ float2 atlas : TEXCOORD0;
+ float weight : TEXCOORD1;
+ float2 mask : TEXCOORD2; // Position in object space(xy)
+ float3 viewDir : TEXCOORD3;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float2 texcoord2 : TEXCOORD4;
+ float4 underlayColor : COLOR1;
+ #endif
+
+ float4 textures : TEXCOORD5;
+ };
+
+ // Used by Unity internally to handle Texture Tiling and Offset.
+ float4 _FaceTex_ST;
+ float4 _OutlineTex_ST;
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+ float4 SRGBToLinear(float4 rgba)
+ {
+ return float4(
+ lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a);
+ }
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ pixel_t VertShader(vertex_t input)
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.position;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float4 underlayColor = _UnderlayColor;
+ underlayColor.rgb *= underlayColor.a;
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 bOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+
+ // Support for texture tiling and offset
+ float2 textureUV = input.texcoord1;
+ float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
+ float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ float4 color = input.color;
+ #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA)
+ color = SRGBToLinear(input.color);
+ #endif
+
+ output.position = vPosition;
+ output.color = color;
+ output.atlas = input.texcoord0;
+ output.weight = weight;
+ output.mask = half2(vert.xy * 2 - clampedRect.xy - clampedRect.zw);
+ output.viewDir = mul((float3x3)_EnvMatrix,
+ _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz);
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord2 = input.texcoord0 + bOffset;
+ output.underlayColor = underlayColor;
+ #endif
+ output.textures = float4(faceUV, outlineUV);
+
+ return output;
}
- float4 color = input.color;
- #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA)
- color = SRGBToLinear(input.color);
- #endif
-
- output.position = vPosition;
- output.color = color;
- output.atlas = input.texcoord0;
- output.weight = weight;
- output.mask = half2(vert.xy * 2 - clampedRect.xy - clampedRect.zw);
- output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz);
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord2 = input.texcoord0 + bOffset;
- output.underlayColor = underlayColor;
- #endif
- output.textures = float4(faceUV, outlineUV);
-
- return output;
- }
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
- float c = tex2D(_MainTex, input.atlas).a;
+ float c = tex2D(_MainTex, input.atlas).a;
- float pixelSize = abs(ddx(input.atlas.y)) + abs(ddy(input.atlas.y));
- pixelSize *= _TextureHeight * 0.75;
- float scale = 1 / pixelSize * _GradientScale * (_Sharpness + 1);
+ float pixelSize = abs(ddx(input.atlas.y)) + abs(ddy(input.atlas.y));
+ pixelSize *= _TextureHeight * 0.75;
+ float scale = 1 / pixelSize * _GradientScale * (_Sharpness + 1);
- float weight = input.weight;
- float bias = (.5 - weight) + (.5 / scale);
- float sd = (bias - c) * scale;
+ float weight = input.weight;
+ float bias = (.5 - weight) + (.5 / scale);
+ float sd = (bias - c) * scale;
- float outline = (_OutlineWidth * _ScaleRatioA) * scale;
- float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
+ float outline = (_OutlineWidth * _ScaleRatioA) * scale;
+ float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
- half4 faceColor = _FaceColor;
- half4 outlineColor = _OutlineColor;
+ half4 faceColor = _FaceColor;
+ half4 outlineColor = _OutlineColor;
- faceColor.rgb *= input.color.rgb;
+ faceColor.rgb *= input.color.rgb;
- faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
- outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
+ faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
+ outlineColor *= tex2D(_OutlineTex,
+ input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
- faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
+ faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
- #if BEVEL_ON
- float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
- float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
+ #if BEVEL_ON
+ float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
+ float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
- float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
- bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
- n = normalize(n - bump);
+ float3 bump = UnpackNormal(
+ tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
+ bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
+ n = normalize(n - bump);
- float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
+ float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
- float3 col = GetSpecular(n, light);
- faceColor.rgb += col * faceColor.a;
- faceColor.rgb *= 1 - (dot(n, light) * _Diffuse);
- faceColor.rgb *= lerp(_Ambient, 1, n.z * n.z);
+ float3 col = GetSpecular(n, light);
+ faceColor.rgb += col * faceColor.a;
+ faceColor.rgb *= 1 - (dot(n, light) * _Diffuse);
+ faceColor.rgb *= lerp(_Ambient, 1, n.z * n.z);
- fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
- faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
- #endif
+ fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
+ faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb,
+ saturate(sd + outline * 0.5)) * faceColor.a;
+ #endif
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float bScale = scale;
- bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale);
- float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
- #endif
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float bScale = scale;
+ bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale);
+ float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
+ #endif
- #if UNDERLAY_ON
- float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale;
- faceColor += input.underlayColor * saturate(d - bBias) * (1 - faceColor.a);
- #endif
+ #if UNDERLAY_ON
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale;
+ faceColor += input.underlayColor * saturate(d - bBias) * (1 - faceColor.a);
+ #endif
- #if UNDERLAY_INNER
- float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale;
- faceColor += input.underlayColor * (1 - saturate(d - bBias)) * saturate(1 - sd) * (1 - faceColor.a);
- #endif
+ #if UNDERLAY_INNER
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * bScale;
+ faceColor += input.underlayColor * (1 - saturate(d - bBias)) * saturate(1 - sd) * (1 - faceColor.a);
+ #endif
- #if GLOW_ON
- float4 glowColor = GetGlowColor(sd, scale);
- faceColor.rgb += glowColor.rgb * glowColor.a;
- #endif
+ #if GLOW_ON
+ float4 glowColor = GetGlowColor(sd, scale);
+ faceColor.rgb += glowColor.rgb * glowColor.a;
+ #endif
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- float2 maskZW = 0.25 / (0.25 * maskSoftness + 1 / scale);
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW);
- faceColor *= m.x * m.y;
- #endif
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ float2 maskZW = 0.25 / (0.25 * maskSoftness + 1 / scale);
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW);
+ faceColor *= m.x * m.y;
+ #endif
- #if UNITY_UI_ALPHACLIP
- clip(faceColor.a - 0.001);
- #endif
+ #if UNITY_UI_ALPHACLIP
+ clip(faceColor.a - 0.001);
+ #endif
- return faceColor * input.color.a;
+ return faceColor * input.color.a;
+ }
+ ENDCG
}
- ENDCG
}
-}
-Fallback "TextMeshPro/Mobile/Distance Field"
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+ Fallback "TextMeshPro/Mobile/Distance Field"
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader
index 603df2c..1b9065a 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader
@@ -3,256 +3,269 @@
// - No Glow Option
// - Softness is applied on both side of the outline
-Shader "TextMeshPro/Mobile/Distance Field - Masking" {
-
-Properties {
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = .5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5
- _ScaleX ("Scale X", float) = 1
- _ScaleY ("Scale Y", float) = 1
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
- _MaskTex ("Mask Texture", 2D) = "white" {}
- _MaskInverse ("Inverse", float) = 0
- _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
- _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
- _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ OUTLINE_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- struct vertex_t
- {
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t
- {
- float4 vertex : SV_POSITION;
- fixed4 faceColor : COLOR;
- fixed4 outlineColor : COLOR1;
- float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
- half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
- half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
- half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
- #endif
- };
-
- float _MaskWipeControl;
- float _MaskEdgeSoftness;
- fixed4 _MaskEdgeColor;
- bool _MaskInverse;
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
- pixel_t VertShader(vertex_t input)
- {
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
-
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float layerScale = scale;
-
- scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
- float bias = (0.5 - weight) * scale - 0.5;
- float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Mobile/Distance Field - Masking"
+{
+
+ Properties
+ {
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = .5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5
+ _ScaleX ("Scale X", float) = 1
+ _ScaleY ("Scale Y", float) = 1
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+ _MaskTex ("Mask Texture", 2D) = "white" {}
+ _MaskInverse ("Inverse", float) = 0
+ _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
+ _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
+ _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ OUTLINE_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 faceColor : COLOR;
+ fixed4 outlineColor : COLOR1;
+ float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
+ half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
+ half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
+ half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
+ #endif
+ };
+
+ float _MaskWipeControl;
+ float _MaskEdgeSoftness;
+ fixed4 _MaskEdgeColor;
+ bool _MaskInverse;
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+ pixel_t VertShader(vertex_t input)
+ {
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float layerScale = scale;
+
+ scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
+ float bias = (0.5 - weight) * scale - 0.5;
+ float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ float opacity = input.color.a;
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ opacity = 1.0;
+ #endif
+
+ fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
+ faceColor.rgb *= faceColor.a;
+
+ fixed4 outlineColor = _OutlineColor;
+ outlineColor.a *= opacity;
+ outlineColor.rgb *= outlineColor.a;
+ outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+
+ layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
+ float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 *
+ layerScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 layerOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+
+ // Structure for pixel shader
+ pixel_t output = {
+ vPosition,
+ faceColor,
+ outlineColor,
+ float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y),
+ half4(scale, bias - outline, bias + outline, bias),
+ half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)),
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ float4(input.texcoord0 + layerOffset, input.color.a, 0),
+ half2(layerScale, layerBias),
+ #endif
+ };
+
+ return output;
}
- float opacity = input.color.a;
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- opacity = 1.0;
- #endif
-
- fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
- faceColor.rgb *= faceColor.a;
-
- fixed4 outlineColor = _OutlineColor;
- outlineColor.a *= opacity;
- outlineColor.rgb *= outlineColor.a;
- outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
-
- layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
- float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 layerOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
-
- // Structure for pixel shader
- pixel_t output = {
- vPosition,
- faceColor,
- outlineColor,
- float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y),
- half4(scale, bias - outline, bias + outline, bias),
- half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy)),
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- float4(input.texcoord0 + layerOffset, input.color.a, 0),
- half2(layerScale, layerBias),
- #endif
- };
-
- return output;
- }
-
-
- // PIXEL SHADER
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
- half4 c = input.faceColor * saturate(d - input.param.w);
-
- #ifdef OUTLINE_ON
- c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
- c *= saturate(d - input.param.y);
- #endif
-
- #if UNDERLAY_ON
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
- #endif
-
- #if UNDERLAY_INNER
- half sd = saturate(d - input.param.z);
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- //#if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- c *= m.x * m.y;
- //#endif
-
- float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a);
- float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl;
- a = saturate(t / _MaskEdgeSoftness);
- c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a);
- c *= a;
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- c *= input.texcoord1.z;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(c.a - 0.001);
- #endif
-
- return c;
- }
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+
+
+ // PIXEL SHADER
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
+ half4 c = input.faceColor * saturate(d - input.param.w);
+
+ #ifdef OUTLINE_ON
+ c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
+ c *= saturate(d - input.param.y);
+ #endif
+
+ #if UNDERLAY_ON
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(
+ d - input.underlayParam.y) * (1 - c.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ half sd = saturate(d - input.param.z);
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(
+ d - input.underlayParam.y)) * sd * (1 - c.a);
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ //#if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ c *= m.x * m.y;
+ //#endif
+
+ float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a);
+ float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl;
+ a = saturate(t / _MaskEdgeSoftness);
+ c.rgb = lerp(_MaskEdgeColor.rgb * c.a, c.rgb, a);
+ c *= a;
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ c *= input.texcoord1.z;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(c.a - 0.001);
+ #endif
+
+ return c;
+ }
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader
index 3edca76..299740f 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader
@@ -3,250 +3,264 @@
// - No Glow Option
// - Softness is applied on both side of the outline
-Shader "TextMeshPro/Mobile/Distance Field Overlay" {
-
-Properties {
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = .5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5
- _ScaleX ("Scale X", float) = 1
- _ScaleY ("Scale Y", float) = 1
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
- Tags
- {
- "Queue"="Overlay"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest Always
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ OUTLINE_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- struct vertex_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 vertex : SV_POSITION;
- fixed4 faceColor : COLOR;
- fixed4 outlineColor : COLOR1;
- float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
- half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
- half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
- half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
- #endif
- };
-
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input, output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
-
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float layerScale = scale;
-
- scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
- float bias = (0.5 - weight) * scale - 0.5;
- float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Mobile/Distance Field Overlay"
+{
+
+ Properties
+ {
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = .5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5
+ _ScaleX ("Scale X", float) = 1
+ _ScaleY ("Scale Y", float) = 1
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Overlay"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest Always
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ OUTLINE_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 vertex : SV_POSITION;
+ fixed4 faceColor : COLOR;
+ fixed4 outlineColor : COLOR1;
+ float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
+ half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
+ half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
+ half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
+ #endif
+ };
+
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float layerScale = scale;
+
+ scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
+ float bias = (0.5 - weight) * scale - 0.5;
+ float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ float opacity = input.color.a;
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ opacity = 1.0;
+ #endif
+
+ fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
+ faceColor.rgb *= faceColor.a;
+
+ fixed4 outlineColor = _OutlineColor;
+ outlineColor.a *= opacity;
+ outlineColor.rgb *= outlineColor.a;
+ outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
+ float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 *
+ layerScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 layerOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+
+ // Populate structure for pixel shader
+ output.vertex = vPosition;
+ output.faceColor = faceColor;
+ output.outlineColor = outlineColor;
+ output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
+ output.param = half4(scale, bias - outline, bias + outline, bias);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
+ output.underlayParam = half2(layerScale, layerBias);
+ #endif
+
+ return output;
}
- float opacity = input.color.a;
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- opacity = 1.0;
- #endif
-
- fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
- faceColor.rgb *= faceColor.a;
-
- fixed4 outlineColor = _OutlineColor;
- outlineColor.a *= opacity;
- outlineColor.rgb *= outlineColor.a;
- outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
- float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 layerOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
-
- // Populate structure for pixel shader
- output.vertex = vPosition;
- output.faceColor = faceColor;
- output.outlineColor = outlineColor;
- output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
- output.param = half4(scale, bias - outline, bias + outline, bias);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
- output.underlayParam = half2(layerScale, layerBias);
- #endif
-
- return output;
- }
-
-
- // PIXEL SHADER
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
-
- half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
- half4 c = input.faceColor * saturate(d - input.param.w);
-
- #ifdef OUTLINE_ON
- c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
- c *= saturate(d - input.param.y);
- #endif
-
- #if UNDERLAY_ON
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
- #endif
-
- #if UNDERLAY_INNER
- half sd = saturate(d - input.param.z);
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- c *= m.x * m.y;
- #endif
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- c *= input.texcoord1.z;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(c.a - 0.001);
- #endif
-
- return c;
- }
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+
+
+ // PIXEL SHADER
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
+ half4 c = input.faceColor * saturate(d - input.param.w);
+
+ #ifdef OUTLINE_ON
+ c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
+ c *= saturate(d - input.param.y);
+ #endif
+
+ #if UNDERLAY_ON
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(
+ d - input.underlayParam.y) * (1 - c.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ half sd = saturate(d - input.param.z);
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(
+ d - input.underlayParam.y)) * sd * (1 - c.a);
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ c *= m.x * m.y;
+ #endif
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ c *= input.texcoord1.z;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(c.a - 0.001);
+ #endif
+
+ return c;
+ }
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader
index 43b317d..69d91cd 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader
@@ -3,104 +3,111 @@
// - No Glow Option
// - Softness is applied on both side of the outline
-Shader "TextMeshPro/Mobile/Distance Field SSD" {
-
-Properties {
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = .5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5
- _ScaleX ("Scale X", float) = 1
- _ScaleY ("Scale Y", float) = 1
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
- _MaskTex ("Mask Texture", 2D) = "white" {}
- _MaskInverse ("Inverse", float) = 0
- _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
- _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
- _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
- Tags {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ OUTLINE_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- #include "TMPro_Mobile.cginc"
-
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+Shader "TextMeshPro/Mobile/Distance Field SSD"
+{
+
+ Properties
+ {
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = .5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5
+ _ScaleX ("Scale X", float) = 1
+ _ScaleY ("Scale Y", float) = 1
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+ _MaskTex ("Mask Texture", 2D) = "white" {}
+ _MaskInverse ("Inverse", float) = 0
+ _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
+ _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
+ _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ OUTLINE_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ #include "TMPro_Mobile.cginc"
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader
index 2c8e8da..384fb55 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile-2-Pass.shader
@@ -3,387 +3,413 @@
// - No Glow Option
// - Softness is applied on both side of the outline
-Shader "TextMeshPro/Mobile/Distance Field - 2 Pass" {
-
-Properties {
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = .5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5
- _ScaleX ("Scale X", float) = 1
- _ScaleY ("Scale Y", float) = 1
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
-
- // Draw Outline and Underlay
- Name "Outline"
-
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ OUTLINE_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- struct vertex_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 vertex : SV_POSITION;
- fixed4 faceColor : COLOR;
- fixed4 outlineColor : COLOR1;
- float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
- half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
- half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
- half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
- #endif
- };
-
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input, output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- const float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
-
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float layerScale = scale;
-
- scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
- float bias = (0.5 - weight) * scale - 0.5;
- const float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
-
- float opacity = input.color.a;
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- opacity = 1.0;
- #endif
-
- fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
- faceColor.rgb *= faceColor.a;
-
- fixed4 outlineColor = _OutlineColor;
- outlineColor.a *= opacity;
- outlineColor.rgb *= outlineColor.a;
- //outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, outline * 2)));
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
- float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 layerOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
-
- // Populate structure for pixel shader
- output.vertex = vPosition;
- output.faceColor = faceColor;
- output.outlineColor = outlineColor;
- output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
- output.param = half4(scale, bias - outline, bias + outline, bias);
-
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
- output.underlayParam = half2(layerScale, layerBias);
- #endif
-
- return output;
- }
-
-
- // PIXEL SHADER
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
-
- half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
- half4 c = half4(0, 0, 0, 0);
-
- #if OUTLINE_ON
- c = input.outlineColor * saturate(d - input.param.y);
- #endif
-
- #if UNDERLAY_ON
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
- #endif
-
- #if UNDERLAY_INNER
- half sd = saturate(d - input.param.z);
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- c *= m.x * m.y;
- #endif
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- c *= input.texcoord1.z;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(c.a - 0.001);
- #endif
-
- return c;
- }
- ENDCG
- }
-
-
- // Draw face
- Name "Face"
-
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma vertex VertShader
- #pragma fragment PixShader
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- struct vertex_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 vertex : SV_POSITION;
- fixed4 faceColor : COLOR;
- float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
- half2 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
- half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
- };
-
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input, output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- const float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
-
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
- float bias = (0.5 - weight) * scale - 0.5;
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Mobile/Distance Field - 2 Pass"
+{
+
+ Properties
+ {
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = .5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5
+ _ScaleX ("Scale X", float) = 1
+ _ScaleY ("Scale Y", float) = 1
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ // Draw Outline and Underlay
+ Name "Outline"
+
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ OUTLINE_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 vertex : SV_POSITION;
+ fixed4 faceColor : COLOR;
+ fixed4 outlineColor : COLOR1;
+ float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
+ half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
+ half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
+ half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
+ #endif
+ };
+
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ const float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float layerScale = scale;
+
+ scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
+ float bias = (0.5 - weight) * scale - 0.5;
+ const float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
+
+ float opacity = input.color.a;
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ opacity = 1.0;
+ #endif
+
+ fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
+ faceColor.rgb *= faceColor.a;
+
+ fixed4 outlineColor = _OutlineColor;
+ outlineColor.a *= opacity;
+ outlineColor.rgb *= outlineColor.a;
+ //outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, outline * 2)));
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
+ float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 *
+ layerScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 layerOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+
+ // Populate structure for pixel shader
+ output.vertex = vPosition;
+ output.faceColor = faceColor;
+ output.outlineColor = outlineColor;
+ output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
+ output.param = half4(scale, bias - outline, bias + outline, bias);
+
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
+ output.underlayParam = half2(layerScale, layerBias);
+ #endif
+
+ return output;
+ }
+
+
+ // PIXEL SHADER
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
+ half4 c = half4(0, 0, 0, 0);
+
+ #if OUTLINE_ON
+ c = input.outlineColor * saturate(d - input.param.y);
+ #endif
+
+ #if UNDERLAY_ON
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(
+ d - input.underlayParam.y) * (1 - c.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ half sd = saturate(d - input.param.z);
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(
+ d - input.underlayParam.y)) * sd * (1 - c.a);
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ c *= m.x * m.y;
+ #endif
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ c *= input.texcoord1.z;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(c.a - 0.001);
+ #endif
+
+ return c;
}
- float opacity = input.color.a;
+ ENDCG
+ }
+
+
+ // Draw face
+ Name "Face"
+
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ struct vertex_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 vertex : SV_POSITION;
+ fixed4 faceColor : COLOR;
+ float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
+ half2 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
+ half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
+ };
+
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
- fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
- faceColor.rgb *= faceColor.a;
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+ const float bold = step(input.texcoord0.w, 0);
- // Populate structure for pixel shader
- output.vertex = vPosition;
- output.faceColor = faceColor;
- output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
- output.param = half2(scale, bias);
+ float4 vert = input.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+ float4 vPosition = UnityObjectToClipPos(vert);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
- return output;
- }
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
- // PIXEL SHADER
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
+ scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
+ float bias = (0.5 - weight) * scale - 0.5;
- half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
- half4 c = input.faceColor * saturate(d - input.param.y);
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ float opacity = input.color.a;
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- c *= m.x * m.y;
- #endif
+ fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
+ faceColor.rgb *= faceColor.a;
- #if UNITY_UI_ALPHACLIP
- clip(c.a - 0.001);
- #endif
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
- return c;
- }
- ENDCG
- }
+ // Populate structure for pixel shader
+ output.vertex = vPosition;
+ output.faceColor = faceColor;
+ output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
+ output.param = half2(scale, bias);
+
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+
+ return output;
+ }
+
+
+ // PIXEL SHADER
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
+ half4 c = input.faceColor * saturate(d - input.param.y);
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ c *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(c.a - 0.001);
+ #endif
+
+ return c;
+ }
+ ENDCG
+ }
-}
+ }
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader
index b899d6e..d35f4a9 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader
@@ -3,248 +3,263 @@
// - No Glow Option
// - Softness is applied on both side of the outline
-Shader "TextMeshPro/Mobile/Distance Field" {
-
-Properties {
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = .5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5
- _ScaleX ("Scale X", float) = 1
- _ScaleY ("Scale Y", float) = 1
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma enable_d3d11_debug_symbols
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ OUTLINE_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
-
- struct vertex_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 vertex : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 vertex : SV_POSITION;
- fixed4 faceColor : COLOR;
- fixed4 outlineColor : COLOR1;
- float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
- half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
- half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
- half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
- #endif
- };
-
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input, output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.vertex;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
-
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float layerScale = scale;
-
- scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
- float bias = (0.5 - weight) * scale - 0.5;
- float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Mobile/Distance Field"
+{
+
+ Properties
+ {
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0,.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = .5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5
+ _ScaleX ("Scale X", float) = 1
+ _ScaleY ("Scale Y", float) = 1
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma enable_d3d11_debug_symbols
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ OUTLINE_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 vertex : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 vertex : SV_POSITION;
+ fixed4 faceColor : COLOR;
+ fixed4 outlineColor : COLOR1;
+ float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
+ half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
+ half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
+ half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
+ #endif
+ };
+
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.vertex;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float layerScale = scale;
+
+ scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
+ float bias = (0.5 - weight) * scale - 0.5;
+ float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ float opacity = input.color.a;
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ opacity = 1.0;
+ #endif
+
+ fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
+ faceColor.rgb *= faceColor.a;
+
+ fixed4 outlineColor = _OutlineColor;
+ outlineColor.a *= opacity;
+ outlineColor.rgb *= outlineColor.a;
+ outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
+ float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 *
+ layerScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 layerOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+
+ // Populate structure for pixel shader
+ output.vertex = vPosition;
+ output.faceColor = faceColor;
+ output.outlineColor = outlineColor;
+ output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
+ output.param = half4(scale, bias - outline, bias + outline, bias);
+
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
+ output.underlayParam = half2(layerScale, layerBias);
+ #endif
+
+ return output;
}
- float opacity = input.color.a;
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- opacity = 1.0;
- #endif
-
- fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
- faceColor.rgb *= faceColor.a;
-
- fixed4 outlineColor = _OutlineColor;
- outlineColor.a *= opacity;
- outlineColor.rgb *= outlineColor.a;
- outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
- float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 layerOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
-
- // Populate structure for pixel shader
- output.vertex = vPosition;
- output.faceColor = faceColor;
- output.outlineColor = outlineColor;
- output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
- output.param = half4(scale, bias - outline, bias + outline, bias);
-
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
- output.underlayParam = half2(layerScale, layerBias);
- #endif
-
- return output;
- }
-
-
- // PIXEL SHADER
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
-
- half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
- half4 c = input.faceColor * saturate(d - input.param.w);
-
- #ifdef OUTLINE_ON
- c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
- c *= saturate(d - input.param.y);
- #endif
-
- #if UNDERLAY_ON
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
- #endif
-
- #if UNDERLAY_INNER
- half sd = saturate(d - input.param.z);
- d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
- c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- c *= m.x * m.y;
- #endif
-
- #if (UNDERLAY_ON | UNDERLAY_INNER)
- c *= input.texcoord1.z;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(c.a - 0.001);
- #endif
-
- return c;
- }
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+
+
+ // PIXEL SHADER
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
+ half4 c = input.faceColor * saturate(d - input.param.w);
+
+ #ifdef OUTLINE_ON
+ c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
+ c *= saturate(d - input.param.y);
+ #endif
+
+ #if UNDERLAY_ON
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(
+ d - input.underlayParam.y) * (1 - c.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ half sd = saturate(d - input.param.z);
+ d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
+ c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(
+ d - input.underlayParam.y)) * sd * (1 - c.a);
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ c *= m.x * m.y;
+ #endif
+
+ #if (UNDERLAY_ON | UNDERLAY_INNER)
+ c *= input.texcoord1.z;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(c.a - 0.001);
+ #endif
+
+ return c;
+ }
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader
index 68d0dfa..f8e3cc3 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader
@@ -3,137 +3,146 @@
// - Diffuse only lighting
// - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH.
-Shader "TextMeshPro/Mobile/Distance Field (Surface)" {
-
-Properties {
- _FaceTex ("Fill Texture", 2D) = "white" {}
- _FaceColor ("Fill Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineTex ("Outline Texture", 2D) = "white" {}
- _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
- _GlowOffset ("Offset", Range(-1,1)) = 0
- _GlowInner ("Inner", Range(0,1)) = 0.05
- _GlowOuter ("Outer", Range(0,1)) = 0.05
- _GlowPower ("Falloff", Range(1, 0)) = 0.75
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = 0.5
-
- // Should not be directly exposed to the user
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5.0
- _ScaleX ("Scale X", float) = 1.0
- _ScaleY ("Scale Y", float) = 1.0
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _CullMode ("Cull Mode", Float) = 0
- //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
- //_MaskSoftness ("Mask Softness", float) = 0
-}
-
-SubShader {
-
- Tags {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- LOD 300
- Cull [_CullMode]
-
- CGPROGRAM
- #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap
- #pragma target 3.0
- #pragma shader_feature __ GLOW_ON
-
- #include "TMPro_Properties.cginc"
- #include "TMPro.cginc"
-
- half _FaceShininess;
- half _OutlineShininess;
-
- struct Input
- {
- fixed4 color : COLOR;
- float2 uv_MainTex;
- float2 uv2_FaceTex;
- float2 uv2_OutlineTex;
- float2 param; // Weight, Scale
- float3 viewDirEnv;
- };
-
- #include "TMPro_Surface.cginc"
-
- ENDCG
-
- // Pass to render object as a shadow caster
- Pass
- {
- Name "Caster"
- Tags { "LightMode" = "ShadowCaster" }
- Offset 1, 1
-
- Fog {Mode Off}
- ZWrite On ZTest LEqual Cull Off
-
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_shadowcaster
- #include "UnityCG.cginc"
-
- struct v2f
- {
- V2F_SHADOW_CASTER;
- float2 uv : TEXCOORD1;
- float2 uv2 : TEXCOORD3;
- float alphaClip : TEXCOORD2;
- };
-
- uniform float4 _MainTex_ST;
- uniform float4 _OutlineTex_ST;
- float _OutlineWidth;
- float _FaceDilate;
- float _ScaleRatioA;
-
- v2f vert( appdata_base v )
- {
- v2f o;
- TRANSFER_SHADOW_CASTER(o)
- o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
- o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
- o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
- return o;
- }
-
- uniform sampler2D _MainTex;
-
- float4 frag(v2f i) : COLOR
- {
- fixed4 texcol = tex2D(_MainTex, i.uv).a;
- clip(texcol.a - i.alphaClip);
- SHADOW_CASTER_FRAGMENT(i)
- }
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+Shader "TextMeshPro/Mobile/Distance Field (Surface)"
+{
+
+ Properties
+ {
+ _FaceTex ("Fill Texture", 2D) = "white" {}
+ _FaceColor ("Fill Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineTex ("Outline Texture", 2D) = "white" {}
+ _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
+ _GlowOffset ("Offset", Range(-1,1)) = 0
+ _GlowInner ("Inner", Range(0,1)) = 0.05
+ _GlowOuter ("Outer", Range(0,1)) = 0.05
+ _GlowPower ("Falloff", Range(1, 0)) = 0.75
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = 0.5
+
+ // Should not be directly exposed to the user
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5.0
+ _ScaleX ("Scale X", float) = 1.0
+ _ScaleY ("Scale Y", float) = 1.0
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _CullMode ("Cull Mode", Float) = 0
+ //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
+ //_MaskSoftness ("Mask Softness", float) = 0
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ LOD 300
+ Cull [_CullMode]
+
+ CGPROGRAM
+ #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap
+ #pragma target 3.0
+ #pragma shader_feature __ GLOW_ON
+
+ #include "TMPro_Properties.cginc"
+ #include "TMPro.cginc"
+
+ half _FaceShininess;
+ half _OutlineShininess;
+
+ struct Input
+ {
+ fixed4 color : COLOR;
+ float2 uv_MainTex;
+ float2 uv2_FaceTex;
+ float2 uv2_OutlineTex;
+ float2 param; // Weight, Scale
+ float3 viewDirEnv;
+ };
+
+ #include "TMPro_Surface.cginc"
+ ENDCG
+
+ // Pass to render object as a shadow caster
+ Pass
+ {
+ Name "Caster"
+ Tags
+ {
+ "LightMode" = "ShadowCaster"
+ }
+ Offset 1, 1
+
+ Fog
+ {
+ Mode Off
+ }
+ ZWrite On ZTest LEqual Cull Off
+
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #pragma multi_compile_shadowcaster
+ #include "UnityCG.cginc"
+
+ struct v2f
+ {
+ V2F_SHADOW_CASTER;
+ float2 uv : TEXCOORD1;
+ float2 uv2 : TEXCOORD3;
+ float alphaClip : TEXCOORD2;
+ };
+
+ uniform float4 _MainTex_ST;
+ uniform float4 _OutlineTex_ST;
+ float _OutlineWidth;
+ float _FaceDilate;
+ float _ScaleRatioA;
+
+ v2f vert(appdata_base v)
+ {
+ v2f o;
+ TRANSFER_SHADOW_CASTER(o)
+ o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
+ o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
+ o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
+ return o;
+ }
+
+ uniform sampler2D _MainTex;
+
+ float4 frag(v2f i) : COLOR
+ {
+ fixed4 texcol = tex2D(_MainTex, i.uv).a;
+ clip(texcol.a - i.alphaClip);
+ SHADOW_CASTER_FRAGMENT(i)
+ }
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader
index 281e60d..c12237a 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader
@@ -1,159 +1,169 @@
-Shader "TextMeshPro/Distance Field (Surface)" {
-
-Properties {
- _FaceTex ("Fill Texture", 2D) = "white" {}
- _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
- _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
- _FaceColor ("Fill Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineTex ("Outline Texture", 2D) = "white" {}
- _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
- _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
- _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _Bevel ("Bevel", Range(0,1)) = 0.5
- _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
- _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
- _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
- _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
-
- _BumpMap ("Normalmap", 2D) = "bump" {}
- _BumpOutline ("Bump Outline", Range(0,1)) = 0.5
- _BumpFace ("Bump Face", Range(0,1)) = 0.5
-
- _ReflectFaceColor ("Face Color", Color) = (0,0,0,1)
- _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1)
- _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
- _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
- _SpecColor ("Specular Color", Color) = (0,0,0,1)
-
- _FaceShininess ("Face Shininess", Range(0,1)) = 0
- _OutlineShininess ("Outline Shininess", Range(0,1)) = 0
-
- _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
- _GlowOffset ("Offset", Range(-1,1)) = 0
- _GlowInner ("Inner", Range(0,1)) = 0.05
- _GlowOuter ("Outer", Range(0,1)) = 0.05
- _GlowPower ("Falloff", Range(1, 0)) = 0.75
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = 0.5
-
- // Should not be directly exposed to the user
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5.0
- _ScaleX ("Scale X", float) = 1.0
- _ScaleY ("Scale Y", float) = 1.0
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _CullMode ("Cull Mode", Float) = 0
- //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
- //_MaskSoftness ("Mask Softness", float) = 0
-}
-
-SubShader {
-
- Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
-
- LOD 300
- Cull [_CullMode]
-
- CGPROGRAM
- #pragma surface PixShader BlinnPhong alpha:blend vertex:VertShader nolightmap nodirlightmap
- #pragma target 3.0
- #pragma shader_feature __ GLOW_ON
- #pragma glsl
-
- #include "TMPro_Properties.cginc"
- #include "TMPro.cginc"
-
- half _FaceShininess;
- half _OutlineShininess;
-
- struct Input
- {
- fixed4 color : COLOR;
- float2 uv_MainTex;
- float2 uv2_FaceTex;
- float2 uv2_OutlineTex;
- float2 param; // Weight, Scale
- float3 viewDirEnv;
- };
-
-
- #define BEVEL_ON 1
- #include "TMPro_Surface.cginc"
-
- ENDCG
-
- // Pass to render object as a shadow caster
- Pass
- {
- Name "Caster"
- Tags { "LightMode" = "ShadowCaster" }
- Offset 1, 1
-
- Fog {Mode Off}
- ZWrite On
- ZTest LEqual
- Cull Off
-
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma multi_compile_shadowcaster
- #include "UnityCG.cginc"
-
- struct v2f
- {
- V2F_SHADOW_CASTER;
- float2 uv : TEXCOORD1;
- float2 uv2 : TEXCOORD3;
- float alphaClip : TEXCOORD2;
- };
-
- uniform float4 _MainTex_ST;
- uniform float4 _OutlineTex_ST;
- float _OutlineWidth;
- float _FaceDilate;
- float _ScaleRatioA;
-
- v2f vert( appdata_base v )
- {
- v2f o;
- TRANSFER_SHADOW_CASTER(o)
- o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
- o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
- o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
- return o;
- }
-
- uniform sampler2D _MainTex;
-
- float4 frag(v2f i) : COLOR
- {
- fixed4 texcol = tex2D(_MainTex, i.uv).a;
- clip(texcol.a - i.alphaClip);
- SHADOW_CASTER_FRAGMENT(i)
- }
- ENDCG
- }
-}
-
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
-
+Shader "TextMeshPro/Distance Field (Surface)"
+{
+
+ Properties
+ {
+ _FaceTex ("Fill Texture", 2D) = "white" {}
+ _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
+ _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
+ _FaceColor ("Fill Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineTex ("Outline Texture", 2D) = "white" {}
+ _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
+ _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
+ _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _Bevel ("Bevel", Range(0,1)) = 0.5
+ _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
+ _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
+ _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
+ _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
+
+ _BumpMap ("Normalmap", 2D) = "bump" {}
+ _BumpOutline ("Bump Outline", Range(0,1)) = 0.5
+ _BumpFace ("Bump Face", Range(0,1)) = 0.5
+
+ _ReflectFaceColor ("Face Color", Color) = (0,0,0,1)
+ _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
+ _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
+ _SpecColor ("Specular Color", Color) = (0,0,0,1)
+
+ _FaceShininess ("Face Shininess", Range(0,1)) = 0
+ _OutlineShininess ("Outline Shininess", Range(0,1)) = 0
+
+ _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
+ _GlowOffset ("Offset", Range(-1,1)) = 0
+ _GlowInner ("Inner", Range(0,1)) = 0.05
+ _GlowOuter ("Outer", Range(0,1)) = 0.05
+ _GlowPower ("Falloff", Range(1, 0)) = 0.75
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = 0.5
+
+ // Should not be directly exposed to the user
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5.0
+ _ScaleX ("Scale X", float) = 1.0
+ _ScaleY ("Scale Y", float) = 1.0
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _CullMode ("Cull Mode", Float) = 0
+ //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
+ //_MaskSoftness ("Mask Softness", float) = 0
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"
+ }
+
+ LOD 300
+ Cull [_CullMode]
+
+ CGPROGRAM
+ #pragma surface PixShader BlinnPhong alpha:blend vertex:VertShader nolightmap nodirlightmap
+ #pragma target 3.0
+ #pragma shader_feature __ GLOW_ON
+ #pragma glsl
+
+ #include "TMPro_Properties.cginc"
+ #include "TMPro.cginc"
+
+ half _FaceShininess;
+ half _OutlineShininess;
+
+ struct Input
+ {
+ fixed4 color : COLOR;
+ float2 uv_MainTex;
+ float2 uv2_FaceTex;
+ float2 uv2_OutlineTex;
+ float2 param; // Weight, Scale
+ float3 viewDirEnv;
+ };
+
+
+ #define BEVEL_ON 1
+ #include "TMPro_Surface.cginc"
+ ENDCG
+
+ // Pass to render object as a shadow caster
+ Pass
+ {
+ Name "Caster"
+ Tags
+ {
+ "LightMode" = "ShadowCaster"
+ }
+ Offset 1, 1
+
+ Fog
+ {
+ Mode Off
+ }
+ ZWrite On
+ ZTest LEqual
+ Cull Off
+
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
+ #pragma multi_compile_shadowcaster
+ #include "UnityCG.cginc"
+
+ struct v2f
+ {
+ V2F_SHADOW_CASTER;
+ float2 uv : TEXCOORD1;
+ float2 uv2 : TEXCOORD3;
+ float alphaClip : TEXCOORD2;
+ };
+
+ uniform float4 _MainTex_ST;
+ uniform float4 _OutlineTex_ST;
+ float _OutlineWidth;
+ float _FaceDilate;
+ float _ScaleRatioA;
+
+ v2f vert(appdata_base v)
+ {
+ v2f o;
+ TRANSFER_SHADOW_CASTER(o)
+ o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
+ o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
+ o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
+ return o;
+ }
+
+ uniform sampler2D _MainTex;
+
+ float4 frag(v2f i) : COLOR
+ {
+ fixed4 texcol = tex2D(_MainTex, i.uv).a;
+ clip(texcol.a - i.alphaClip);
+ SHADOW_CASTER_FRAGMENT(i)
+ }
+ ENDCG
+ }
+ }
+
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_SDF.shader b/Assets/TextMesh Pro/Shaders/TMP_SDF.shader
index bbcfd11..8cd0dee 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_SDF.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_SDF.shader
@@ -1,326 +1,342 @@
-Shader "TextMeshPro/Distance Field" {
-
-Properties {
- _FaceTex ("Face Texture", 2D) = "white" {}
- _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
- _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
- _FaceColor ("Face Color", Color) = (1,1,1,1)
- _FaceDilate ("Face Dilate", Range(-1,1)) = 0
-
- _OutlineColor ("Outline Color", Color) = (0,0,0,1)
- _OutlineTex ("Outline Texture", 2D) = "white" {}
- _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
- _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
- _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
- _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
-
- _Bevel ("Bevel", Range(0,1)) = 0.5
- _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
- _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
- _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
- _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
-
- _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
- _SpecularColor ("Specular", Color) = (1,1,1,1)
- _SpecularPower ("Specular", Range(0,4)) = 2.0
- _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
- _Diffuse ("Diffuse", Range(0,1)) = 0.5
- _Ambient ("Ambient", Range(1,0)) = 0.5
-
- _BumpMap ("Normal map", 2D) = "bump" {}
- _BumpOutline ("Bump Outline", Range(0,1)) = 0
- _BumpFace ("Bump Face", Range(0,1)) = 0
-
- _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
- _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
- _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
- _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
-
-
- _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
- _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
- _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
- _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
- _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
-
- _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
- _GlowOffset ("Offset", Range(-1,1)) = 0
- _GlowInner ("Inner", Range(0,1)) = 0.05
- _GlowOuter ("Outer", Range(0,1)) = 0.05
- _GlowPower ("Falloff", Range(1, 0)) = 0.75
-
- _WeightNormal ("Weight Normal", float) = 0
- _WeightBold ("Weight Bold", float) = 0.5
-
- _ShaderFlags ("Flags", float) = 0
- _ScaleRatioA ("Scale RatioA", float) = 1
- _ScaleRatioB ("Scale RatioB", float) = 1
- _ScaleRatioC ("Scale RatioC", float) = 1
-
- _MainTex ("Font Atlas", 2D) = "white" {}
- _TextureWidth ("Texture Width", float) = 512
- _TextureHeight ("Texture Height", float) = 512
- _GradientScale ("Gradient Scale", float) = 5.0
- _ScaleX ("Scale X", float) = 1.0
- _ScaleY ("Scale Y", float) = 1.0
- _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
- _Sharpness ("Sharpness", Range(-1,1)) = 0
-
- _VertexOffsetX ("Vertex OffsetX", float) = 0
- _VertexOffsetY ("Vertex OffsetY", float) = 0
-
- _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
- _MaskSoftnessX ("Mask SoftnessX", float) = 0
- _MaskSoftnessY ("Mask SoftnessY", float) = 0
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
-}
-
-SubShader {
-
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- ZWrite Off
- Lighting Off
- Fog { Mode Off }
- ZTest [unity_GUIZTestMode]
- Blend One OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass {
- CGPROGRAM
- #pragma target 3.0
- #pragma vertex VertShader
- #pragma fragment PixShader
- #pragma shader_feature __ BEVEL_ON
- #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
- #pragma shader_feature __ GLOW_ON
-
- #pragma multi_compile __ UNITY_UI_CLIP_RECT
- #pragma multi_compile __ UNITY_UI_ALPHACLIP
-
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
- #include "TMPro_Properties.cginc"
- #include "TMPro.cginc"
-
- struct vertex_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 position : POSITION;
- float3 normal : NORMAL;
- fixed4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
- };
-
- struct pixel_t
- {
- UNITY_VERTEX_INPUT_INSTANCE_ID
- UNITY_VERTEX_OUTPUT_STEREO
- float4 position : SV_POSITION;
- fixed4 color : COLOR;
- float2 atlas : TEXCOORD0; // Atlas
- float4 param : TEXCOORD1; // alphaClip, scale, bias, weight
- float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw)
- float3 viewDir : TEXCOORD3;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 texcoord2 : TEXCOORD4; // u,v, scale, bias
- fixed4 underlayColor : COLOR1;
- #endif
-
- float4 textures : TEXCOORD5;
- };
-
- // Used by Unity internally to handle Texture Tiling and Offset.
- float4 _FaceTex_ST;
- float4 _OutlineTex_ST;
- float _UIMaskSoftnessX;
- float _UIMaskSoftnessY;
- int _UIVertexColorAlwaysGammaSpace;
-
- pixel_t VertShader(vertex_t input)
- {
- pixel_t output;
-
- UNITY_INITIALIZE_OUTPUT(pixel_t, output);
- UNITY_SETUP_INSTANCE_ID(input);
- UNITY_TRANSFER_INSTANCE_ID(input,output);
- UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
-
- float bold = step(input.texcoord0.w, 0);
-
- float4 vert = input.position;
- vert.x += _VertexOffsetX;
- vert.y += _VertexOffsetY;
-
- float4 vPosition = UnityObjectToClipPos(vert);
-
- float2 pixelSize = vPosition.w;
- pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
- if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
-
- float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
- weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
-
- float bias =(.5 - weight) + (.5 / scale);
-
- float alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _OutlineSoftness * _ScaleRatioA);
-
- #if GLOW_ON
- alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB);
- #endif
-
- alphaClip = alphaClip / 2.0 - ( .5 / scale) - weight;
-
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 underlayColor = _UnderlayColor;
- underlayColor.rgb *= underlayColor.a;
-
- float bScale = scale;
- bScale /= 1 + ((_UnderlaySoftness*_ScaleRatioC) * bScale);
- float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
-
- float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
- float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
- float2 bOffset = float2(x, y);
- #endif
-
- // Generate UV for the Masking Texture
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
- float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
-
- // Support for texture tiling and offset
- float2 textureUV = input.texcoord1;
- float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
- float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
-
-
- if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+Shader "TextMeshPro/Distance Field"
+{
+
+ Properties
+ {
+ _FaceTex ("Face Texture", 2D) = "white" {}
+ _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
+ _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
+ _FaceColor ("Face Color", Color) = (1,1,1,1)
+ _FaceDilate ("Face Dilate", Range(-1,1)) = 0
+
+ _OutlineColor ("Outline Color", Color) = (0,0,0,1)
+ _OutlineTex ("Outline Texture", 2D) = "white" {}
+ _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
+ _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
+ _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
+ _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
+
+ _Bevel ("Bevel", Range(0,1)) = 0.5
+ _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
+ _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
+ _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
+ _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
+
+ _LightAngle ("Light Angle", Range(0.0, 6.2831853)) = 3.1416
+ _SpecularColor ("Specular", Color) = (1,1,1,1)
+ _SpecularPower ("Specular", Range(0,4)) = 2.0
+ _Reflectivity ("Reflectivity", Range(5.0,15.0)) = 10
+ _Diffuse ("Diffuse", Range(0,1)) = 0.5
+ _Ambient ("Ambient", Range(1,0)) = 0.5
+
+ _BumpMap ("Normal map", 2D) = "bump" {}
+ _BumpOutline ("Bump Outline", Range(0,1)) = 0
+ _BumpFace ("Bump Face", Range(0,1)) = 0
+
+ _ReflectFaceColor ("Reflection Color", Color) = (0,0,0,1)
+ _ReflectOutlineColor("Reflection Color", Color) = (0,0,0,1)
+ _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
+ _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
+
+
+ _UnderlayColor ("Border Color", Color) = (0,0,0, 0.5)
+ _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
+ _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
+ _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
+ _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
+
+ _GlowColor ("Color", Color) = (0, 1, 0, 0.5)
+ _GlowOffset ("Offset", Range(-1,1)) = 0
+ _GlowInner ("Inner", Range(0,1)) = 0.05
+ _GlowOuter ("Outer", Range(0,1)) = 0.05
+ _GlowPower ("Falloff", Range(1, 0)) = 0.75
+
+ _WeightNormal ("Weight Normal", float) = 0
+ _WeightBold ("Weight Bold", float) = 0.5
+
+ _ShaderFlags ("Flags", float) = 0
+ _ScaleRatioA ("Scale RatioA", float) = 1
+ _ScaleRatioB ("Scale RatioB", float) = 1
+ _ScaleRatioC ("Scale RatioC", float) = 1
+
+ _MainTex ("Font Atlas", 2D) = "white" {}
+ _TextureWidth ("Texture Width", float) = 512
+ _TextureHeight ("Texture Height", float) = 512
+ _GradientScale ("Gradient Scale", float) = 5.0
+ _ScaleX ("Scale X", float) = 1.0
+ _ScaleY ("Scale Y", float) = 1.0
+ _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
+ _Sharpness ("Sharpness", Range(-1,1)) = 0
+
+ _VertexOffsetX ("Vertex OffsetX", float) = 0
+ _VertexOffsetY ("Vertex OffsetY", float) = 0
+
+ _MaskCoord ("Mask Coordinates", vector) = (0, 0, 32767, 32767)
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+ _MaskSoftnessX ("Mask SoftnessX", float) = 0
+ _MaskSoftnessY ("Mask SoftnessY", float) = 0
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ }
+
+ SubShader
+ {
+
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ ZWrite Off
+ Lighting Off
+ Fog
+ {
+ Mode Off
+ }
+ ZTest [unity_GUIZTestMode]
+ Blend One OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
+ CGPROGRAM
+ #pragma target 3.0
+ #pragma vertex VertShader
+ #pragma fragment PixShader
+ #pragma shader_feature __ BEVEL_ON
+ #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
+ #pragma shader_feature __ GLOW_ON
+
+ #pragma multi_compile __ UNITY_UI_CLIP_RECT
+ #pragma multi_compile __ UNITY_UI_ALPHACLIP
+
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
+ #include "TMPro_Properties.cginc"
+ #include "TMPro.cginc"
+
+ struct vertex_t
{
- input.color.rgb = UIGammaToLinear(input.color.rgb);
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ float4 position : POSITION;
+ float3 normal : NORMAL;
+ fixed4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
+ };
+
+ struct pixel_t
+ {
+ UNITY_VERTEX_INPUT_INSTANCE_ID
+ UNITY_VERTEX_OUTPUT_STEREO
+ float4 position : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 atlas : TEXCOORD0; // Atlas
+ float4 param : TEXCOORD1; // alphaClip, scale, bias, weight
+ float4 mask : TEXCOORD2; // Position in object space(xy), pixel Size(zw)
+ float3 viewDir : TEXCOORD3;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float4 texcoord2 : TEXCOORD4; // u,v, scale, bias
+ fixed4 underlayColor : COLOR1;
+ #endif
+
+ float4 textures : TEXCOORD5;
+ };
+
+ // Used by Unity internally to handle Texture Tiling and Offset.
+ float4 _FaceTex_ST;
+ float4 _OutlineTex_ST;
+ float _UIMaskSoftnessX;
+ float _UIMaskSoftnessY;
+ int _UIVertexColorAlwaysGammaSpace;
+
+ pixel_t VertShader(vertex_t input)
+ {
+ pixel_t output;
+
+ UNITY_INITIALIZE_OUTPUT(pixel_t, output);
+ UNITY_SETUP_INSTANCE_ID(input);
+ UNITY_TRANSFER_INSTANCE_ID(input, output);
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
+
+ float bold = step(input.texcoord0.w, 0);
+
+ float4 vert = input.position;
+ vert.x += _VertexOffsetX;
+ vert.y += _VertexOffsetY;
+
+ float4 vPosition = UnityObjectToClipPos(vert);
+
+ float2 pixelSize = vPosition.w;
+ pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(input.texcoord0.w) * _GradientScale * (_Sharpness + 1);
+ if (UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(input.normal.xyz),
+ normalize(WorldSpaceViewDir(vert)))));
+
+ float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
+ weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
+
+ float bias = (.5 - weight) + (.5 / scale);
+
+ float alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _OutlineSoftness * _ScaleRatioA);
+
+ #if GLOW_ON
+ alphaClip = min(alphaClip, 1.0 - _GlowOffset * _ScaleRatioB - _GlowOuter * _ScaleRatioB);
+ #endif
+
+ alphaClip = alphaClip / 2.0 - (.5 / scale) - weight;
+
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ float4 underlayColor = _UnderlayColor;
+ underlayColor.rgb *= underlayColor.a;
+
+ float bScale = scale;
+ bScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * bScale);
+ float bBias = (0.5 - weight) * bScale - 0.5 - ((_UnderlayDilate * _ScaleRatioC) * 0.5 * bScale);
+
+ float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
+ float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
+ float2 bOffset = float2(x, y);
+ #endif
+
+ // Generate UV for the Masking Texture
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
+
+ // Support for texture tiling and offset
+ float2 textureUV = input.texcoord1;
+ float2 faceUV = TRANSFORM_TEX(textureUV, _FaceTex);
+ float2 outlineUV = TRANSFORM_TEX(textureUV, _OutlineTex);
+
+
+ if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
+ {
+ input.color.rgb = UIGammaToLinear(input.color.rgb);
+ }
+ output.position = vPosition;
+ output.color = input.color;
+ output.atlas = input.texcoord0;
+ output.param = float4(alphaClip, scale, bias, weight);
+ const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX),
+ max(_UIMaskSoftnessY, _MaskSoftnessY));
+ output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * maskSoftness + pixelSize.xy));
+ output.viewDir = mul((float3x3)_EnvMatrix,
+ _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz);
+ #if (UNDERLAY_ON || UNDERLAY_INNER)
+ output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias);
+ output.underlayColor = underlayColor;
+ #endif
+ output.textures = float4(faceUV, outlineUV);
+
+ return output;
+ }
+
+
+ fixed4 PixShader(pixel_t input) : SV_Target
+ {
+ UNITY_SETUP_INSTANCE_ID(input);
+
+ float c = tex2D(_MainTex, input.atlas).a;
+
+ #ifndef UNDERLAY_ON
+ clip(c - input.param.x);
+ #endif
+
+ float scale = input.param.y;
+ float bias = input.param.z;
+ float weight = input.param.w;
+ float sd = (bias - c) * scale;
+
+ float outline = (_OutlineWidth * _ScaleRatioA) * scale;
+ float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
+
+ half4 faceColor = _FaceColor;
+ half4 outlineColor = _OutlineColor;
+
+ faceColor.rgb *= input.color.rgb;
+
+ faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
+ outlineColor *= tex2D(_OutlineTex,
+ input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
+
+ faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
+
+ #if BEVEL_ON
+ float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
+ float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
+
+ float3 bump = UnpackNormal(
+ tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
+ bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
+ n = normalize(n - bump);
+
+ float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
+
+ float3 col = GetSpecular(n, light);
+ faceColor.rgb += col * faceColor.a;
+ faceColor.rgb *= 1 - (dot(n, light) * _Diffuse);
+ faceColor.rgb *= lerp(_Ambient, 1, n.z * n.z);
+
+ fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
+ faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb,
+ saturate(sd + outline * 0.5)) * faceColor.a;
+ #endif
+
+ #if UNDERLAY_ON
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
+ faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a);
+ #endif
+
+ #if UNDERLAY_INNER
+ float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
+ faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 -
+ faceColor.a);
+ #endif
+
+ #if GLOW_ON
+ float4 glowColor = GetGlowColor(sd, scale);
+ faceColor.rgb += glowColor.rgb * glowColor.a;
+ #endif
+
+ // Alternative implementation to UnityGet2DClipping with support for softness.
+ #if UNITY_UI_CLIP_RECT
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
+ faceColor *= m.x * m.y;
+ #endif
+
+ #if UNITY_UI_ALPHACLIP
+ clip(faceColor.a - 0.001);
+ #endif
+
+ return faceColor * input.color.a;
}
- output.position = vPosition;
- output.color = input.color;
- output.atlas = input.texcoord0;
- output.param = float4(alphaClip, scale, bias, weight);
- const half2 maskSoftness = half2(max(_UIMaskSoftnessX, _MaskSoftnessX), max(_UIMaskSoftnessY, _MaskSoftnessY));
- output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * maskSoftness + pixelSize.xy));
- output.viewDir = mul((float3x3)_EnvMatrix, _WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, vert).xyz);
- #if (UNDERLAY_ON || UNDERLAY_INNER)
- output.texcoord2 = float4(input.texcoord0 + bOffset, bScale, bBias);
- output.underlayColor = underlayColor;
- #endif
- output.textures = float4(faceUV, outlineUV);
-
- return output;
- }
-
-
- fixed4 PixShader(pixel_t input) : SV_Target
- {
- UNITY_SETUP_INSTANCE_ID(input);
-
- float c = tex2D(_MainTex, input.atlas).a;
-
- #ifndef UNDERLAY_ON
- clip(c - input.param.x);
- #endif
-
- float scale = input.param.y;
- float bias = input.param.z;
- float weight = input.param.w;
- float sd = (bias - c) * scale;
-
- float outline = (_OutlineWidth * _ScaleRatioA) * scale;
- float softness = (_OutlineSoftness * _ScaleRatioA) * scale;
-
- half4 faceColor = _FaceColor;
- half4 outlineColor = _OutlineColor;
-
- faceColor.rgb *= input.color.rgb;
-
- faceColor *= tex2D(_FaceTex, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y);
- outlineColor *= tex2D(_OutlineTex, input.textures.zw + float2(_OutlineUVSpeedX, _OutlineUVSpeedY) * _Time.y);
-
- faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
-
- #if BEVEL_ON
- float3 dxy = float3(0.5 / _TextureWidth, 0.5 / _TextureHeight, 0);
- float3 n = GetSurfaceNormal(input.atlas, weight, dxy);
-
- float3 bump = UnpackNormal(tex2D(_BumpMap, input.textures.xy + float2(_FaceUVSpeedX, _FaceUVSpeedY) * _Time.y)).xyz;
- bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
- n = normalize(n- bump);
-
- float3 light = normalize(float3(sin(_LightAngle), cos(_LightAngle), -1.0));
-
- float3 col = GetSpecular(n, light);
- faceColor.rgb += col*faceColor.a;
- faceColor.rgb *= 1-(dot(n, light)*_Diffuse);
- faceColor.rgb *= lerp(_Ambient, 1, n.z*n.z);
-
- fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDir, -n));
- faceColor.rgb += reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
- #endif
-
- #if UNDERLAY_ON
- float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
- faceColor += input.underlayColor * saturate(d - input.texcoord2.w) * (1 - faceColor.a);
- #endif
-
- #if UNDERLAY_INNER
- float d = tex2D(_MainTex, input.texcoord2.xy).a * input.texcoord2.z;
- faceColor += input.underlayColor * (1 - saturate(d - input.texcoord2.w)) * saturate(1 - sd) * (1 - faceColor.a);
- #endif
-
- #if GLOW_ON
- float4 glowColor = GetGlowColor(sd, scale);
- faceColor.rgb += glowColor.rgb * glowColor.a;
- #endif
-
- // Alternative implementation to UnityGet2DClipping with support for softness.
- #if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
- faceColor *= m.x * m.y;
- #endif
-
- #if UNITY_UI_ALPHACLIP
- clip(faceColor.a - 0.001);
- #endif
-
- return faceColor * input.color.a;
- }
- ENDCG
- }
-}
-
-Fallback "TextMeshPro/Mobile/Distance Field"
-CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
-}
+ ENDCG
+ }
+ }
+
+ Fallback "TextMeshPro/Mobile/Distance Field"
+ CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader b/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader
index 4012a08..fc46f0e 100644
--- a/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader
+++ b/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader
@@ -1,131 +1,132 @@
Shader "TextMeshPro/Sprite"
{
- Properties
- {
- _MainTex ("Sprite Texture", 2D) = "white" {}
- _Color ("Tint", Color) = (1,1,1,1)
-
- _StencilComp ("Stencil Comparison", Float) = 8
- _Stencil ("Stencil ID", Float) = 0
- _StencilOp ("Stencil Operation", Float) = 0
- _StencilWriteMask ("Stencil Write Mask", Float) = 255
- _StencilReadMask ("Stencil Read Mask", Float) = 255
-
- _CullMode ("Cull Mode", Float) = 0
- _ColorMask ("Color Mask", Float) = 15
- _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
-
- [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
- }
-
- SubShader
- {
- Tags
- {
- "Queue"="Transparent"
- "IgnoreProjector"="True"
- "RenderType"="Transparent"
- "PreviewType"="Plane"
- "CanUseSpriteAtlas"="True"
- }
-
- Stencil
- {
- Ref [_Stencil]
- Comp [_StencilComp]
- Pass [_StencilOp]
- ReadMask [_StencilReadMask]
- WriteMask [_StencilWriteMask]
- }
-
- Cull [_CullMode]
- Lighting Off
- ZWrite Off
- ZTest [unity_GUIZTestMode]
- Blend SrcAlpha OneMinusSrcAlpha
- ColorMask [_ColorMask]
-
- Pass
- {
+ Properties
+ {
+ _MainTex ("Sprite Texture", 2D) = "white" {}
+ _Color ("Tint", Color) = (1,1,1,1)
+
+ _StencilComp ("Stencil Comparison", Float) = 8
+ _Stencil ("Stencil ID", Float) = 0
+ _StencilOp ("Stencil Operation", Float) = 0
+ _StencilWriteMask ("Stencil Write Mask", Float) = 255
+ _StencilReadMask ("Stencil Read Mask", Float) = 255
+
+ _CullMode ("Cull Mode", Float) = 0
+ _ColorMask ("Color Mask", Float) = 15
+ _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
+
+ [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
+ }
+
+ SubShader
+ {
+ Tags
+ {
+ "Queue"="Transparent"
+ "IgnoreProjector"="True"
+ "RenderType"="Transparent"
+ "PreviewType"="Plane"
+ "CanUseSpriteAtlas"="True"
+ }
+
+ Stencil
+ {
+ Ref [_Stencil]
+ Comp [_StencilComp]
+ Pass [_StencilOp]
+ ReadMask [_StencilReadMask]
+ WriteMask [_StencilWriteMask]
+ }
+
+ Cull [_CullMode]
+ Lighting Off
+ ZWrite Off
+ ZTest [unity_GUIZTestMode]
+ Blend SrcAlpha OneMinusSrcAlpha
+ ColorMask [_ColorMask]
+
+ Pass
+ {
Name "Default"
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
+ CGPROGRAM
+ #pragma vertex vert
+ #pragma fragment frag
#pragma target 2.0
- #include "UnityCG.cginc"
- #include "UnityUI.cginc"
+ #include "UnityCG.cginc"
+ #include "UnityUI.cginc"
#pragma multi_compile __ UNITY_UI_CLIP_RECT
#pragma multi_compile __ UNITY_UI_ALPHACLIP
- struct appdata_t
- {
- float4 vertex : POSITION;
- float4 color : COLOR;
- float2 texcoord : TEXCOORD0;
+ struct appdata_t
+ {
+ float4 vertex : POSITION;
+ float4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
- };
-
- struct v2f
- {
- float4 vertex : SV_POSITION;
- fixed4 color : COLOR;
- float2 texcoord : TEXCOORD0;
- float4 worldPosition : TEXCOORD1;
- float4 mask : TEXCOORD2;
+ };
+
+ struct v2f
+ {
+ float4 vertex : SV_POSITION;
+ fixed4 color : COLOR;
+ float2 texcoord : TEXCOORD0;
+ float4 worldPosition : TEXCOORD1;
+ float4 mask : TEXCOORD2;
UNITY_VERTEX_OUTPUT_STEREO
- };
+ };
sampler2D _MainTex;
- fixed4 _Color;
- fixed4 _TextureSampleAdd;
- float4 _ClipRect;
+ fixed4 _Color;
+ fixed4 _TextureSampleAdd;
+ float4 _ClipRect;
float4 _MainTex_ST;
- float _UIMaskSoftnessX;
+ float _UIMaskSoftnessX;
float _UIMaskSoftnessY;
int _UIVertexColorAlwaysGammaSpace;
v2f vert(appdata_t v)
- {
- v2f OUT;
+ {
+ v2f OUT;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
- float4 vPosition = UnityObjectToClipPos(v.vertex);
- OUT.worldPosition = v.vertex;
- OUT.vertex = vPosition;
+ float4 vPosition = UnityObjectToClipPos(v.vertex);
+ OUT.worldPosition = v.vertex;
+ OUT.vertex = vPosition;
- float2 pixelSize = vPosition.w;
+ float2 pixelSize = vPosition.w;
pixelSize /= abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
- float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
+ float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
- OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));
+ OUT.mask = half4(v.vertex.xy * 2 - clampedRect.xy - clampedRect.zw,
+ 0.25 / (0.25 * half2(_UIMaskSoftnessX, _UIMaskSoftnessY) + abs(pixelSize.xy)));
if (_UIVertexColorAlwaysGammaSpace && !IsGammaSpace())
{
v.color.rgb = UIGammaToLinear(v.color.rgb);
}
OUT.color = v.color * _Color;
- return OUT;
- }
+ return OUT;
+ }
- fixed4 frag(v2f IN) : SV_Target
- {
- half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
+ fixed4 frag(v2f IN) : SV_Target
+ {
+ half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
#if UNITY_UI_CLIP_RECT
- half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
- color *= m.x * m.y;
- #endif
-
- #ifdef UNITY_UI_ALPHACLIP
- clip (color.a - 0.001);
- #endif
-
- return color;
- }
- ENDCG
- }
- }
-}
+ half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
+ color *= m.x * m.y;
+ #endif
+
+ #ifdef UNITY_UI_ALPHACLIP
+ clip(color.a - 0.001);
+ #endif
+
+ return color;
+ }
+ ENDCG
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMPro.cginc b/Assets/TextMesh Pro/Shaders/TMPro.cginc
index 5898130..038ee22 100644
--- a/Assets/TextMesh Pro/Shaders/TMPro.cginc
+++ b/Assets/TextMesh Pro/Shaders/TMPro.cginc
@@ -1,84 +1,85 @@
float2 UnpackUV(float uv)
-{
- float2 output;
- output.x = floor(uv / 4096);
- output.y = uv - 4096 * output.x;
+{
+ float2 output;
+ output.x = floor(uv / 4096);
+ output.y = uv - 4096 * output.x;
- return output * 0.001953125;
+ return output * 0.001953125;
}
fixed4 GetColor(half d, fixed4 faceColor, fixed4 outlineColor, half outline, half softness)
{
- half faceAlpha = 1-saturate((d - outline * 0.5 + softness * 0.5) / (1.0 + softness));
- half outlineAlpha = saturate((d + outline * 0.5)) * sqrt(min(1.0, outline));
+ half faceAlpha = 1 - saturate((d - outline * 0.5 + softness * 0.5) / (1.0 + softness));
+ half outlineAlpha = saturate((d + outline * 0.5)) * sqrt(min(1.0, outline));
- faceColor.rgb *= faceColor.a;
- outlineColor.rgb *= outlineColor.a;
+ faceColor.rgb *= faceColor.a;
+ outlineColor.rgb *= outlineColor.a;
- faceColor = lerp(faceColor, outlineColor, outlineAlpha);
+ faceColor = lerp(faceColor, outlineColor, outlineAlpha);
- faceColor *= faceAlpha;
+ faceColor *= faceAlpha;
- return faceColor;
+ return faceColor;
}
float3 GetSurfaceNormal(float4 h, float bias)
{
- bool raisedBevel = step(1, fmod(_ShaderFlags, 2));
+ bool raisedBevel = step(1, fmod(_ShaderFlags, 2));
- h += bias+_BevelOffset;
+ h += bias + _BevelOffset;
- float bevelWidth = max(.01, _OutlineWidth+_BevelWidth);
+ float bevelWidth = max(.01, _OutlineWidth + _BevelWidth);
- // Track outline
- h -= .5;
- h /= bevelWidth;
- h = saturate(h+.5);
+ // Track outline
+ h -= .5;
+ h /= bevelWidth;
+ h = saturate(h + .5);
- if(raisedBevel) h = 1 - abs(h*2.0 - 1.0);
- h = lerp(h, sin(h*3.141592/2.0), _BevelRoundness);
- h = min(h, 1.0-_BevelClamp);
- h *= _Bevel * bevelWidth * _GradientScale * -2.0;
+ if (raisedBevel) h = 1 - abs(h * 2.0 - 1.0);
+ h = lerp(h, sin(h * 3.141592 / 2.0), _BevelRoundness);
+ h = min(h, 1.0 - _BevelClamp);
+ h *= _Bevel * bevelWidth * _GradientScale * -2.0;
- float3 va = normalize(float3(1.0, 0.0, h.y - h.x));
- float3 vb = normalize(float3(0.0, -1.0, h.w - h.z));
+ float3 va = normalize(float3(1.0, 0.0, h.y - h.x));
+ float3 vb = normalize(float3(0.0, -1.0, h.w - h.z));
- return cross(va, vb);
+ return cross(va, vb);
}
float3 GetSurfaceNormal(float2 uv, float bias, float3 delta)
{
- // Read "height field"
- float4 h = {tex2D(_MainTex, uv - delta.xz).a,
- tex2D(_MainTex, uv + delta.xz).a,
- tex2D(_MainTex, uv - delta.zy).a,
- tex2D(_MainTex, uv + delta.zy).a};
-
- return GetSurfaceNormal(h, bias);
+ // Read "height field"
+ float4 h = {
+ tex2D(_MainTex, uv - delta.xz).a,
+ tex2D(_MainTex, uv + delta.xz).a,
+ tex2D(_MainTex, uv - delta.zy).a,
+ tex2D(_MainTex, uv + delta.zy).a
+ };
+
+ return GetSurfaceNormal(h, bias);
}
float3 GetSpecular(float3 n, float3 l)
{
- float spec = pow(max(0.0, dot(n, l)), _Reflectivity);
- return _SpecularColor.rgb * spec * _SpecularPower;
+ float spec = pow(max(0.0, dot(n, l)), _Reflectivity);
+ return _SpecularColor.rgb * spec * _SpecularPower;
}
float4 GetGlowColor(float d, float scale)
{
- float glow = d - (_GlowOffset*_ScaleRatioB) * 0.5 * scale;
- float t = lerp(_GlowInner, (_GlowOuter * _ScaleRatioB), step(0.0, glow)) * 0.5 * scale;
- glow = saturate(abs(glow/(1.0 + t)));
- glow = 1.0-pow(glow, _GlowPower);
- glow *= sqrt(min(1.0, t)); // Fade off glow thinner than 1 screen pixel
- return float4(_GlowColor.rgb, saturate(_GlowColor.a * glow * 2));
+ float glow = d - (_GlowOffset * _ScaleRatioB) * 0.5 * scale;
+ float t = lerp(_GlowInner, (_GlowOuter * _ScaleRatioB), step(0.0, glow)) * 0.5 * scale;
+ glow = saturate(abs(glow / (1.0 + t)));
+ glow = 1.0 - pow(glow, _GlowPower);
+ glow *= sqrt(min(1.0, t)); // Fade off glow thinner than 1 screen pixel
+ return float4(_GlowColor.rgb, saturate(_GlowColor.a * glow * 2));
}
float4 BlendARGB(float4 overlying, float4 underlying)
{
- overlying.rgb *= overlying.a;
- underlying.rgb *= underlying.a;
- float3 blended = overlying.rgb + ((1-overlying.a)*underlying.rgb);
- float alpha = underlying.a + (1-underlying.a)*overlying.a;
- return float4(blended, alpha);
-}
-
+ overlying.rgb *= overlying.a;
+ underlying.rgb *= underlying.a;
+ float3 blended = overlying.rgb + ((1 - overlying.a) * underlying.rgb);
+ float alpha = underlying.a + (1 - underlying.a) * overlying.a;
+ return float4(blended, alpha);
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc
index d145a77..148ca7d 100644
--- a/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc
+++ b/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc
@@ -1,26 +1,26 @@
struct vertex_t
{
UNITY_VERTEX_INPUT_INSTANCE_ID
- float4 position : POSITION;
- float3 normal : NORMAL;
- float4 color : COLOR;
- float4 texcoord0 : TEXCOORD0;
- float2 texcoord1 : TEXCOORD1;
+ float4 position : POSITION;
+ float3 normal : NORMAL;
+ float4 color : COLOR;
+ float4 texcoord0 : TEXCOORD0;
+ float2 texcoord1 : TEXCOORD1;
};
struct pixel_t
{
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
- float4 position : SV_POSITION;
- float4 faceColor : COLOR;
- float4 outlineColor : COLOR1;
- float4 texcoord0 : TEXCOORD0;
- float4 param : TEXCOORD1; // x = weight, y = no longer used
- float2 mask : TEXCOORD2;
+ float4 position : SV_POSITION;
+ float4 faceColor : COLOR;
+ float4 outlineColor : COLOR1;
+ float4 texcoord0 : TEXCOORD0;
+ float4 param : TEXCOORD1; // x = weight, y = no longer used
+ float2 mask : TEXCOORD2;
#if (UNDERLAY_ON || UNDERLAY_INNER)
- float4 texcoord2 : TEXCOORD3;
- float4 underlayColor : COLOR2;
+ float4 texcoord2 : TEXCOORD3;
+ float4 underlayColor : COLOR2;
#endif
};
@@ -127,14 +127,16 @@ float4 PixShader(pixel_t input) : SV_Target
#if UNDERLAY_ON
d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale;
- faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 - faceColor.a);
+ faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 -
+ faceColor.a);
#endif
#if UNDERLAY_INNER
float bias = input.param.x * scale - 0.5;
float sd = saturate(d * scale - bias - input.param.z);
d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale;
- faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a);
+ faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd *
+ (1 - faceColor.a);
#endif
#if MASKING
@@ -162,4 +164,4 @@ float4 PixShader(pixel_t input) : SV_Target
#endif
return faceColor;
-}
+}
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc
index b806b4f..52a4e24 100644
--- a/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc
+++ b/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc
@@ -1,80 +1,80 @@
// UI Editable properties
-uniform sampler2D _FaceTex; // Alpha : Signed Distance
-uniform float _FaceUVSpeedX;
-uniform float _FaceUVSpeedY;
-uniform fixed4 _FaceColor; // RGBA : Color + Opacity
-uniform float _FaceDilate; // v[ 0, 1]
-uniform float _OutlineSoftness; // v[ 0, 1]
+uniform sampler2D _FaceTex; // Alpha : Signed Distance
+uniform float _FaceUVSpeedX;
+uniform float _FaceUVSpeedY;
+uniform fixed4 _FaceColor; // RGBA : Color + Opacity
+uniform float _FaceDilate; // v[ 0, 1]
+uniform float _OutlineSoftness; // v[ 0, 1]
-uniform sampler2D _OutlineTex; // RGBA : Color + Opacity
-uniform float _OutlineUVSpeedX;
-uniform float _OutlineUVSpeedY;
-uniform fixed4 _OutlineColor; // RGBA : Color + Opacity
-uniform float _OutlineWidth; // v[ 0, 1]
+uniform sampler2D _OutlineTex; // RGBA : Color + Opacity
+uniform float _OutlineUVSpeedX;
+uniform float _OutlineUVSpeedY;
+uniform fixed4 _OutlineColor; // RGBA : Color + Opacity
+uniform float _OutlineWidth; // v[ 0, 1]
-uniform float _Bevel; // v[ 0, 1]
-uniform float _BevelOffset; // v[-1, 1]
-uniform float _BevelWidth; // v[-1, 1]
-uniform float _BevelClamp; // v[ 0, 1]
-uniform float _BevelRoundness; // v[ 0, 1]
+uniform float _Bevel; // v[ 0, 1]
+uniform float _BevelOffset; // v[-1, 1]
+uniform float _BevelWidth; // v[-1, 1]
+uniform float _BevelClamp; // v[ 0, 1]
+uniform float _BevelRoundness; // v[ 0, 1]
-uniform sampler2D _BumpMap; // Normal map
-uniform float _BumpOutline; // v[ 0, 1]
-uniform float _BumpFace; // v[ 0, 1]
+uniform sampler2D _BumpMap; // Normal map
+uniform float _BumpOutline; // v[ 0, 1]
+uniform float _BumpFace; // v[ 0, 1]
-uniform samplerCUBE _Cube; // Cube / sphere map
-uniform fixed4 _ReflectFaceColor; // RGB intensity
-uniform fixed4 _ReflectOutlineColor;
+uniform samplerCUBE _Cube; // Cube / sphere map
+uniform fixed4 _ReflectFaceColor; // RGB intensity
+uniform fixed4 _ReflectOutlineColor;
//uniform float _EnvTiltX; // v[-1, 1]
//uniform float _EnvTiltY; // v[-1, 1]
-uniform float3 _EnvMatrixRotation;
-uniform float4x4 _EnvMatrix;
+uniform float3 _EnvMatrixRotation;
+uniform float4x4 _EnvMatrix;
-uniform fixed4 _SpecularColor; // RGB intensity
-uniform float _LightAngle; // v[ 0,Tau]
-uniform float _SpecularPower; // v[ 0, 1]
-uniform float _Reflectivity; // v[ 5, 15]
-uniform float _Diffuse; // v[ 0, 1]
-uniform float _Ambient; // v[ 0, 1]
+uniform fixed4 _SpecularColor; // RGB intensity
+uniform float _LightAngle; // v[ 0,Tau]
+uniform float _SpecularPower; // v[ 0, 1]
+uniform float _Reflectivity; // v[ 5, 15]
+uniform float _Diffuse; // v[ 0, 1]
+uniform float _Ambient; // v[ 0, 1]
-uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity
-uniform float _UnderlayOffsetX; // v[-1, 1]
-uniform float _UnderlayOffsetY; // v[-1, 1]
-uniform float _UnderlayDilate; // v[-1, 1]
-uniform float _UnderlaySoftness; // v[ 0, 1]
+uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity
+uniform float _UnderlayOffsetX; // v[-1, 1]
+uniform float _UnderlayOffsetY; // v[-1, 1]
+uniform float _UnderlayDilate; // v[-1, 1]
+uniform float _UnderlaySoftness; // v[ 0, 1]
-uniform fixed4 _GlowColor; // RGBA : Color + Intesity
-uniform float _GlowOffset; // v[-1, 1]
-uniform float _GlowOuter; // v[ 0, 1]
-uniform float _GlowInner; // v[ 0, 1]
-uniform float _GlowPower; // v[ 1, 1/(1+4*4)]
+uniform fixed4 _GlowColor; // RGBA : Color + Intesity
+uniform float _GlowOffset; // v[-1, 1]
+uniform float _GlowOuter; // v[ 0, 1]
+uniform float _GlowInner; // v[ 0, 1]
+uniform float _GlowPower; // v[ 1, 1/(1+4*4)]
// API Editable properties
-uniform float _ShaderFlags;
-uniform float _WeightNormal;
-uniform float _WeightBold;
+uniform float _ShaderFlags;
+uniform float _WeightNormal;
+uniform float _WeightBold;
-uniform float _ScaleRatioA;
-uniform float _ScaleRatioB;
-uniform float _ScaleRatioC;
+uniform float _ScaleRatioA;
+uniform float _ScaleRatioB;
+uniform float _ScaleRatioC;
-uniform float _VertexOffsetX;
-uniform float _VertexOffsetY;
+uniform float _VertexOffsetX;
+uniform float _VertexOffsetY;
//uniform float _UseClipRect;
-uniform float _MaskID;
-uniform sampler2D _MaskTex;
-uniform float4 _MaskCoord;
-uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w)
-uniform float _MaskSoftnessX;
-uniform float _MaskSoftnessY;
+uniform float _MaskID;
+uniform sampler2D _MaskTex;
+uniform float4 _MaskCoord;
+uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w)
+uniform float _MaskSoftnessX;
+uniform float _MaskSoftnessY;
// Font Atlas properties
-uniform sampler2D _MainTex;
-uniform float _TextureWidth;
-uniform float _TextureHeight;
-uniform float _GradientScale;
-uniform float _ScaleX;
-uniform float _ScaleY;
-uniform float _PerspectiveFilter;
-uniform float _Sharpness;
+uniform sampler2D _MainTex;
+uniform float _TextureWidth;
+uniform float _TextureHeight;
+uniform float _GradientScale;
+uniform float _ScaleX;
+uniform float _ScaleY;
+uniform float _PerspectiveFilter;
+uniform float _Sharpness;
\ No newline at end of file
diff --git a/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc b/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc
index 2153a9a..03a2ff2 100644
--- a/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc
+++ b/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc
@@ -1,99 +1,104 @@
void VertShader(inout appdata_full v, out Input data)
{
- v.vertex.x += _VertexOffsetX;
- v.vertex.y += _VertexOffsetY;
-
- UNITY_INITIALIZE_OUTPUT(Input, data);
-
- float bold = step(v.texcoord.w, 0);
-
- // Generate normal for backface
- float3 view = ObjSpaceViewDir(v.vertex);
- v.normal *= sign(dot(v.normal, view));
-
-#if USE_DERIVATIVE
- data.param.y = 1;
-#else
- float4 vert = v.vertex;
- float4 vPosition = UnityObjectToClipPos(vert);
- float2 pixelSize = vPosition.w;
-
- pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy);
- float scale = rsqrt(dot(pixelSize, pixelSize));
- scale *= abs(v.texcoord.w) * _GradientScale * (_Sharpness + 1);
- scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
- data.param.y = scale;
-#endif
-
- data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; //
- data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex));
+ v.vertex.x += _VertexOffsetX;
+ v.vertex.y += _VertexOffsetY;
+
+ UNITY_INITIALIZE_OUTPUT(Input, data);
+
+ float bold = step(v.texcoord.w, 0);
+
+ // Generate normal for backface
+ float3 view = ObjSpaceViewDir(v.vertex);
+ v.normal *= sign(dot(v.normal, view));
+
+ #if USE_DERIVATIVE
+ data.param.y = 1;
+ #else
+ float4 vert = v.vertex;
+ float4 vPosition = UnityObjectToClipPos(vert);
+ float2 pixelSize = vPosition.w;
+
+ pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy);
+ float scale = rsqrt(dot(pixelSize, pixelSize));
+ scale *= abs(v.texcoord.w) * _GradientScale * (_Sharpness + 1);
+ scale = lerp(scale * (1 - _PerspectiveFilter), scale,
+ abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
+ data.param.y = scale;
+ #endif
+
+ data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; //
+ data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex));
}
void PixShader(Input input, inout SurfaceOutput o)
{
-
-#if USE_DERIVATIVE
- float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y));
- pixelSize *= _TextureWidth * .75;
- float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1);
-#else
- float scale = input.param.y;
-#endif
-
- // Signed distance
- float c = tex2D(_MainTex, input.uv_MainTex).a;
- float sd = (.5 - c - input.param.x) * scale + .5;
- float outline = _OutlineWidth*_ScaleRatioA * scale;
- float softness = _OutlineSoftness*_ScaleRatioA * scale;
-
- // Color & Alpha
- float4 faceColor = _FaceColor;
- float4 outlineColor = _OutlineColor;
- faceColor *= input.color;
- outlineColor.a *= input.color.a;
- faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y));
- outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y));
- faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
- faceColor.rgb /= max(faceColor.a, 0.0001);
-
-#if BEVEL_ON
- float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0);
-
- float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a,
- tex2D(_MainTex, input.uv_MainTex + delta.xz).a,
- tex2D(_MainTex, input.uv_MainTex - delta.zy).a,
- tex2D(_MainTex, input.uv_MainTex + delta.zy).a };
-
- // Face Normal
- float3 n = GetSurfaceNormal(smp4x, input.param.x);
-
- // Bumpmap
- float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz;
- bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
- bump = lerp(float3(0, 0, 1), bump, faceColor.a);
- n = normalize(n - bump);
-
- // Cubemap reflection
- fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n)));
- float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
-#else
- float3 n = float3(0, 0, -1);
- float3 emission = float3(0, 0, 0);
-#endif
-
-#if GLOW_ON
- float4 glowColor = GetGlowColor(sd, scale);
- glowColor.a *= input.color.a;
- emission += glowColor.rgb*glowColor.a;
- faceColor = BlendARGB(glowColor, faceColor);
- faceColor.rgb /= max(faceColor.a, 0.0001);
-#endif
-
- // Set Standard output structure
- o.Albedo = faceColor.rgb;
- o.Normal = -n;
- o.Emission = emission;
- o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5));
- o.Gloss = 1;
- o.Alpha = faceColor.a;
-}
+ #if USE_DERIVATIVE
+ float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y));
+ pixelSize *= _TextureWidth * .75;
+ float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1);
+ #else
+ float scale = input.param.y;
+ #endif
+
+ // Signed distance
+ float c = tex2D(_MainTex, input.uv_MainTex).a;
+ float sd = (.5 - c - input.param.x) * scale + .5;
+ float outline = _OutlineWidth * _ScaleRatioA * scale;
+ float softness = _OutlineSoftness * _ScaleRatioA * scale;
+
+ // Color & Alpha
+ float4 faceColor = _FaceColor;
+ float4 outlineColor = _OutlineColor;
+ faceColor *= input.color;
+ outlineColor.a *= input.color.a;
+ faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y,
+ input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y));
+ outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y,
+ input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y));
+ faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
+ faceColor.rgb /= max(faceColor.a, 0.0001);
+
+ #if BEVEL_ON
+ float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0);
+
+ float4 smp4x = {
+ tex2D(_MainTex, input.uv_MainTex - delta.xz).a,
+ tex2D(_MainTex, input.uv_MainTex + delta.xz).a,
+ tex2D(_MainTex, input.uv_MainTex - delta.zy).a,
+ tex2D(_MainTex, input.uv_MainTex + delta.zy).a
+ };
+
+ // Face Normal
+ float3 n = GetSurfaceNormal(smp4x, input.param.x);
+
+ // Bumpmap
+ float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz;
+ bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
+ bump = lerp(float3(0, 0, 1), bump, faceColor.a);
+ n = normalize(n - bump);
+
+ // Cubemap reflection
+ fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n)));
+ float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5))
+ * faceColor.a;
+ #else
+ float3 n = float3(0, 0, -1);
+ float3 emission = float3(0, 0, 0);
+ #endif
+
+ #if GLOW_ON
+ float4 glowColor = GetGlowColor(sd, scale);
+ glowColor.a *= input.color.a;
+ emission += glowColor.rgb * glowColor.a;
+ faceColor = BlendARGB(glowColor, faceColor);
+ faceColor.rgb /= max(faceColor.a, 0.0001);
+ #endif
+
+ // Set Standard output structure
+ o.Albedo = faceColor.rgb;
+ o.Normal = -n;
+ o.Emission = emission;
+ o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5));
+ o.Gloss = 1;
+ o.Alpha = faceColor.a;
+}
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/Data/ObservableDictionary.cs b/Assets/_Project/Scripts/Data/ObservableDictionary.cs
index 5932636..d496f56 100644
--- a/Assets/_Project/Scripts/Data/ObservableDictionary.cs
+++ b/Assets/_Project/Scripts/Data/ObservableDictionary.cs
@@ -1,28 +1,25 @@
-using System.Collections.Generic;
using System;
+using System.Collections.Generic;
namespace _Project.Data
{
public class ObservableDictionary : Dictionary
{
- public EventHandler ItemAdded;
- public EventHandler ItemRemoved;
-
- public ObservableDictionary() : base() { }
+ private EventHandler _itemAdded;
+ private EventHandler _itemRemoved;
public new void Add(TKey key, TValue value)
{
base.Add(key, value);
- ItemAdded?.Invoke(null, key);
+ _itemAdded?.Invoke(null, key);
}
public new bool Remove(TKey key)
{
- bool removed = base.Remove(key);
- if (removed)
- ItemRemoved(null, key);
-
+ var removed = base.Remove(key);
+ if (removed) _itemRemoved(null, key);
+
return removed;
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Data/SerializeableType.cs b/Assets/_Project/Scripts/Data/SerializeableType.cs
index 07e7986..a6d67fb 100644
--- a/Assets/_Project/Scripts/Data/SerializeableType.cs
+++ b/Assets/_Project/Scripts/Data/SerializeableType.cs
@@ -9,17 +9,18 @@ public class SerializeableType : ISerializationCallbackReceiver
[SerializeField] private string assemblyQualifiedName = string.Empty;
public Type Type { get; private set; }
- void ISerializationCallbackReceiver.OnBeforeSerialize()
- => assemblyQualifiedName = Type?.AssemblyQualifiedName ?? assemblyQualifiedName;
+ void ISerializationCallbackReceiver.OnBeforeSerialize()
+ {
+ assemblyQualifiedName = Type?.AssemblyQualifiedName ?? assemblyQualifiedName;
+ }
void ISerializationCallbackReceiver.OnAfterDeserialize()
{
- if (!TryGetType(assemblyQualifiedName, out var type))
- return;
-
+ if (!TryGetType(assemblyQualifiedName, out var type)) return;
+
Type = type;
}
-
+
private static bool TryGetType(string typeString, out Type type)
{
type = Type.GetType(typeString);
@@ -30,6 +31,6 @@ private static bool TryGetType(string typeString, out Type type)
// public static implicit operator Type(SerializeableType sType) => sType.Type;
// Implicit conversion from Type to SerializableType
- //public static implicit operator SerializeableType(Type type) => new() { Type = type };
+ // public static implicit operator SerializeableType(Type type) => new() { Type = type };
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Data/TypeFilterAttribute.cs b/Assets/_Project/Scripts/Data/TypeFilterAttribute.cs
index 78a5618..0a3616c 100644
--- a/Assets/_Project/Scripts/Data/TypeFilterAttribute.cs
+++ b/Assets/_Project/Scripts/Data/TypeFilterAttribute.cs
@@ -1,53 +1,16 @@
using System;
-using System.Linq;
using UnityEngine;
namespace _Project.Data
{
- public static class TypeFilterExtension
- {
- ///
- /// Checks if a given type inherits or implements a specified base type
- ///
- /// To be checked type
- /// The ancestor type
- /// True if type implements base type
- public static bool InheritsOrImplements(this Type type, Type baseType)
- {
- type = ResolveGenericType(type);
- baseType = ResolveGenericType(baseType);
-
- while (type != typeof(object))
- {
- if (baseType == type || HasAnyInterfaces(type, baseType)) return true;
-
- type = ResolveGenericType(type.BaseType);
- if (type == null) return false;
- }
-
- return false;
- }
-
- private static Type ResolveGenericType(Type type)
- {
- if (type is not { IsGenericType: true }) return type;
- var genericType = type.GetGenericTypeDefinition();
- return genericType != type ? genericType : type;
- }
-
- private static bool HasAnyInterfaces(Type type, Type interfaceType)
- => type.GetInterfaces().Any(i => ResolveGenericType(i) == interfaceType);
- }
-
public class TypeFilterAttribute : PropertyAttribute
{
- public Func Filter { get; }
public TypeFilterAttribute(Type filterType)
{
- Filter = type => !type.IsAbstract &&
- !type.IsInterface &&
- !type.IsGenericType &&
+ Filter = type => !type.IsAbstract && !type.IsInterface && !type.IsGenericType &&
type.InheritsOrImplements(filterType);
}
+
+ public Func Filter { get; }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Data/TypeFilterExtension.cs b/Assets/_Project/Scripts/Data/TypeFilterExtension.cs
new file mode 100644
index 0000000..b3f71c9
--- /dev/null
+++ b/Assets/_Project/Scripts/Data/TypeFilterExtension.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Linq;
+
+namespace _Project.Data
+{
+ public static class TypeFilterExtension
+ {
+ ///
+ /// Checks if a given type inherits or implements a specified base type
+ ///
+ /// To be checked type
+ /// The ancestor type
+ /// True if type implements base type
+ public static bool InheritsOrImplements(this Type type, Type baseType)
+ {
+ type = ResolveGenericType(type);
+ baseType = ResolveGenericType(baseType);
+
+ while (type != typeof(object))
+ {
+ if (baseType == type || HasAnyInterfaces(type, baseType)) return true;
+
+ type = ResolveGenericType(type.BaseType);
+ if (type == null) return false;
+ }
+
+ return false;
+ }
+
+ private static bool HasAnyInterfaces(Type type, Type interfaceType)
+ {
+ return type.GetInterfaces().Any(i => ResolveGenericType(i) == interfaceType);
+ }
+
+ private static Type ResolveGenericType(Type type)
+ {
+ if (type is not { IsGenericType: true }) return type;
+
+ var genericType = type.GetGenericTypeDefinition();
+ return genericType != type ? genericType : type;
+ }
+ }
+}
diff --git a/Assets/_Project/Scripts/Data/TypeFilterExtension.cs.meta b/Assets/_Project/Scripts/Data/TypeFilterExtension.cs.meta
new file mode 100644
index 0000000..3ebb02f
--- /dev/null
+++ b/Assets/_Project/Scripts/Data/TypeFilterExtension.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 7162dc10d3ef47388fa008a295d7a0fc
+timeCreated: 1785678635
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/Infrastructure/ProjectInstaller.cs b/Assets/_Project/Scripts/Infrastructure/ProjectInstaller.cs
index 34676ac..b99107d 100644
--- a/Assets/_Project/Scripts/Infrastructure/ProjectInstaller.cs
+++ b/Assets/_Project/Scripts/Infrastructure/ProjectInstaller.cs
@@ -1,15 +1,18 @@
-using _Project.SaveLoad;
-using _Project.SceneLoader;
+using System;
using _Project.AssetManagement;
using _Project.CurrentLevelProgress;
using _Project.Factory;
-using _Project.States;
using _Project.PersistentProgress;
+using _Project.SaveLoad;
+using _Project.SceneLoader;
+using _Project.States;
using _Project.StaticData;
using _Project.TimeService;
using _Project.UI.Factory;
using Reflex.Core;
+using Reflex.Enums;
using UnityEngine;
+using Resolution = Reflex.Enums.Resolution;
namespace _Project.Infrastructure
{
@@ -23,23 +26,30 @@ public class ProjectInstaller : MonoBehaviour, IInstaller
///
public void InstallBindings(ContainerBuilder builder)
{
- builder.AddSingleton(typeof(AssetProvider), typeof(IAssetProvider));
- builder.AddSingleton(typeof(PersistentProgress.PersistentProgress), typeof(IPersistentProgress));
- builder.AddSingleton(typeof(PlayerPrefsSaveLoad), typeof(ISaveLoad));
- builder.AddSingleton(typeof(ScriptableStaticData), typeof(IStaticData));
- builder.AddSingleton(typeof(AsyncSceneLoader), typeof(ISceneLoader));
+ // Singleton bindings - Eager
+ builder.RegisterType(typeof(AssetProvider), new[] { typeof(IAssetProvider) }, Lifetime.Singleton,
+ Resolution.Eager);
+ builder.RegisterType(typeof(PersistentProgress.PersistentProgress), new[] { typeof(IPersistentProgress) },
+ Lifetime.Singleton, Resolution.Eager);
+ builder.RegisterType(typeof(PlayerPrefsSaveLoad), new[] { typeof(ISaveLoad) }, Lifetime.Singleton,
+ Resolution.Eager);
+ builder.RegisterType(typeof(ScriptableStaticData), new[] { typeof(IStaticData) }, Lifetime.Singleton,
+ Resolution.Eager);
+ builder.RegisterType(typeof(AsyncSceneLoader), new[] { typeof(ISceneLoader) }, Lifetime.Singleton,
+ Resolution.Eager);
+ builder.RegisterType(typeof(GameStateMachine), new Type[] { }, Lifetime.Singleton, Resolution.Eager);
+
+ // Scoped bindings - Eager
+ builder.RegisterType(typeof(GameFactory),
+ new[] { typeof(IGameFactory), typeof(ISavedProgressReader), typeof(IProgressUpdater) }, Lifetime.Scoped,
+ Resolution.Eager);
+ builder.RegisterType(typeof(UIFactory), new[] { typeof(IUIFactory) }, Lifetime.Scoped, Resolution.Eager);
+ builder.RegisterType(typeof(LevelProgress), new[] { typeof(ILevelProgress) }, Lifetime.Scoped,
+ Resolution.Eager);
+ builder.RegisterType(typeof(InGameTimeService), new[] { typeof(IInGameTimeService) }, Lifetime.Scoped,
+ Resolution.Eager);
- builder.AddScoped(typeof(GameFactory), typeof(IGameFactory), typeof(ISavedProgressReader),
- typeof(IProgressUpdater));
- builder.AddScoped(typeof(UIFactory), typeof(IUIFactory));
- builder.AddScoped(typeof(LevelProgress), typeof(ILevelProgress));
- builder.AddScoped(typeof(InGameTimeService), typeof(IInGameTimeService));
-
- builder.AddSingleton(typeof(GameStateMachine));
- builder.OnContainerBuilt += container =>
- {
- container.Single().Enter();
- };
+ builder.OnContainerBuilt += container => { container.Single().Enter(); };
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/AssetManagement/AssetPath.cs b/Assets/_Project/Scripts/Services/AssetManagement/AssetPath.cs
index eddfef5..f814ea6 100644
--- a/Assets/_Project/Scripts/Services/AssetManagement/AssetPath.cs
+++ b/Assets/_Project/Scripts/Services/AssetManagement/AssetPath.cs
@@ -2,15 +2,15 @@
{
public static class AssetPath
{
- public const string PlayerCorePrefabPath = "Prefabs/Buildings/Core";
- public const string MobPath = "Prefabs/Mobs/";
public const string BuilderPrefabPath = "Prefabs/Other/Builder";
public const string BuildingCard = "Prefabs/UI/Building Card";
- public const string LevelSelectButton = "Prefabs/UI/LevelSelectButton";
public const string CameraPrefabPath = "Prefabs/Camera/Camera";
+ public const string LevelSelectButton = "Prefabs/UI/LevelSelectButton";
public const string MobCoroutineRunner = "Prefabs/Other/MobCoroutineRunner";
+ public const string MobPath = "Prefabs/Mobs/";
+ public const string MoneyUI = "Prefabs/UI/MoneyUI";
+ public const string PlayerCorePrefabPath = "Prefabs/Buildings/Core";
public const string TutorialImagePath = "Prefabs/Tutorial/TutorialImage";
public const string TutorialWindowPath = "Prefabs/Tutorial/TutorialWindow";
- public const string MoneyUI = "Prefabs/UI/MoneyUI";
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/AssetManagement/AssetProvider.cs b/Assets/_Project/Scripts/Services/AssetManagement/AssetProvider.cs
index 6c23f8c..84c122b 100644
--- a/Assets/_Project/Scripts/Services/AssetManagement/AssetProvider.cs
+++ b/Assets/_Project/Scripts/Services/AssetManagement/AssetProvider.cs
@@ -5,28 +5,44 @@ namespace _Project.AssetManagement
{
public class AssetProvider : IAssetProvider
{
- public T Instantiate(string path) where T : MonoBehaviour
- => Object.Instantiate(Resources.Load(path));
+ public T Instantiate(string path) where T : MonoBehaviour
+ {
+ return Object.Instantiate(Resources.Load(path));
+ }
+
+ public T Instantiate(string path, Vector3 at) where T : MonoBehaviour
+ {
+ return Object.Instantiate(Resources.Load(path), at, Quaternion.identity);
+ }
- public T Instantiate(string path, Vector3 at) where T : MonoBehaviour
- => Object.Instantiate(Resources.Load(path), at, Quaternion.identity);
-
public T Instantiate(string path, Transform parent) where T : MonoBehaviour
- => Object.Instantiate(Resources.Load(path), parent);
+ {
+ return Object.Instantiate(Resources.Load(path), parent);
+ }
public T Instantiate(T prefab, Vector3 position) where T : MonoBehaviour
- => Object.Instantiate(prefab, position, quaternion.identity);
-
+ {
+ return Object.Instantiate(prefab, position, quaternion.identity);
+ }
+
public T Instantiate(T prefab, Transform parent) where T : MonoBehaviour
- => Object.Instantiate(prefab, parent);
+ {
+ return Object.Instantiate(prefab, parent);
+ }
- public GameObject Instantiate(string path)
- => Object.Instantiate(Resources.Load(path));
+ public GameObject Instantiate(string path)
+ {
+ return Object.Instantiate(Resources.Load(path));
+ }
- public GameObject Instantiate(string path, Vector3 at)
- => Object.Instantiate(Resources.Load(path), at, Quaternion.identity);
+ public GameObject Instantiate(string path, Vector3 at)
+ {
+ return Object.Instantiate(Resources.Load(path), at, Quaternion.identity);
+ }
public GameObject Instantiate(string path, Transform parent)
- => Object.Instantiate(Resources.Load(path), parent);
+ {
+ return Object.Instantiate(Resources.Load(path), parent);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/AssetManagement/Constants.cs b/Assets/_Project/Scripts/Services/AssetManagement/Constants.cs
index c0eabf4..c63885c 100644
--- a/Assets/_Project/Scripts/Services/AssetManagement/Constants.cs
+++ b/Assets/_Project/Scripts/Services/AssetManagement/Constants.cs
@@ -2,15 +2,15 @@ namespace _Project.AssetManagement
{
public static class Constants
{
+ public const string CameraSpawnPoint = "CameraSpawnPoint";
public const string CoreSpawnPoint = "CoreSpawnPoint";
-
- public const float TimeToTick = .1f;
public const string MobTag = "Mob";
- public const int TotalLevels = 2;
- public const string CameraSpawnPoint = "CameraSpawnPoint";
public const string TilemapTagName = "Tilemap";
public const float TimeLeftAfterPreparationTimeSkip = 3f;
+
+ public const float TimeToTick = .1f;
+ public const int TotalLevels = 2;
public const int TutorialLevelIndex = 0;
public const string TutorialSceneName = "Tutorial";
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/AssetManagement/IAssetProvider.cs b/Assets/_Project/Scripts/Services/AssetManagement/IAssetProvider.cs
index f5cff82..ebc2aa7 100644
--- a/Assets/_Project/Scripts/Services/AssetManagement/IAssetProvider.cs
+++ b/Assets/_Project/Scripts/Services/AssetManagement/IAssetProvider.cs
@@ -13,4 +13,4 @@ public interface IAssetProvider
public T Instantiate(T prefab, Vector3 position) where T : MonoBehaviour;
T Instantiate(T prefab, Transform parent) where T : MonoBehaviour;
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/Factory/GameFactory.cs b/Assets/_Project/Scripts/Services/Factory/GameFactory.cs
index 98cfde5..c13b9cf 100644
--- a/Assets/_Project/Scripts/Services/Factory/GameFactory.cs
+++ b/Assets/_Project/Scripts/Services/Factory/GameFactory.cs
@@ -1,3 +1,4 @@
+using System;
using System.Collections.Generic;
using _Project.AssetManagement;
using _Project.PersistentProgress;
@@ -9,18 +10,15 @@ public class GameFactory : IGameFactory
private readonly IAssetProvider _assets;
private readonly IPersistentProgress _progress;
- public List ProgressReaders { get; } = new();
- public List ProgressWriters { get; } = new()
- {
- Capacity = 0
- };
-
public GameFactory(IAssetProvider assets, IPersistentProgress progress)
{
_assets = assets;
_progress = progress;
}
-
+
+ public List ProgressReaders { get; } = new();
+ public List ProgressWriters { get; } = new() { Capacity = 0 };
+
public void CleanUp()
{
ProgressReaders.Clear();
@@ -29,12 +27,12 @@ public void CleanUp()
public void LoadProgress(CurrentPlayerProgress progress)
{
- throw new System.NotImplementedException();
+ throw new NotImplementedException();
}
public void UpdateProgress(CurrentPlayerProgress progress)
{
- throw new System.NotImplementedException();
+ throw new NotImplementedException();
}
}
}
diff --git a/Assets/_Project/Scripts/Services/Factory/IGameFactory.cs b/Assets/_Project/Scripts/Services/Factory/IGameFactory.cs
index 4e962ae..8110615 100644
--- a/Assets/_Project/Scripts/Services/Factory/IGameFactory.cs
+++ b/Assets/_Project/Scripts/Services/Factory/IGameFactory.cs
@@ -5,8 +5,8 @@ namespace _Project.Factory
{
public interface IGameFactory : IProgressUpdater
{
- List ProgressReaders { get; }
+ List ProgressReaders { get; }
List ProgressWriters { get; }
void CleanUp();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/LevelProgress/ILevelProgress.cs b/Assets/_Project/Scripts/Services/LevelProgress/ILevelProgress.cs
index 388fa2a..0b8778a 100644
--- a/Assets/_Project/Scripts/Services/LevelProgress/ILevelProgress.cs
+++ b/Assets/_Project/Scripts/Services/LevelProgress/ILevelProgress.cs
@@ -4,4 +4,4 @@ public interface ILevelProgress
{
void LoadLevelConfig(LevelConfig levelConfig);
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/LevelProgress/LevelConfig.cs b/Assets/_Project/Scripts/Services/LevelProgress/LevelConfig.cs
index 9cfacb5..43cdc9a 100644
--- a/Assets/_Project/Scripts/Services/LevelProgress/LevelConfig.cs
+++ b/Assets/_Project/Scripts/Services/LevelProgress/LevelConfig.cs
@@ -5,24 +5,25 @@ namespace _Project.CurrentLevelProgress
[CreateAssetMenu(fileName = "Level_", menuName = "Config/LevelConfig", order = 2)]
public class LevelConfig : ScriptableObject
{
- [Header("=== LEVEL ===")]
- [SerializeField] private int levelID = 0;
+ [Header("=== LEVEL ===")] [SerializeField] private int levelID = 0;
+
[SerializeField] private int initialMoney = 0;
- [Header("Core/generator parameters")]
- [SerializeField] private int coreHealth;
+
+ [Header("Core/generator parameters")] [SerializeField] private int coreHealth;
+
[SerializeField] private float generatorCurrentGenerationPerSecond;
[SerializeField] private float deltaBetweenSpawns;
- [Header("Building options")]
- [SerializeField] private int[] sentryIDs;
+
+ [Header("Building options")] [SerializeField] private int[] sentryIDs;
+
[SerializeField] private int[] buildingIDs;
- public int LevelID => levelID;
- public int InitialMoney => initialMoney;
+ public int[] BuildingIDs => buildingIDs;
public int CoreHealth => coreHealth;
- public int[] SentryIDs => sentryIDs;
- public float GeneratorCapacity => generatorCurrentGenerationPerSecond;
public float DeltaBetweenSpawns => deltaBetweenSpawns;
-
- public int[] BuildingIDs => buildingIDs;
+ public float GeneratorCapacity => generatorCurrentGenerationPerSecond;
+ public int InitialMoney => initialMoney;
+ public int LevelID => levelID;
+ public int[] SentryIDs => sentryIDs;
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/LevelProgress/LevelProgress.cs b/Assets/_Project/Scripts/Services/LevelProgress/LevelProgress.cs
index f1815c4..12bdc84 100644
--- a/Assets/_Project/Scripts/Services/LevelProgress/LevelProgress.cs
+++ b/Assets/_Project/Scripts/Services/LevelProgress/LevelProgress.cs
@@ -10,4 +10,4 @@ public void LoadLevelConfig(LevelConfig levelConfig)
_loadedLevelConfig = levelConfig;
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/PersistentProgress/CurrentPlayerProgress.cs b/Assets/_Project/Scripts/Services/PersistentProgress/CurrentPlayerProgress.cs
index 0d2b93d..129faad 100644
--- a/Assets/_Project/Scripts/Services/PersistentProgress/CurrentPlayerProgress.cs
+++ b/Assets/_Project/Scripts/Services/PersistentProgress/CurrentPlayerProgress.cs
@@ -5,10 +5,21 @@ namespace _Project.PersistentProgress
[Serializable]
public class CurrentPlayerProgress
{
- public bool HasFinishedTutorial = false;
- public int CurrentLevel = 1;
+ private int _currentLevel = 1;
+ private bool _hasFinishedTutorial = false;
- public override string ToString()
- => $"Level={CurrentLevel};";
- }
+ public int CurrentLevel
+ {
+ get => _currentLevel;
+ set => _currentLevel = value;
+ }
+
+ public bool HasFinishedTutorial
+ {
+ get => _hasFinishedTutorial;
+ set => _hasFinishedTutorial = value;
+ }
+
+ public override string ToString() => $"Level={CurrentLevel};";
+ }
}
diff --git a/Assets/_Project/Scripts/Services/PersistentProgress/IPersistentProgress.cs b/Assets/_Project/Scripts/Services/PersistentProgress/IPersistentProgress.cs
index 849456e..cea3a67 100644
--- a/Assets/_Project/Scripts/Services/PersistentProgress/IPersistentProgress.cs
+++ b/Assets/_Project/Scripts/Services/PersistentProgress/IPersistentProgress.cs
@@ -3,9 +3,9 @@
///
/// Service that provides access to player progress
///
- public interface IPersistentProgress
+ public interface IPersistentProgress
{
CurrentPlayerProgress Progress { get; set; }
void IncrementCurrentLevel();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/PersistentProgress/IProgressUpdater.cs b/Assets/_Project/Scripts/Services/PersistentProgress/IProgressUpdater.cs
index b3f9221..705efba 100644
--- a/Assets/_Project/Scripts/Services/PersistentProgress/IProgressUpdater.cs
+++ b/Assets/_Project/Scripts/Services/PersistentProgress/IProgressUpdater.cs
@@ -4,4 +4,4 @@ public interface IProgressUpdater : ISavedProgressReader
{
void UpdateProgress(CurrentPlayerProgress progress);
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/PersistentProgress/ISavedProgressReader.cs b/Assets/_Project/Scripts/Services/PersistentProgress/ISavedProgressReader.cs
index f77ede1..fb1f8e1 100644
--- a/Assets/_Project/Scripts/Services/PersistentProgress/ISavedProgressReader.cs
+++ b/Assets/_Project/Scripts/Services/PersistentProgress/ISavedProgressReader.cs
@@ -4,4 +4,4 @@ public interface ISavedProgressReader
{
void LoadProgress(CurrentPlayerProgress progress);
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/PersistentProgress/PersistentProgress.cs b/Assets/_Project/Scripts/Services/PersistentProgress/PersistentProgress.cs
index 3989546..ab3f980 100644
--- a/Assets/_Project/Scripts/Services/PersistentProgress/PersistentProgress.cs
+++ b/Assets/_Project/Scripts/Services/PersistentProgress/PersistentProgress.cs
@@ -9,4 +9,4 @@ public void IncrementCurrentLevel()
Progress.CurrentLevel++;
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SaveLoad/ISaveLoad.cs b/Assets/_Project/Scripts/Services/SaveLoad/ISaveLoad.cs
index 63fe6ff..07f1399 100644
--- a/Assets/_Project/Scripts/Services/SaveLoad/ISaveLoad.cs
+++ b/Assets/_Project/Scripts/Services/SaveLoad/ISaveLoad.cs
@@ -2,9 +2,9 @@
namespace _Project.SaveLoad
{
- public interface ISaveLoad
+ public interface ISaveLoad
{
- void SaveProgress();
CurrentPlayerProgress LoadProgress();
+ void SaveProgress();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SaveLoad/PlayerPrefsSaveLoad.cs b/Assets/_Project/Scripts/Services/SaveLoad/PlayerPrefsSaveLoad.cs
index face730..f59790d 100644
--- a/Assets/_Project/Scripts/Services/SaveLoad/PlayerPrefsSaveLoad.cs
+++ b/Assets/_Project/Scripts/Services/SaveLoad/PlayerPrefsSaveLoad.cs
@@ -8,30 +8,33 @@ namespace _Project.SaveLoad
public class PlayerPrefsSaveLoad : ISaveLoad
{
private const string ProgressKey = "Progress";
+ private readonly IGameFactory _gameFactory;
private readonly IPersistentProgress _progress;
- private readonly IGameFactory _gameFactory;
private readonly IEnumerable _savedServices;
private readonly List _saveWriterServices;
- public PlayerPrefsSaveLoad(IPersistentProgress progress, IGameFactory gameFactory, IEnumerable savedServices)
+ public PlayerPrefsSaveLoad(IPersistentProgress progress, IGameFactory gameFactory,
+ IEnumerable savedServices)
{
_progress = progress;
_gameFactory = gameFactory;
_savedServices = savedServices;
}
- public CurrentPlayerProgress LoadProgress() => PlayerPrefs.GetString(ProgressKey)?.ToDeserialized();
+ public CurrentPlayerProgress LoadProgress()
+ {
+ return PlayerPrefs.GetString(ProgressKey)?.ToDeserialized();
+ }
public void SaveProgress()
{
foreach (var progressWriter in _gameFactory.ProgressWriters)
progressWriter.UpdateProgress(_progress.Progress);
- foreach (var writerService in _saveWriterServices)
- writerService.UpdateProgress(_progress.Progress);
+ foreach (var writerService in _saveWriterServices) writerService.UpdateProgress(_progress.Progress);
PlayerPrefs.SetString(ProgressKey, _progress.Progress.ToJson());
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SaveLoad/SerializationDataExtensions.cs b/Assets/_Project/Scripts/Services/SaveLoad/SerializationDataExtensions.cs
index a7526b0..5ba4c68 100644
--- a/Assets/_Project/Scripts/Services/SaveLoad/SerializationDataExtensions.cs
+++ b/Assets/_Project/Scripts/Services/SaveLoad/SerializationDataExtensions.cs
@@ -4,8 +4,14 @@ namespace _Project.SaveLoad
{
public static class SerializationDataExtensions
{
- public static T ToDeserialized(this string json) => JsonUtility.FromJson(json);
+ public static T ToDeserialized(this string json)
+ {
+ return JsonUtility.FromJson(json);
+ }
- public static string ToJson(this object obj) => JsonUtility.ToJson(obj);
+ public static string ToJson(this object obj)
+ {
+ return JsonUtility.ToJson(obj);
+ }
}
}
diff --git a/Assets/_Project/Scripts/Services/SceneLoader/AsyncSceneLoader.cs b/Assets/_Project/Scripts/Services/SceneLoader/AsyncSceneLoader.cs
index 1b840c9..c75d0c7 100644
--- a/Assets/_Project/Scripts/Services/SceneLoader/AsyncSceneLoader.cs
+++ b/Assets/_Project/Scripts/Services/SceneLoader/AsyncSceneLoader.cs
@@ -1,6 +1,6 @@
using System;
-using UnityEngine;
using System.Collections;
+using UnityEngine;
using UnityEngine.SceneManagement;
namespace _Project.SceneLoader
@@ -21,12 +21,11 @@ public IEnumerator LoadScene(string name, Action onLoaded = null)
yield break;
}
- AsyncOperation waitNextScene = SceneManager.LoadSceneAsync(name);
-
- while (!waitNextScene.isDone)
- yield return null;
+ var waitNextScene = SceneManager.LoadSceneAsync(name);
+
+ while (!waitNextScene.isDone) yield return null;
onLoaded?.Invoke();
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SceneLoader/ISceneLoader.cs b/Assets/_Project/Scripts/Services/SceneLoader/ISceneLoader.cs
index 75eba98..f6451f6 100644
--- a/Assets/_Project/Scripts/Services/SceneLoader/ISceneLoader.cs
+++ b/Assets/_Project/Scripts/Services/SceneLoader/ISceneLoader.cs
@@ -7,4 +7,4 @@ public interface ISceneLoader
{
IEnumerator LoadScene(string name, Action onLoaded = null);
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SceneLoader/SceneNames.cs b/Assets/_Project/Scripts/Services/SceneLoader/SceneNames.cs
index c3deb5a..eab79cb 100644
--- a/Assets/_Project/Scripts/Services/SceneLoader/SceneNames.cs
+++ b/Assets/_Project/Scripts/Services/SceneLoader/SceneNames.cs
@@ -3,7 +3,7 @@
public static class SceneNames
{
public const string BootstrapSceneName = "Bootstrap";
- public const string MenuSceneName = "Menu";
public const string LevelSceneName = "Level";
+ public const string MenuSceneName = "Menu";
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/SceneLoader/SingletonCoroutineRunner.cs b/Assets/_Project/Scripts/Services/SceneLoader/SingletonCoroutineRunner.cs
index 675052e..0a64ad1 100644
--- a/Assets/_Project/Scripts/Services/SceneLoader/SingletonCoroutineRunner.cs
+++ b/Assets/_Project/Scripts/Services/SceneLoader/SingletonCoroutineRunner.cs
@@ -11,10 +11,9 @@ public static SingletonCoroutineRunner Instance
{
get
{
- if (_instance != null)
- return _instance;
-
- GameObject emptyInstance = new GameObject("[Coroutine Runner]");
+ if (_instance != null) return _instance;
+
+ var emptyInstance = new GameObject("[Coroutine Runner]");
_instance = emptyInstance.AddComponent();
DontDestroyOnLoad(emptyInstance);
@@ -22,10 +21,14 @@ public static SingletonCoroutineRunner Instance
}
}
- public static Coroutine RunRoutine(IEnumerator coroutine)
- => Instance.StartCoroutine(coroutine);
+ public static Coroutine RunRoutine(IEnumerator coroutine)
+ {
+ return Instance.StartCoroutine(coroutine);
+ }
- public static void StopRoutine(Coroutine coroutine)
- => Instance.StopCoroutine(coroutine);
+ public static void StopRoutine(Coroutine coroutine)
+ {
+ Instance.StopCoroutine(coroutine);
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/StaticData/GameStaticData.cs b/Assets/_Project/Scripts/Services/StaticData/GameWindowStaticData.cs
similarity index 99%
rename from Assets/_Project/Scripts/Services/StaticData/GameStaticData.cs
rename to Assets/_Project/Scripts/Services/StaticData/GameWindowStaticData.cs
index fb09dff..42368e1 100644
--- a/Assets/_Project/Scripts/Services/StaticData/GameStaticData.cs
+++ b/Assets/_Project/Scripts/Services/StaticData/GameWindowStaticData.cs
@@ -6,4 +6,4 @@ namespace _Project.StaticData
public class GameWindowStaticData : ScriptableObject
{
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/StaticData/GameStaticData.cs.meta b/Assets/_Project/Scripts/Services/StaticData/GameWindowStaticData.cs.meta
similarity index 100%
rename from Assets/_Project/Scripts/Services/StaticData/GameStaticData.cs.meta
rename to Assets/_Project/Scripts/Services/StaticData/GameWindowStaticData.cs.meta
diff --git a/Assets/_Project/Scripts/Services/StaticData/IStaticDataSerivce.cs b/Assets/_Project/Scripts/Services/StaticData/IStaticData.cs
similarity index 98%
rename from Assets/_Project/Scripts/Services/StaticData/IStaticDataSerivce.cs
rename to Assets/_Project/Scripts/Services/StaticData/IStaticData.cs
index 7a2ae97..9d1d68f 100644
--- a/Assets/_Project/Scripts/Services/StaticData/IStaticDataSerivce.cs
+++ b/Assets/_Project/Scripts/Services/StaticData/IStaticData.cs
@@ -4,7 +4,7 @@ namespace _Project.StaticData
{
public interface IStaticData
{
- void LoadStaticData();
LevelConfig ForLevel(int levelID);
+ void LoadStaticData();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/StaticData/IStaticDataSerivce.cs.meta b/Assets/_Project/Scripts/Services/StaticData/IStaticData.cs.meta
similarity index 100%
rename from Assets/_Project/Scripts/Services/StaticData/IStaticDataSerivce.cs.meta
rename to Assets/_Project/Scripts/Services/StaticData/IStaticData.cs.meta
diff --git a/Assets/_Project/Scripts/Services/StaticData/StaticDataService.cs b/Assets/_Project/Scripts/Services/StaticData/ScriptableStaticData.cs
similarity index 87%
rename from Assets/_Project/Scripts/Services/StaticData/StaticDataService.cs
rename to Assets/_Project/Scripts/Services/StaticData/ScriptableStaticData.cs
index dbdb0c1..cf3dae9 100644
--- a/Assets/_Project/Scripts/Services/StaticData/StaticDataService.cs
+++ b/Assets/_Project/Scripts/Services/StaticData/ScriptableStaticData.cs
@@ -1,7 +1,6 @@
-using _Project.CurrentLevelProgress;
using System.Collections.Generic;
using System.Linq;
-
+using _Project.CurrentLevelProgress;
using UnityEngine;
namespace _Project.StaticData
@@ -12,12 +11,14 @@ public class ScriptableStaticData : IStaticData
private Texture2D _tileAtlas;
private LineRenderer _wirePrefab;
+ public LevelConfig ForLevel(int levelID)
+ {
+ return _levels.GetValueOrDefault(levelID);
+ }
+
public void LoadStaticData()
{
_levels = Resources.LoadAll("Configs/Levels").ToDictionary(x => x.LevelID, x => x);
}
-
- public LevelConfig ForLevel(int levelID)
- => _levels.GetValueOrDefault(levelID);
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/StaticData/StaticDataService.cs.meta b/Assets/_Project/Scripts/Services/StaticData/ScriptableStaticData.cs.meta
similarity index 100%
rename from Assets/_Project/Scripts/Services/StaticData/StaticDataService.cs.meta
rename to Assets/_Project/Scripts/Services/StaticData/ScriptableStaticData.cs.meta
diff --git a/Assets/_Project/Scripts/Services/StaticData/WindowStaticData.cs b/Assets/_Project/Scripts/Services/StaticData/WindowStaticData.cs
index 7ebe7b0..0e310aa 100644
--- a/Assets/_Project/Scripts/Services/StaticData/WindowStaticData.cs
+++ b/Assets/_Project/Scripts/Services/StaticData/WindowStaticData.cs
@@ -6,4 +6,4 @@ namespace _Project.StaticData
public class WindowStaticData : ScriptableObject
{
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/TimeService/IInGameTimeService.cs b/Assets/_Project/Scripts/Services/TimeService/IInGameTimeService.cs
index b4f871e..a03e2e8 100644
--- a/Assets/_Project/Scripts/Services/TimeService/IInGameTimeService.cs
+++ b/Assets/_Project/Scripts/Services/TimeService/IInGameTimeService.cs
@@ -8,4 +8,4 @@ public interface IInGameTimeService
void EnablePause();
void RestoreTimePassage();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/Services/TimeService/InGameTimeService.cs b/Assets/_Project/Scripts/Services/TimeService/InGameTimeService.cs
index 9247c64..8d1fb6d 100644
--- a/Assets/_Project/Scripts/Services/TimeService/InGameTimeService.cs
+++ b/Assets/_Project/Scripts/Services/TimeService/InGameTimeService.cs
@@ -19,4 +19,4 @@ public void RestoreTimePassage()
GamePaused(this, false);
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/BootstrapState.cs b/Assets/_Project/Scripts/States/BootstrapState.cs
index 86a1bd5..c749991 100644
--- a/Assets/_Project/Scripts/States/BootstrapState.cs
+++ b/Assets/_Project/Scripts/States/BootstrapState.cs
@@ -15,13 +15,17 @@ public BootstrapState(GameStateMachine gameStateMachine, ISceneLoader sceneLoade
public void Enter()
{
- SingletonCoroutineRunner.Instance.StartCoroutine(
- _sceneLoader.LoadScene(SceneNames.BootstrapSceneName, onLoaded: EnterHub));
+ SingletonCoroutineRunner.Instance.StartCoroutine(_sceneLoader.LoadScene(SceneNames.BootstrapSceneName,
+ EnterHub));
}
- public void Exit() {}
+ public void Exit()
+ {
+ }
private void EnterHub()
- => _gameStateMachine.Enter();
+ {
+ _gameStateMachine.Enter();
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/FinishedLevelState.cs b/Assets/_Project/Scripts/States/FinishedLevelState.cs
index 6f9f15d..5dbca21 100644
--- a/Assets/_Project/Scripts/States/FinishedLevelState.cs
+++ b/Assets/_Project/Scripts/States/FinishedLevelState.cs
@@ -18,9 +18,9 @@ public void Enter()
_timeService.EnablePause();
}
- public void Exit()
+ public void Exit()
{
_timeService.RestoreTimePassage();
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/GameStateMachine.cs b/Assets/_Project/Scripts/States/GameStateMachine.cs
index 846e4ae..4fff0c1 100644
--- a/Assets/_Project/Scripts/States/GameStateMachine.cs
+++ b/Assets/_Project/Scripts/States/GameStateMachine.cs
@@ -27,9 +27,10 @@ public GameStateMachine(IPersistentProgress persistentProgress, ISaveLoad saveLo
[typeof(LoadProgressState)] = new LoadProgressState(this, persistentProgress, saveLoad),
[typeof(LoadHubState)] = new LoadHubState(this, sceneLoader),
[typeof(HubState)] = new HubState(this, saveReaderServices),
- [typeof(LoadLevelState)] = new LoadLevelState(this, gameFactory, persistentProgress, staticData, uiFactory, levelProgress),
+ [typeof(LoadLevelState)] = new LoadLevelState(this, gameFactory, persistentProgress, staticData,
+ uiFactory, levelProgress),
[typeof(LoopLevelState)] = new LoopLevelState(this, saveLoad, levelProgress),
- [typeof(FinishedLevelState)] = new FinishedLevelState(this, timeService)
+ [typeof(FinishedLevelState)] = new FinishedLevelState(this, timeService),
};
}
@@ -41,21 +42,20 @@ public void Enter() where TState : class, IState
public void Enter(TPayload payload) where TState : class, IPayloadedState
{
- TState state = ChangeState();
+ var state = ChangeState();
state.Enter(payload);
}
private TState ChangeState() where TState : class, IExitableState
{
- // The first state could be null on program start
+ // The first state could be null on program start
_currentState?.Exit();
- TState state = GetState();
+ var state = GetState();
Debug.Log($"State changed: {_currentState?.ToString() ?? "None"} => {state}");
_currentState = state;
return state;
}
- private TState GetState() where TState : class, IExitableState
- => _states[typeof(TState)] as TState;
+ private TState GetState() where TState : class, IExitableState => _states[typeof(TState)] as TState;
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/HubState.cs b/Assets/_Project/Scripts/States/HubState.cs
index 9a02bb6..07061b4 100644
--- a/Assets/_Project/Scripts/States/HubState.cs
+++ b/Assets/_Project/Scripts/States/HubState.cs
@@ -5,25 +5,24 @@ namespace _Project.States
{
public class HubState : IState
{
- public IEnumerable SaveReaderServices { get; }
-
- private readonly IEnumerator _saveReaderServices;
private readonly GameStateMachine _gameStateMachine;
+ private readonly IEnumerator _saveReaderServices;
+
public HubState(GameStateMachine gameStateMachine, IEnumerable saveReaderServices)
{
_gameStateMachine = gameStateMachine;
SaveReaderServices = saveReaderServices;
}
+ public IEnumerable SaveReaderServices { get; }
+
public void Enter()
{
-
}
public void Exit()
{
-
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/IExitableState.cs b/Assets/_Project/Scripts/States/IExitableState.cs
new file mode 100644
index 0000000..670423c
--- /dev/null
+++ b/Assets/_Project/Scripts/States/IExitableState.cs
@@ -0,0 +1,7 @@
+namespace _Project.States
+{
+ public interface IExitableState
+ {
+ void Exit();
+ }
+}
diff --git a/Assets/_Project/Scripts/States/IExitableState.cs.meta b/Assets/_Project/Scripts/States/IExitableState.cs.meta
new file mode 100644
index 0000000..f305d7d
--- /dev/null
+++ b/Assets/_Project/Scripts/States/IExitableState.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 5b63955b69f24df4a3cd8696265371e1
+timeCreated: 1785679515
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/States/IPayloadedState.cs b/Assets/_Project/Scripts/States/IPayloadedState.cs
new file mode 100644
index 0000000..a64bad2
--- /dev/null
+++ b/Assets/_Project/Scripts/States/IPayloadedState.cs
@@ -0,0 +1,7 @@
+namespace _Project.States
+{
+ public interface IPayloadedState : IExitableState
+ {
+ void Enter(TPayLoad payload);
+ }
+}
diff --git a/Assets/_Project/Scripts/States/IPayloadedState.cs.meta b/Assets/_Project/Scripts/States/IPayloadedState.cs.meta
new file mode 100644
index 0000000..ec62234
--- /dev/null
+++ b/Assets/_Project/Scripts/States/IPayloadedState.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 3f97f723073141dfa2db52d25643c2a0
+timeCreated: 1785679522
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/States/IState.cs b/Assets/_Project/Scripts/States/IState.cs
index f2405ef..214ed26 100644
--- a/Assets/_Project/Scripts/States/IState.cs
+++ b/Assets/_Project/Scripts/States/IState.cs
@@ -1,17 +1,7 @@
namespace _Project.States
{
- public interface IExitableState
- {
- void Exit();
- }
-
public interface IState : IExitableState
{
void Enter();
}
-
- public interface IPayloadedState : IExitableState
- {
- void Enter(TPayLoad payload);
- }
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/LoadHubState.cs b/Assets/_Project/Scripts/States/LoadHubState.cs
index f36f8b7..c69fc5c 100644
--- a/Assets/_Project/Scripts/States/LoadHubState.cs
+++ b/Assets/_Project/Scripts/States/LoadHubState.cs
@@ -13,19 +13,18 @@ public LoadHubState(GameStateMachine gameStateMachine, ISceneLoader sceneLoader)
_sceneLoader = sceneLoader;
}
- public void Exit()
+ public void Enter()
{
+ SingletonCoroutineRunner.Instance.StartCoroutine(_sceneLoader.LoadScene(SceneNames.MenuSceneName,
+ OnHubSceneLoaded));
}
- private void OnHubSceneLoaded()
+ public void Exit()
{
-
}
- public void Enter()
+ private void OnHubSceneLoaded()
{
- SingletonCoroutineRunner.Instance.StartCoroutine(
- _sceneLoader.LoadScene(SceneNames.MenuSceneName, onLoaded: OnHubSceneLoaded));
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/LoadLevelState.cs b/Assets/_Project/Scripts/States/LoadLevelState.cs
index d7717e5..f6d365f 100644
--- a/Assets/_Project/Scripts/States/LoadLevelState.cs
+++ b/Assets/_Project/Scripts/States/LoadLevelState.cs
@@ -1,6 +1,6 @@
-using _Project.Factory;
+using _Project.AssetManagement;
using _Project.CurrentLevelProgress;
-using _Project.AssetManagement;
+using _Project.Factory;
using _Project.PersistentProgress;
using _Project.StaticData;
using _Project.UI.Factory;
@@ -10,18 +10,16 @@ namespace _Project.States
{
public class LoadLevelState : IPayloadedState
{
- private readonly IPersistentProgress _progress;
- private readonly IUIFactory _uiFactory;
- private readonly GameStateMachine _gameStateMachine;
- private readonly IStaticData _staticData;
private readonly IGameFactory _gameFactory;
- private readonly Canvas _loadingCurtain;
+ private readonly GameStateMachine _gameStateMachine;
private readonly ILevelProgress _levelProgress;
+ private readonly Canvas _loadingCurtain;
+ private readonly IPersistentProgress _progress;
+ private readonly IStaticData _staticData;
+ private readonly IUIFactory _uiFactory;
- public LoadLevelState(GameStateMachine gameStateMachine,
- IGameFactory gameFactory, IPersistentProgress progress,
- IStaticData staticData, IUIFactory uiFactory,
- ILevelProgress levelProgress)
+ public LoadLevelState(GameStateMachine gameStateMachine, IGameFactory gameFactory, IPersistentProgress progress,
+ IStaticData staticData, IUIFactory uiFactory, ILevelProgress levelProgress)
{
_gameStateMachine = gameStateMachine;
_gameFactory = gameFactory;
@@ -37,27 +35,28 @@ public void Enter(string sceneName)
_loadingCurtain.gameObject.SetActive(true);
}
- public void Exit()
- => _loadingCurtain.gameObject.SetActive(false);
-
- private void OnLoaded()
+ public void Exit()
{
- LevelConfig config = _staticData.ForLevel(_progress.Progress.CurrentLevel);
- _levelProgress.LoadLevelConfig(config);
- InitializeInGameHUD();
- InitializeCamera();
- _gameStateMachine.Enter();
+ _loadingCurtain.gameObject.SetActive(false);
}
private void InitializeCamera()
{
- GameObject cameraSpawnPoint = GameObject.FindGameObjectWithTag(Constants.CameraSpawnPoint);
+ var cameraSpawnPoint = GameObject.FindGameObjectWithTag(Constants.CameraSpawnPoint);
}
private void InitializeInGameHUD()
{
_uiFactory.CreateUIRoot();
+ }
+ private void OnLoaded()
+ {
+ var config = _staticData.ForLevel(_progress.Progress.CurrentLevel);
+ _levelProgress.LoadLevelConfig(config);
+ InitializeInGameHUD();
+ InitializeCamera();
+ _gameStateMachine.Enter();
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/LoadProgressState.cs b/Assets/_Project/Scripts/States/LoadProgressState.cs
index a44e708..8375aaa 100644
--- a/Assets/_Project/Scripts/States/LoadProgressState.cs
+++ b/Assets/_Project/Scripts/States/LoadProgressState.cs
@@ -5,8 +5,8 @@ namespace _Project.States
{
public class LoadProgressState : IState
{
- private readonly IPersistentProgress _persistentProgress;
private readonly GameStateMachine _gameStateMachine;
+ private readonly IPersistentProgress _persistentProgress;
private readonly ISaveLoad _saveLoad;
public LoadProgressState(GameStateMachine gameStateMachine, IPersistentProgress persistentProgress,
@@ -32,7 +32,9 @@ private void LoadProgressOrInitNew()
_persistentProgress.Progress = _saveLoad.LoadProgress() ?? NewProgress();
}
- private CurrentPlayerProgress NewProgress()
- => new();
+ private CurrentPlayerProgress NewProgress()
+ {
+ return new CurrentPlayerProgress();
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/States/LoopLevelState.cs b/Assets/_Project/Scripts/States/LoopLevelState.cs
index fbda9cc..f0b36a9 100644
--- a/Assets/_Project/Scripts/States/LoopLevelState.cs
+++ b/Assets/_Project/Scripts/States/LoopLevelState.cs
@@ -8,10 +8,10 @@ namespace _Project.States
public class LoopLevelState : IState
{
private readonly GameStateMachine _gameStateMachine;
- private readonly ISaveLoad _saveLoad;
+ private readonly ILevelProgress _levelProgress;
private readonly IPersistentProgress _progress;
+ private readonly ISaveLoad _saveLoad;
private readonly IInGameTimeService _timeService;
- private readonly ILevelProgress _levelProgress;
private bool _isWaveOngoing;
public LoopLevelState(GameStateMachine gameStateMachine, ISaveLoad saveLoad, ILevelProgress levelProgress)
@@ -23,7 +23,6 @@ public LoopLevelState(GameStateMachine gameStateMachine, ISaveLoad saveLoad, ILe
public void Enter()
{
-
}
public void Exit()
@@ -31,4 +30,4 @@ public void Exit()
_timeService.RestoreTimePassage();
}
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/UI/UIFactory/IUIFactory.cs b/Assets/_Project/Scripts/UI/UIFactory/IUIFactory.cs
index f39cb8e..cc7df4c 100644
--- a/Assets/_Project/Scripts/UI/UIFactory/IUIFactory.cs
+++ b/Assets/_Project/Scripts/UI/UIFactory/IUIFactory.cs
@@ -1,7 +1,7 @@
namespace _Project.UI.Factory
{
- public interface IUIFactory
+ public interface IUIFactory
{
void CreateUIRoot();
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Scripts/UI/UIFactory/UIFactory.cs b/Assets/_Project/Scripts/UI/UIFactory/UIFactory.cs
index 801bd46..19d38be 100644
--- a/Assets/_Project/Scripts/UI/UIFactory/UIFactory.cs
+++ b/Assets/_Project/Scripts/UI/UIFactory/UIFactory.cs
@@ -7,9 +7,9 @@ namespace _Project.UI.Factory
public class UIFactory : IUIFactory
{
private const string UIRootPath = "Prefabs/UI/UIRoot";
+ private readonly IAssetProvider _assets;
private readonly IStaticData _staticData;
- private readonly IAssetProvider _assets;
private Transform _uiRoot;
public UIFactory(IAssetProvider assets, IStaticData staticData)
@@ -19,7 +19,9 @@ public UIFactory(IAssetProvider assets, IStaticData staticData)
}
public void CreateUIRoot()
- => _uiRoot = _assets.Instantiate(UIRootPath).transform;
+ {
+ _uiRoot = _assets.Instantiate(UIRootPath).transform;
+ }
/*public TView CreateViewWithInjection() where TView : View
{
@@ -32,4 +34,4 @@ public void CreateUIRoot()
return view;
}*/
}
-}
\ No newline at end of file
+}
diff --git a/Assets/_Project/Settings/UniversalRenderPipelineGlobalSettings.asset b/Assets/_Project/Settings/UniversalRenderPipelineGlobalSettings.asset
index c2d5789..a44feed 100644
--- a/Assets/_Project/Settings/UniversalRenderPipelineGlobalSettings.asset
+++ b/Assets/_Project/Settings/UniversalRenderPipelineGlobalSettings.asset
@@ -29,7 +29,6 @@ MonoBehaviour:
m_StripUnusedVariants: 1
m_StripScreenCoordOverrideVariants: 1
supportRuntimeDebugDisplay: 0
- m_EnableRenderGraph: 0
m_Settings:
m_SettingsList:
m_List:
@@ -65,9 +64,12 @@ MonoBehaviour:
- rid: 6112946651244003329
- rid: 6112946651244003330
- rid: 6112946651244003331
+ - rid: 2494740698308018178
+ - rid: 2494740698308018179
+ - rid: 2494740698308018180
m_RuntimeSettings:
m_List: []
- m_AssetVersion: 9
+ m_AssetVersion: 10
m_ObsoleteDefaultVolumeProfile: {fileID: 0}
m_RenderingLayerNames:
- Light Layer default
@@ -97,6 +99,29 @@ MonoBehaviour:
references:
version: 2
RefIds:
+ - rid: 2494740698308018178
+ type: {class: UniversalRenderPipelineRuntimeTerrainShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Version: 0
+ m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3}
+ m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3}
+ m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3}
+ - rid: 2494740698308018179
+ type: {class: URPTerrainShaderSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
+ data:
+ m_Version: 0
+ m_IncludeTerrainShaders: 1
+ - rid: 2494740698308018180
+ type: {class: WorldRenderPipelineResources, ns: UnityEngine.PathTracing.Core, asm: Unity.PathTracing.Runtime}
+ data:
+ _version: 3
+ _blitCubemap: {fileID: 7200000, guid: 5a992812cb320d146a66cc600200cce7, type: 3}
+ _blitGrayScaleCookie: {fileID: 7200000, guid: 557fa399e33bf7647bda5697c5c158df, type: 3}
+ _setAlphaChannelShader: {fileID: 7200000, guid: 5efaea0e81c66334aa9d062d6573e6fd, type: 3}
+ _environmentImportanceSamplingBuild: {fileID: 7200000, guid: 5bb2534d2411d344cbc54f880232640f, type: 3}
+ _skyBoxMesh: {fileID: 4300000, guid: 0529e6c5f6dea8c4a8c2835ed7de57cb, type: 2}
+ _sixFaceSkyBoxMesh: {fileID: 4300000, guid: a80925ceebd011741b42509226cefc74, type: 2}
+ _buildLightGridShader: {fileID: 7200000, guid: 16e47c1641bd0104e92b624601457bb0, type: 3}
- rid: 6112946651244003328
type: {class: RayTracingRenderPipelineResources, ns: UnityEngine.Rendering.UnifiedRayTracing, asm: Unity.UnifiedRayTracing.Runtime}
data:
@@ -124,6 +149,11 @@ MonoBehaviour:
type: {class: RenderingDebuggerRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
data:
m_version: 0
+ m_PanelSettings: {fileID: 11400000, guid: fa69697be3070b04a893666f5947f18c, type: 2}
+ m_StyleSheets:
+ - {fileID: 7433441132597879392, guid: 0ff99fd36f66f1a41bcc1d3c90e0922a, type: 3}
+ - {fileID: 7433441132597879392, guid: 3a8aa4d508da46d4dace18b280f064aa, type: 3}
+ m_VisualTreeAsset: {fileID: 9197481963319205126, guid: b647ceb1e15264943b9b439971e71110, type: 3}
- rid: 6852985685364965376
type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
@@ -165,9 +195,9 @@ MonoBehaviour:
m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3}
m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
- m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3}
- m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3}
- m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3}
+ m_TerrainDetailLit: {fileID: 0}
+ m_TerrainDetailGrassBillboard: {fileID: 0}
+ m_TerrainDetailGrass: {fileID: 0}
- rid: 6852985685364965381
type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
@@ -194,6 +224,7 @@ MonoBehaviour:
type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
+ m_SimpleLitMaterial: {fileID: 2100000, guid: 6a1143ee683302f4aa628c052723efc1, type: 2}
m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2}
m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2}
m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2}
@@ -208,7 +239,6 @@ MonoBehaviour:
type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
data:
m_Version: 0
- m_EnableRenderCompatibilityMode: 0
- rid: 6852985685364965386
type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime}
data:
diff --git a/Assets/packages.config b/Assets/packages.config
index 116aaac..a2db27a 100644
--- a/Assets/packages.config
+++ b/Assets/packages.config
@@ -5,6 +5,7 @@
+
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..454f98b
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,12 @@
+
+
+ $([MSBuild]::EnsureTrailingSlash('$(MSBuildThisFileDirectory)'))
+ 6000.5.4f1
+
+ $(UNITY_EDITOR_PATH)
+ $(UNITY_PATH)
+ C:\Program Files\Unity\Hub\Editor\$(UnityVersion)\Editor
+ /opt/unity/Editor
+ /Applications/Unity/Hub/Editor/$(UnityVersion)/Unity.app/Contents
+
+
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000..a3c1287
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,8 @@
+
+
+ true
+ $(IntermediateOutputPath)$(MSBuildProjectName).xml
+ $(NoWarn);1591
+ true
+
+
diff --git a/Packages/manifest.json b/Packages/manifest.json
index 06ba6ed..30c7b54 100644
--- a/Packages/manifest.json
+++ b/Packages/manifest.json
@@ -1,20 +1,19 @@
{
"dependencies": {
- "com.cysharp.r3": "https://github.com/Cysharp/R3.git?path=src/R3.Unity/Assets/R3.Unity",
"com.github-glitchenzo.nugetforunity": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
- "com.gustavopsantos.reflex": "https://github.com/gustavopsantos/reflex.git?path=/Assets/Reflex/#11.0.1",
- "com.unity.ai.navigation": "2.0.10",
- "com.unity.cinemachine": "3.1.4",
- "com.unity.collab-proxy": "2.11.3",
- "com.unity.ide.rider": "3.0.39",
- "com.unity.ide.visualstudio": "2.0.26",
- "com.unity.inputsystem": "1.18.0",
+ "com.gustavopsantos.reflex": "https://github.com/gustavopsantos/reflex.git?path=/Assets/Reflex/#14.3.1",
+ "com.unity.ai.navigation": "2.0.14",
+ "com.unity.cinemachine": "3.1.7",
+ "com.unity.collab-proxy": "2.12.4",
+ "com.unity.ide.rider": "3.0.40",
+ "com.unity.ide.visualstudio": "2.0.27",
+ "com.unity.inputsystem": "1.19.0",
"com.unity.multiplayer.center": "1.0.1",
- "com.unity.render-pipelines.universal": "17.3.0",
- "com.unity.test-framework": "1.6.0",
- "com.unity.timeline": "1.8.10",
- "com.unity.ugui": "2.0.0",
- "com.unity.visualscripting": "1.9.9",
+ "com.unity.render-pipelines.universal": "17.5.0",
+ "com.unity.test-framework": "1.7.0",
+ "com.unity.timeline": "1.8.12",
+ "com.unity.ugui": "2.5.0",
+ "com.unity.visualscripting": "1.9.12",
"com.unity.modules.accessibility": "1.0.0",
"com.unity.modules.adaptiveperformance": "1.0.0",
"com.unity.modules.ai": "1.0.0",
@@ -30,6 +29,7 @@
"com.unity.modules.particlesystem": "1.0.0",
"com.unity.modules.physics": "1.0.0",
"com.unity.modules.physics2d": "1.0.0",
+ "com.unity.modules.physicscore2d": "1.0.0",
"com.unity.modules.screencapture": "1.0.0",
"com.unity.modules.terrain": "1.0.0",
"com.unity.modules.terrainphysics": "1.0.0",
@@ -46,8 +46,8 @@
"com.unity.modules.vectorgraphics": "1.0.0",
"com.unity.modules.vehicles": "1.0.0",
"com.unity.modules.video": "1.0.0",
- "com.unity.modules.vr": "1.0.0",
"com.unity.modules.wind": "1.0.0",
"com.unity.modules.xr": "1.0.0"
- }
+ },
+ "scopedRegistries": []
}
diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json
index ee4cbbd..3fdd637 100644
--- a/Packages/packages-lock.json
+++ b/Packages/packages-lock.json
@@ -1,30 +1,21 @@
{
"dependencies": {
- "com.cysharp.r3": {
- "version": "https://github.com/Cysharp/R3.git?path=src/R3.Unity/Assets/R3.Unity",
- "depth": 0,
- "source": "git",
- "dependencies": {
- "com.unity.modules.imgui": "1.0.0"
- },
- "hash": "fbc12b2c0b6a1ee5ce7d534f9db936bc59069219"
- },
"com.github-glitchenzo.nugetforunity": {
"version": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity",
"depth": 0,
"source": "git",
"dependencies": {},
- "hash": "a7c6b49a0141a5bff9b1983e38137522ef61977d"
+ "hash": "acc1c7bc9ea34c33b830e40316fca52553878d29"
},
"com.gustavopsantos.reflex": {
- "version": "https://github.com/gustavopsantos/reflex.git?path=/Assets/Reflex/#11.0.1",
+ "version": "https://github.com/gustavopsantos/reflex.git?path=/Assets/Reflex/#14.3.1",
"depth": 0,
"source": "git",
"dependencies": {},
- "hash": "4593b54e2f5faeefa08148e92931196ea5fac6c1"
+ "hash": "55423389e8d443f18090720891af52d9952d6e5e"
},
"com.unity.ai.navigation": {
- "version": "2.0.10",
+ "version": "2.0.14",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -33,7 +24,7 @@
"url": "https://packages.unity.com"
},
"com.unity.burst": {
- "version": "1.8.27",
+ "version": "1.8.29",
"depth": 2,
"source": "registry",
"dependencies": {
@@ -43,7 +34,7 @@
"url": "https://packages.unity.com"
},
"com.unity.cinemachine": {
- "version": "3.1.4",
+ "version": "3.1.7",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -53,33 +44,31 @@
"url": "https://packages.unity.com"
},
"com.unity.collab-proxy": {
- "version": "2.11.3",
+ "version": "2.12.4",
"depth": 0,
"source": "registry",
"dependencies": {},
"url": "https://packages.unity.com"
},
"com.unity.collections": {
- "version": "2.6.2",
+ "version": "6.5.0",
"depth": 2,
- "source": "registry",
+ "source": "builtin",
"dependencies": {
- "com.unity.burst": "1.8.23",
- "com.unity.mathematics": "1.3.2",
+ "com.unity.burst": "1.8.25",
+ "com.unity.nuget.mono-cecil": "1.11.6",
"com.unity.test-framework": "1.4.6",
- "com.unity.nuget.mono-cecil": "1.11.5",
- "com.unity.test-framework.performance": "3.0.3"
- },
- "url": "https://packages.unity.com"
+ "com.unity.test-framework.performance": "3.2.0"
+ }
},
"com.unity.ext.nunit": {
- "version": "2.0.5",
+ "version": "2.1.0",
"depth": 1,
"source": "builtin",
"dependencies": {}
},
"com.unity.ide.rider": {
- "version": "3.0.39",
+ "version": "3.0.40",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -88,7 +77,7 @@
"url": "https://packages.unity.com"
},
"com.unity.ide.visualstudio": {
- "version": "2.0.26",
+ "version": "2.0.27",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -97,7 +86,7 @@
"url": "https://packages.unity.com"
},
"com.unity.inputsystem": {
- "version": "1.18.0",
+ "version": "1.19.0",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -106,11 +95,10 @@
"url": "https://packages.unity.com"
},
"com.unity.mathematics": {
- "version": "1.3.3",
+ "version": "1.4.0",
"depth": 2,
- "source": "registry",
- "dependencies": {},
- "url": "https://packages.unity.com"
+ "source": "builtin",
+ "dependencies": {}
},
"com.unity.multiplayer.center": {
"version": "1.0.1",
@@ -128,35 +116,32 @@
"url": "https://packages.unity.com"
},
"com.unity.render-pipelines.core": {
- "version": "17.3.0",
+ "version": "17.5.0",
"depth": 1,
"source": "builtin",
"dependencies": {
"com.unity.burst": "1.8.14",
- "com.unity.mathematics": "1.3.2",
- "com.unity.ugui": "2.0.0",
"com.unity.collections": "2.4.3",
- "com.unity.modules.physics": "1.0.0",
"com.unity.modules.terrain": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
}
},
"com.unity.render-pipelines.universal": {
- "version": "17.3.0",
+ "version": "17.5.0",
"depth": 0,
"source": "builtin",
"dependencies": {
- "com.unity.render-pipelines.core": "17.3.0",
- "com.unity.shadergraph": "17.3.0",
- "com.unity.render-pipelines.universal-config": "17.0.3"
+ "com.unity.render-pipelines.core": "17.5.0",
+ "com.unity.shadergraph": "17.5.0",
+ "com.unity.render-pipelines.universal-config": "17.5.0"
}
},
"com.unity.render-pipelines.universal-config": {
- "version": "17.0.3",
+ "version": "17.5.0",
"depth": 1,
"source": "builtin",
"dependencies": {
- "com.unity.render-pipelines.core": "17.0.3"
+ "com.unity.render-pipelines.core": "17.5.0"
}
},
"com.unity.searcher": {
@@ -174,16 +159,16 @@
"url": "https://packages.unity.com"
},
"com.unity.shadergraph": {
- "version": "17.3.0",
+ "version": "17.5.0",
"depth": 1,
"source": "builtin",
"dependencies": {
- "com.unity.render-pipelines.core": "17.3.0",
+ "com.unity.render-pipelines.core": "17.5.0",
"com.unity.searcher": "4.9.3"
}
},
"com.unity.splines": {
- "version": "2.8.2",
+ "version": "2.9.0",
"depth": 1,
"source": "registry",
"dependencies": {
@@ -194,17 +179,17 @@
"url": "https://packages.unity.com"
},
"com.unity.test-framework": {
- "version": "1.6.0",
+ "version": "1.7.0",
"depth": 0,
"source": "builtin",
"dependencies": {
- "com.unity.ext.nunit": "2.0.3",
+ "com.unity.ext.nunit": "2.1.0",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
}
},
"com.unity.test-framework.performance": {
- "version": "3.2.0",
+ "version": "3.5.0",
"depth": 3,
"source": "registry",
"dependencies": {
@@ -214,7 +199,7 @@
"url": "https://packages.unity.com"
},
"com.unity.timeline": {
- "version": "1.8.10",
+ "version": "1.8.12",
"depth": 0,
"source": "registry",
"dependencies": {
@@ -226,20 +211,23 @@
"url": "https://packages.unity.com"
},
"com.unity.ugui": {
- "version": "2.0.0",
+ "version": "2.5.0",
"depth": 0,
"source": "builtin",
"dependencies": {
"com.unity.modules.ui": "1.0.0",
- "com.unity.modules.imgui": "1.0.0"
+ "com.unity.modules.imgui": "1.0.0",
+ "com.unity.modules.audio": "1.0.0",
+ "com.unity.modules.physics2d": "1.0.0",
+ "com.unity.modules.physics": "1.0.0"
}
},
"com.unity.visualscripting": {
- "version": "1.9.9",
+ "version": "1.9.12",
"depth": 0,
"source": "registry",
"dependencies": {
- "com.unity.ugui": "1.0.0",
+ "com.unity.ugui": "2.0.0",
"com.unity.modules.jsonserialize": "1.0.0"
},
"url": "https://packages.unity.com"
@@ -268,7 +256,9 @@
"version": "1.0.0",
"depth": 0,
"source": "builtin",
- "dependencies": {}
+ "dependencies": {
+ "com.unity.modules.jsonserialize": "1.0.0"
+ }
},
"com.unity.modules.animation": {
"version": "1.0.0",
@@ -342,6 +332,14 @@
"dependencies": {}
},
"com.unity.modules.physics2d": {
+ "version": "1.0.0",
+ "depth": 0,
+ "source": "builtin",
+ "dependencies": {
+ "com.unity.modules.physicscore2d": "1.0.0"
+ }
+ },
+ "com.unity.modules.physicscore2d": {
"version": "1.0.0",
"depth": 0,
"source": "builtin",
@@ -401,7 +399,8 @@
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0",
"com.unity.modules.hierarchycore": "1.0.0",
- "com.unity.modules.physics": "1.0.0"
+ "com.unity.modules.physics": "1.0.0",
+ "com.unity.modules.animation": "1.0.0"
}
},
"com.unity.modules.umbra": {
@@ -493,16 +492,6 @@
"com.unity.modules.unitywebrequest": "1.0.0"
}
},
- "com.unity.modules.vr": {
- "version": "1.0.0",
- "depth": 0,
- "source": "builtin",
- "dependencies": {
- "com.unity.modules.jsonserialize": "1.0.0",
- "com.unity.modules.physics": "1.0.0",
- "com.unity.modules.xr": "1.0.0"
- }
- },
"com.unity.modules.wind": {
"version": "1.0.0",
"depth": 0,
diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset
index 0828044..86d0a5d 100644
--- a/ProjectSettings/EditorBuildSettings.asset
+++ b/ProjectSettings/EditorBuildSettings.asset
@@ -13,4 +13,3 @@ EditorBuildSettings:
guid: 8e51a247e5aaae443bd17264a38fa9c5
m_configObjects:
com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}
- m_UseUCBPForAssetBundles: 0
diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset
index be4a797..4b3c923 100644
--- a/ProjectSettings/PackageManagerSettings.asset
+++ b/ProjectSettings/PackageManagerSettings.asset
@@ -12,32 +12,33 @@ MonoBehaviour:
m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}
m_Name:
m_EditorClassIdentifier:
- m_EnablePreviewPackages: 0
- m_EnablePackageDependencies: 0
+ m_EnablePreReleasePackages: 0
m_AdvancedSettingsExpanded: 1
m_ScopedRegistriesSettingsExpanded: 1
+ m_SeeAllPackageVersions: 0
+ m_DismissPreviewPackagesInUse: 0
oneTimeWarningShown: 0
- m_Registries:
- - m_Id: main
+ oneTimePackageErrorsPopUpShown: 0
+ m_MainRegistry:
+ m_Id: main
m_Name:
m_Url: https://packages.unity.com
m_Scopes: []
m_IsDefault: 1
+ m_IsUnityRegistry: 1
m_Capabilities: 7
+ m_ConfigSource: 0
+ m_Compliance:
+ m_Status: 0
+ m_Violations: []
+ m_ScopedRegistries: []
m_UserSelectedRegistryName:
m_UserAddingNewScopedRegistry: 0
m_RegistryInfoDraft:
- m_ErrorMessage:
- m_Original:
- m_Id:
- m_Name:
- m_Url:
- m_Scopes: []
- m_IsDefault: 0
- m_Capabilities: 0
m_Modified: 0
- m_Name:
- m_Url:
- m_Scopes:
- -
- m_SelectedScopeIndex: 0
+ m_ErrorMessage:
+ m_UserModificationsEntityId:
+ m_rawData: 568105589213756514
+ m_OriginalEntityId:
+ m_rawData: 568105589213756512
+ m_LoadAssets: 0
diff --git a/ProjectSettings/PhysicsCoreProjectSettings2D.asset b/ProjectSettings/PhysicsCoreProjectSettings2D.asset
new file mode 100644
index 0000000..049c745
--- /dev/null
+++ b/ProjectSettings/PhysicsCoreProjectSettings2D.asset
@@ -0,0 +1,6 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!176606843 &1
+PhysicsCoreProjectSettings2D:
+ m_ObjectHideFlags: 0
+ m_PhysicsCoreSettings: {fileID: 0}
diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt
index aad22be..2bef8d4 100644
--- a/ProjectSettings/ProjectVersion.txt
+++ b/ProjectSettings/ProjectVersion.txt
@@ -1,2 +1,2 @@
-m_EditorVersion: 6000.3.8f1
-m_EditorVersionWithRevision: 6000.3.8f1 (1c7db571dde0)
+m_EditorVersion: 6000.5.4f1
+m_EditorVersionWithRevision: 6000.5.4f1 (d550df8bd089)
diff --git a/UnityTemplateURP.sln.DotSettings b/UnityTemplateURP.sln.DotSettings
new file mode 100644
index 0000000..d1d203c
--- /dev/null
+++ b/UnityTemplateURP.sln.DotSettings
@@ -0,0 +1,469 @@
+
+ SUGGESTION
+ ShowAndRun
+ <?xml version="1.0" encoding="utf-16"?><Profile name="Scitalis: Reformat Code"><CppReformatCode>False</CppReformatCode><FSharpReformatCode>False</FSharpReformatCode><ShaderLabReformatCode>False</ShaderLabReformatCode><XMLReformatCode>False</XMLReformatCode><HtmlReformatCode>False</HtmlReformatCode><VBReformatCode>False</VBReformatCode><CSReformatCode>True</CSReformatCode><IDEA_SETTINGS><profile version="1.0">
+ <option name="myName" value="Scitalis: Reformat Code" />
+ <inspection_tool class="ES6ShorthandObjectProperty" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="JSArrowFunctionBracesCanBeRemoved" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="JSRemoveUnnecessaryParentheses" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="JSUnnecessarySemicolon" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="UnnecessaryContinueJS" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="UnnecessaryLabelJS" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="UnnecessaryLabelOnBreakStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="UnnecessaryLabelOnContinueStatementJS" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="UnnecessaryReturnJS" enabled="false" level="WARNING" enabled_by_default="false" />
+ <inspection_tool class="WrongPropertyKeyValueDelimiter" enabled="false" level="WARNING" enabled_by_default="false" />
+</profile></IDEA_SETTINGS><RIDER_SETTINGS><profile>
+ <Language id="CSS">
+ <Reformat>false</Reformat>
+ <Rearrange>true</Rearrange>
+ </Language>
+ <Language id="EditorConfig">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="HTML">
+ <Reformat>false</Reformat>
+ <Rearrange>true</Rearrange>
+ <OptimizeImports>true</OptimizeImports>
+ </Language>
+ <Language id="HTTP Request">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="Handlebars">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="Ini">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="JSON">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="Jade">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="JavaScript">
+ <Reformat>false</Reformat>
+ <Rearrange>true</Rearrange>
+ <OptimizeImports>true</OptimizeImports>
+ </Language>
+ <Language id="Markdown">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="Mermaid">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="Properties">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="RELAX-NG">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="SQL">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="VueExpr">
+ <Reformat>false</Reformat>
+ </Language>
+ <Language id="XML">
+ <Reformat>false</Reformat>
+ <Rearrange>true</Rearrange>
+ <OptimizeImports>true</OptimizeImports>
+ </Language>
+ <Language id="yaml">
+ <Reformat>false</Reformat>
+ </Language>
+</profile></RIDER_SETTINGS><CSCodeStyleAttributes ArrangeVarStyle="True" ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" ArrangeArgumentsStyle="True" RemoveRedundantParentheses="True" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeCodeBodyStyle="True" ArrangeTrailingCommas="True" ArrangeObjectCreation="True" ArrangeDefaultValue="True" ArrangeNamespaces="True" ArrangeNullCheckingPattern="True" /><CSArrangeQualifiers>True</CSArrangeQualifiers><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CppCodeStyleCleanupDescriptor ArrangeBraces="True" ArrangeAuto="True" ArrangeFunctionDeclarations="True" ArrangeNestedNamespaces="True" ArrangeTypeAliases="True" ArrangeCVQualifiers="True" ArrangeSlashesInIncludeDirectives="True" ArrangeOverridingFunctions="True" SortIncludeDirectives="True" SortMemberInitializers="True" /><FormatAttributeQuoteDescriptor>True</FormatAttributeQuoteDescriptor><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings></CSOptimizeUsings><CSShortenReferences>True</CSShortenReferences><VBOptimizeImports>True</VBOptimizeImports><VBShortenReferences>True</VBShortenReferences><Xaml.RemoveRedundantNamespaceAlias>True</Xaml.RemoveRedundantNamespaceAlias><AspOptimizeRegisterDirectives>True</AspOptimizeRegisterDirectives><CSReorderTypeMembers>True</CSReorderTypeMembers></Profile>
+ Scitalis: Reformat Code
+ Scitalis: Reformat Code
+ RequiredForMultiline
+ False
+ 1
+ 1
+ WRAP_IF_LONG
+ WRAP_IF_LONG
+ WRAP_IF_LONG
+ WRAP_IF_LONG
+ WRAP_IF_LONG
+ <Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
+ <TypePattern DisplayName="StyleCop Analyzers Default Ordering">
+ <TypePattern.Match>
+ <Or>
+ <Kind Is="Class" />
+ <Kind Is="Struct" />
+ <Kind Is="Interface" />
+ <Kind Is="Record" />
+ </Or>
+ </TypePattern.Match>
+
+ <Entry DisplayName="Fields">
+ <Entry.Match>
+ <Or>
+ <Kind Is="Constant" />
+ <Kind Is="Field" />
+ </Or>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Kind Order="Constant Field" />
+ <Static />
+ <Readonly />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Static Constructor" Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Constructor" />
+ <Static />
+ </And>
+ </Entry.Match>
+ </Entry>
+
+ <Entry DisplayName="Instance Constructors">
+ <Entry.Match>
+ <And>
+ <Kind Is="Constructor" />
+ <Not>
+ <Static />
+ </Not>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Finalizer">
+ <Entry.Match>
+ <Kind Is="Destructor" />
+ </Entry.Match>
+ </Entry>
+
+ <Entry DisplayName="Delegates">
+ <Entry.Match>
+ <Kind Is="Delegate" />
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Static Events and Static Interface Event Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Event" />
+ <Static />
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Instance Events and Instance Interface Event Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Event" />
+ <Not>
+ <Static />
+ </Not>
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Other Events">
+ <Entry.Match>
+ <And>
+ <Kind Is="Event" />
+ <Not>
+ <Access Is="Public" />
+ </Not>
+ <Not>
+ <ImplementsInterface />
+ </Not>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Enums">
+ <Entry.Match>
+ <Kind Is="Enum" />
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Interfaces">
+ <Entry.Match>
+ <Kind Is="Interface" />
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Static Properties and Static Interface Property Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Static />
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Instance Properties and Instance Interface Property Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Not>
+ <Static />
+ </Not>
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Other Properties">
+ <Entry.Match>
+ <And>
+ <Kind Is="Property" />
+ <Not>
+ <Access Is="Public" />
+ </Not>
+ <Not>
+ <ImplementsInterface />
+ </Not>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Static Indexers and Static Interface Indexer Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Indexer" />
+ <Static />
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Instance Indexers and Instance Interface Indexer Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Kind Is="Indexer" />
+ <Not>
+ <Static />
+ </Not>
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Other Indexers">
+ <Entry.Match>
+ <And>
+ <Kind Is="Indexer" />
+ <Not>
+ <Access Is="Public" />
+ </Not>
+ <Not>
+ <ImplementsInterface />
+ </Not>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Static Methods, Operators, and Static Interface Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Or>
+ <Kind Is="Method" />
+ <Kind Is="Operator" />
+ </Or>
+ <Static />
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Public Instance Methods, Operators, and Instance Interface Implementations"
+ Priority="200">
+ <Entry.Match>
+ <And>
+ <Or>
+ <Kind Is="Method" />
+ <Kind Is="Operator" />
+ </Or>
+ <Not>
+ <Static />
+ </Not>
+ <Or>
+ <Access Is="Public" />
+ <ImplementsInterface />
+ </Or>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Other Methods and Operators">
+ <Entry.Match>
+ <And>
+ <Or>
+ <Kind Is="Method" />
+ <Kind Is="Operator" />
+ </Or>
+ <Not>
+ <Access Is="Public" />
+ </Not>
+ <Not>
+ <ImplementsInterface />
+ </Not>
+ </And>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Static />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Nested Structs">
+ <Entry.Match>
+ <Kind Is="Struct" />
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="Nested Classes and Records">
+ <Entry.Match>
+ <Or>
+ <Kind Is="Class" />
+ <Kind Is="Record" />
+ </Or>
+ </Entry.Match>
+
+ <Entry.SortBy>
+ <Access Order="Public Internal ProtectedInternal Protected PrivateProtected Private" />
+ <Name />
+ </Entry.SortBy>
+ </Entry>
+
+ <Entry DisplayName="All Other Members" />
+ </TypePattern>
+</Patterns>
+ False
+ False
+ False
+ True
+ False
+ False
+ True
+ False
+ True
+ CLIP
+ JSON
+ LU
+ ML
+ MLP
+ True
+ True
+ True
+ True
+ True
+ True
+ 120
+ 120
+
diff --git a/format_check.sh b/format_check.sh
new file mode 100644
index 0000000..5d27896
--- /dev/null
+++ b/format_check.sh
@@ -0,0 +1,15 @@
+#!/usr/bin/env sh
+set -eu
+
+SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
+cd "$SCRIPT_DIR"
+
+dotnet tool restore
+
+if ! dotnet tool run dotnet-format -- Assets/_Project/Scripts --folder --check --include Assets/_Project/Scripts; then
+ printf '\nFormat check failed. Run this command locally to see and fix formatting issues:\n'
+ printf 'dotnet tool run dotnet-format -- Assets/_Project/Scripts --folder --include Assets/_Project/Scripts\n'
+ exit 1
+fi
+
+printf 'Formatting and code style check passed.\n'