diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000..9db94a81
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,34 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[Bug]"
+labels: bug
+assignees: Akarinnnnn
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Desktop (please complete the following information):**
+ - OS: [e.g. iOS]
+ - Version [e.g. 22]
+
+**Steamworks.NET.AnyCPU Version (Version String For NuGet, Commit For Source Built)**
+
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml
new file mode 100644
index 00000000..8b4ba07f
--- /dev/null
+++ b/.github/workflows/build-and-publish.yml
@@ -0,0 +1,92 @@
+name: Build & Publish Steamworks.NET.AnyCPU
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: "Package version (e.g., 2025.162.1)"
+ required: false
+ type: string
+ push:
+ tags:
+ - "[0-9][0-9][0-9][0-9].[0-9]*.[0-9]*" # Matches YYYY.*.* format like 2025.162.5
+ - "[0-9][0-9][0-9][0-9].[0-9]*.[0-9]*-*" # Matches YYYY.*.*-* format like 2025.162.5-beta1
+
+permissions:
+ id-token: write # Required for OIDC authentication
+ contents: read # Required to checkout code
+
+jobs:
+ build:
+ name: Pack and create artifact
+ runs-on: ubuntu-latest
+ outputs:
+ version: ${{ steps.version.outputs.version }}
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+ with:
+ lfs: true
+
+ - name: Set up .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: |
+ 8.0.x
+
+ - name: Determine version
+ id: version
+ run: |
+ if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
+ VERSION="${{ github.event.inputs.version }}"
+ echo "Using manual version: $VERSION"
+ elif [[ "${{ github.ref }}" == refs/tags/* ]]; then
+ VERSION=${GITHUB_REF#refs/tags/}
+ echo "Using tag version: $VERSION"
+ else
+ VERSION=""
+ fi
+
+ # Set default version if empty
+ if [ -z "$VERSION" ] || [ "$VERSION" = "" ]; then
+ VERSION="0.0.0"
+ echo "Version was empty, using default: $VERSION"
+ fi
+
+ echo "version=$VERSION" >> $GITHUB_OUTPUT
+
+ - name: Pack Steamworks.NET.AnyCPU
+ run: |
+ dotnet pack ./Standalone3.0/Steamworks.NET.csproj \
+ --configuration Release \
+ -p:Version=${{ steps.version.outputs.version }}
+
+ - name: Upload NuGet package artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: nuget-package
+ path: ./Standalone3.0/bin/Release/*.nupkg
+ retention-days: 30
+
+ publish:
+ name: Publish ${{ needs.build.outputs.version }} to nuget.org
+ runs-on: ubuntu-latest
+ environment: prod
+ needs: build
+ if: needs.build.outputs.version != '0.0.0'
+
+ steps:
+ - name: Download artifact
+ uses: actions/download-artifact@v4
+ with:
+ name: nuget-package
+ path: ./packages
+
+ - name: NuGet login
+ uses: NuGet/login@v1
+ id: login
+ with:
+ user: ${{ vars.NUGET_USER }} # Set this variable in workflows > vars
+
+ - name: NuGet push
+ run: |
+ dotnet nuget push ./packages/*.nupkg --api-key ${{ steps.login.outputs.NUGET_API_KEY }} --source https://api.nuget.org/v3/index.json
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index 988b58c3..00000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "CodeGen/SteamworksParser"]
- path = CodeGen/SteamworksParser
- url = https://github.com/rlabrecque/SteamworksParser.git
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 00000000..030ae9e7
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,45 @@
+{
+ // 使用 IntelliSense 了解相关属性。
+ // 悬停以查看现有属性的描述。
+ // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+
+ {
+ "name": "Debug generator",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${workspaceFolder}/CodeGen/Steamworks.NET_CodeGen.py",
+ "cwd": "${workspaceFolder}/CodeGen/",
+ "console": "integratedTerminal",
+ "justMyCode": true
+ },
+ {
+ "name": "Debug comparer",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${workspaceFolder}/CodeGen/SteamworksParser/compare_with_official.py",
+ "cwd": "${workspaceFolder}/CodeGen/SteamworksParser/",
+ "console": "integratedTerminal",
+ "justMyCode": true
+ },
+ {
+ "name": "Test pack size",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${workspaceFolder}/CodeGen/SteamworksParser/test_pack_size.py",
+ "cwd": "${workspaceFolder}/CodeGen/SteamworksParser/",
+ "console": "integratedTerminal",
+ "justMyCode": true
+ },
+ {
+ "name": "Debug parser",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${workspaceFolder}/CodeGen/SteamworksParser/debug_entrypoint.py",
+ "console": "integratedTerminal",
+ "cwd": "${workspaceFolder}/CodeGen/SteamworksParser/",
+ "justMyCode": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/CodeGen/PYTHON 3.13 USED b/CodeGen/PYTHON 3.13 USED
new file mode 100644
index 00000000..e69de29b
diff --git a/CodeGen/SteamworksParser b/CodeGen/SteamworksParser
deleted file mode 160000
index a307b6f2..00000000
--- a/CodeGen/SteamworksParser
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit a307b6f25d2be0b2cfe0db0c4fe524db3106f0ed
diff --git a/CodeGen/SteamworksParser/.editorconfig b/CodeGen/SteamworksParser/.editorconfig
new file mode 100644
index 00000000..b3c5df63
--- /dev/null
+++ b/CodeGen/SteamworksParser/.editorconfig
@@ -0,0 +1,5 @@
+root = true
+charset = utf-8
+indent_size = 4
+indent_style = space
+tab_width = 4
\ No newline at end of file
diff --git a/CodeGen/SteamworksParser/.gitignore b/CodeGen/SteamworksParser/.gitignore
new file mode 100644
index 00000000..74cd7124
--- /dev/null
+++ b/CodeGen/SteamworksParser/.gitignore
@@ -0,0 +1,4 @@
+*.pyc
+__pycache__
+steamtest/
+bin
\ No newline at end of file
diff --git a/CodeGen/SteamworksParser/.vscode/launch.json b/CodeGen/SteamworksParser/.vscode/launch.json
new file mode 100644
index 00000000..80560674
--- /dev/null
+++ b/CodeGen/SteamworksParser/.vscode/launch.json
@@ -0,0 +1,14 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Debug parser",
+ "type": "debugpy",
+ "request": "launch",
+ "program": "${workspaceFolder}/debug_entrypoint.py",
+ "console": "integratedTerminal",
+ "cwd": "${workspaceFolder}",
+ "justMyCode": true
+ }
+ ]
+}
\ No newline at end of file
diff --git a/CodeGen/SteamworksParser/LICENSE.txt b/CodeGen/SteamworksParser/LICENSE.txt
new file mode 100644
index 00000000..338a2e47
--- /dev/null
+++ b/CodeGen/SteamworksParser/LICENSE.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015-2021 Riley Labrecque
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/CodeGen/SteamworksParser/PYTHON 3.13 USED b/CodeGen/SteamworksParser/PYTHON 3.13 USED
new file mode 100644
index 00000000..e69de29b
diff --git a/CodeGen/SteamworksParser/README.md b/CodeGen/SteamworksParser/README.md
new file mode 100644
index 00000000..563cc5ea
--- /dev/null
+++ b/CodeGen/SteamworksParser/README.md
@@ -0,0 +1,40 @@
+# SteamworksParser
+
+This is a simple parser for the [Steamworks](https://partner.steamgames.com/) header files.
+
+SteamworksParser is used to generate the [Steamworks.NET](https://github.com/rlabrecque/Steamworks.NET) bindings via [Steamworks.NET-CodeGen](https://github.com/rlabrecque/Steamworks.NET-CodeGen).
+
+You might be wondering why not just use something like libclang to parse the C++. The primary reason was that I wanted to retain comments and formating information.
+
+## Usage Example
+
+Pull this package into your project folder.
+
+```python
+ import sys
+ from SteamworksParser import steamworksparser
+
+ def main():
+ if len(sys.argv) != 2:
+ print('Usage: test.py ')
+ return
+
+ steamworksparser.Settings.warn_utf8bom = True
+ steamworksparser.Settings.warn_includeguardname = True
+ steamworksparser.Settings.warn_spacing = True
+ parser = steamworksparser.parse(sys.argv[1])
+
+ with open('test.json', 'w') as out:
+ out.write('{\n')
+
+ out.write(' "typedefs":[\n')
+ for typedef in parser.typedefs:
+ out.write(' {\n')
+ out.write(' "typedef":"' + typedef.name + '",\n')
+ out.write(' "type":"' + typedef.type + '"\n')
+ out.write(' },\n')
+
+
+ if __name__ == '__main__':
+ main()
+```
diff --git a/CodeGen/SteamworksParser/__init__.py b/CodeGen/SteamworksParser/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/CodeGen/SteamworksParser/compare_with_official.py b/CodeGen/SteamworksParser/compare_with_official.py
new file mode 100644
index 00000000..6bd4699d
--- /dev/null
+++ b/CodeGen/SteamworksParser/compare_with_official.py
@@ -0,0 +1,88 @@
+from types import SimpleNamespace
+from steamworksparser import Struct, StructField, parse, Settings
+import os
+import json
+import itertools
+# Settings.print_skippedtypedefs = True
+# Settings.print_unuseddefines = True
+# Settings.warn_spacing = True
+# Settings.print_debug = True
+
+parser = parse("./steamtest") # put steam headers inside
+
+os.makedirs("./bin/compare-official", exist_ok=True)
+os.makedirs("./bin/native", exist_ok=True)
+
+
+mismatchCallbackDiagnostics:list[tuple[int, str, str]] = [] # (callbackid, message, code)
+matchCallbackIds: list[int] = []
+redundantCallbackIds: list[int] = []
+
+fieldsMatchedStructs: list[Struct] = []
+
+with open("./steamtest/steam_api.json") as f:
+ official = json.load(f, object_hook=lambda d: SimpleNamespace(**d))
+ flattenedCallbacks = [callback for file in parser.files for callback in file.callbacks]
+ flattenedStructs = [struct for file in parser.files for struct in file.structs]
+
+
+ for cb in flattenedCallbacks:
+ idParts = cb.callbackid.strip().split(' ')
+ idConst = parser.resolveConstValue(idParts[0].strip())
+ identity = None
+ if len(idParts) == 3:
+ identity = int(idConst.value) + int(idParts[2])
+ else:
+ identity = int(idConst.value)
+
+ officialCBs: list = official.callback_structs
+ officialCB = next((o for o in officialCBs if o.callback_id == identity), None)
+ diag = None
+ if officialCB is None:
+ redundantCallbackIds.append(identity)
+ continue
+ if officialCB.struct != cb.name and identity != 1108: # 1108 is shared between CL and GS
+ diag = (identity, f"Name mismatch, ours is `{cb.name}`, official one is `{officialCB.struct}`", 'E1')
+ mismatchCallbackDiagnostics.append(diag)
+ continue
+
+ if len(officialCB.fields) != len(cb.fields):
+ diag = (identity, f"Callback `{cb.name}`'s field count({len(cb.fields)}) is not execpted({len(officialCB.fields)})", 'E4')
+ continue
+
+ for i, fld in enumerate(officialCB.fields):
+ official_field = officialCB.fields[i]
+ our_field = cb.fields[i]
+
+ # compare name
+ if official_field.fieldname != our_field.name:
+ diag = (identity, f"field[{i}]'s name mismatch, `{official_field.fieldname}` expected, got `{our_field.name}`", 'E2')
+ break
+
+ def our_type_to_official_format(ourFld: StructField):
+ if ourFld.arraysize:
+ return f"{ourFld.type} [{ourFld.arraysize}]"
+ else:
+ return ourFld.type
+
+ # compare type
+ typeGot = our_type_to_official_format(our_field)
+ if official_field.fieldtype != typeGot:
+ arrayDiag = our_field.arraysize or "None"
+ diag = (identity, f"Callback {officialCB.struct} field[{i}] ({official_field.fieldname})'s type mismatch, "\
+ f"`{official_field.fieldtype}` excepted, got `{our_field.name}: {typeGot}`", 'E3')
+ break
+
+ if diag is not None:
+ mismatchCallbackDiagnostics.append(diag)
+ continue
+
+with open("./bin/compare-official/result.txt", "w", encoding="utf-8") as compareF:
+ diagLines: list[str] = []
+ for diag in mismatchCallbackDiagnostics:
+ diagString = f"{diag[2]}: {diag[1]}.\n\tCallback id {diag[0]}."
+ diagLines.append(diagString)
+ print(diagString)
+
+ diagLines = [line + '\n' for line in diagLines]
+ compareF.writelines(diagLines)
diff --git a/CodeGen/SteamworksParser/debug_entrypoint.py b/CodeGen/SteamworksParser/debug_entrypoint.py
new file mode 100644
index 00000000..f34e2df9
--- /dev/null
+++ b/CodeGen/SteamworksParser/debug_entrypoint.py
@@ -0,0 +1,49 @@
+from steamworksparser import parse, Settings
+import os
+import json
+import itertools
+# Settings.print_skippedtypedefs = True
+# Settings.print_unuseddefines = True
+# Settings.warn_spacing = True
+Settings.print_debug = True
+
+parser = parse("./steamtest") # put steam headers inside
+
+os.makedirs("bin/compare-official", exist_ok=True)
+os.makedirs("bin/native", exist_ok=True)
+
+with open("bin/native/pack-size-test.cpp", "w", encoding="utf-8") as f:
+ f.write("#include \n")
+ f.write("#include \"steam_api.h\"\n")
+ f.write("#include \"steam_gameserver.h\"\n")
+ f.write("#include \"isteamgamecoordinator.h\"\n")
+ f.write("#include \"steamnetworkingfakeip.h\"\n")
+ f.write("#ifdef _MSC_VER\n")
+ f.write("#include \"fcntl.h\"\n")
+ f.write("#include \"io.h\"\n")
+ f.write("#endif\n")
+
+ f.write("int main() {\n")
+ f.write("#ifdef _MSC_VER\n")
+ f.write("fflush(stdout);\n")
+ f.write("_setmode(_fileno(stdout), _O_BINARY);\n")
+ f.write("#endif\n")
+ structInspectionTemplate = "std::cout << \"{0}\" << '\\t' << sizeof({0}) << '\\t' << alignof({0}) << '\\n';\n"
+ for interface in parser.files:
+ for s in interface.callbacks:
+ f.write(structInspectionTemplate.format(s.name))
+ for s in interface.structs:
+ if not s.should_not_generate():
+ f.write(structInspectionTemplate.format(s.name))
+
+ f.write('}')
+
+ # generated file still need some fix at 25/11/19
+
+with open("bin/pack-aware-structs.txt", "wb") as fp:
+ for structName in parser.packSizeAwareStructs:
+ fp.write(bytes(structName + "\n", "utf-8"))
+
+# if you want to generate a detailed diff file,
+# you can see parser.resolveTypeInfo() and parser.populate_struct_field_layout()
+# latter is used to calculate size by passing different platform default pack size
\ No newline at end of file
diff --git a/CodeGen/SteamworksParser/steamworksparser.py b/CodeGen/SteamworksParser/steamworksparser.py
new file mode 100644
index 00000000..be16c853
--- /dev/null
+++ b/CodeGen/SteamworksParser/steamworksparser.py
@@ -0,0 +1,1529 @@
+import os
+import codecs
+import copy
+import re
+from typing import Literal, Optional
+from functools import reduce
+import operator
+
+g_SkippedFiles = (
+ "steam_api_flat.h", # Valve's C API
+
+ # PS3-only Headers not currently supported
+ "isteamps3overlayrenderer.h",
+ "steamps3params.h",
+
+ # Deprecated, moved to isteaminput.h
+ "isteamcontroller.h",
+
+ # Non-steam code
+ "isteamdualsense.h",
+)
+
+g_SkippedLines = (
+ # steamtypes.h
+ "STEAM_CLANG_ATTR",
+ "#define VALVE_BIG_ENDIAN",
+
+ # Multiple
+ "public:",
+ "private:",
+ "protected:",
+ "_STEAM_CALLBACK_",
+ "#define STEAM_CALLBACK_BEGIN",
+ "#define STEAM_CALLBACK_END",
+ "#define STEAM_CALLBACK_MEMBER",
+ "STEAM_DEFINE_INTERFACE_ACCESSOR",
+)
+
+g_SkippedStructs = (
+ # steamnetworkingtypes.h
+ "SteamNetworkingIPAddr",
+ "SteamNetworkingIdentity",
+ "SteamNetworkingMessage_t",
+ "SteamNetworkingConfigValue_t",
+
+ # steamdatagram_tickets.h
+ "SteamDatagramHostedAddress",
+ "SteamDatagramRelayAuthTicket",
+ "SteamIDComponent_t"
+
+ # steamclientpublic.h nested struct
+ "GameID_t"
+)
+
+g_FuncAttribs = (
+ "STEAM_METHOD_DESC",
+ "STEAM_IGNOREATTR",
+ "STEAM_CALL_RESULT",
+ "STEAM_CALL_BACK",
+ "STEAM_FLAT_NAME",
+)
+
+g_ArgAttribs = (
+ "STEAM_ARRAY_COUNT",
+ "STEAM_ARRAY_COUNT_D",
+ "STEAM_BUFFER_COUNT",
+ "STEAM_DESC",
+ "STEAM_OUT_ARRAY_CALL",
+ "STEAM_OUT_ARRAY_COUNT",
+ "STEAM_OUT_BUFFER_COUNT",
+ "STEAM_OUT_STRING",
+ "STEAM_OUT_STRING_COUNT",
+ "STEAM_OUT_STRUCT",
+)
+
+g_GameServerInterfaces = (
+ 'isteamclient.h',
+ #'isteamgameserver.h',
+ #'isteamgameserverstats.h',
+ 'isteamhttp.h',
+ 'isteaminventory.h',
+ 'isteamnetworking.h',
+ 'isteamnetworkingmessages.h',
+ 'isteamnetworkingsockets.h',
+ 'isteamnetworkingutils.h',
+ 'isteamugc.h',
+ 'isteamutils.h',
+)
+
+class ClassSpecialRBracket:
+ def __init__(self, lineZB: int, action: Literal['EndStruct'] | Literal['ContniueStruct']):
+ self.lineZeroBased = lineZB
+ self.action: Literal['EndStruct'] | Literal['ContniueStruct'] = action
+
+g_ClassSpecialRBracket = {
+ "CSteamID" : ClassSpecialRBracket(850, 'ContniueStruct')
+}
+
+class PrimitiveType:
+ def __init__(self, name: str, size: int, pack: int):
+ self.name = name
+ self.size = size
+ self.pack = pack
+
+g_PrimitiveTypesLayout: dict[str, PrimitiveType] = {
+ "char": PrimitiveType("char", 1, 1),
+ "bool": PrimitiveType("bool", 1, 1),
+ "unsigned char": PrimitiveType("unsigned char", 1, 1),
+ "signed char": PrimitiveType("signed char", 1, 1),
+ "short": PrimitiveType("short", 2, 2),
+ "unsigned short": PrimitiveType("unsigned short", 2, 2),
+ "int": PrimitiveType("int", 4, 4),
+ "unsigned int": PrimitiveType("unsigned int", 4, 4),
+ "long long": PrimitiveType("long long", 8, 8),
+ "unsigned long long": PrimitiveType("unsigned long long", 8, 8),
+ "float": PrimitiveType("float", 4, 4),
+ "double": PrimitiveType("double", 8, 8),
+
+ # Add them here since we don't use the definiation in steamtypes.h
+ "uint8": PrimitiveType("unsigned char", 1, 1),
+ "int8": PrimitiveType("signed char", 1, 1),
+ "int16": PrimitiveType("short", 2, 2),
+ "uint16": PrimitiveType("unsigned short", 2, 2),
+ "int32": PrimitiveType("int", 4, 4),
+ "uint32": PrimitiveType("unsigned int", 4, 4),
+ "int64": PrimitiveType("long long", 8, 8),
+ "uint64": PrimitiveType("unsigned long long", 8, 8),
+
+ "unsigned __int8": PrimitiveType("unsigned char", 1, 1),
+ "__sint8": PrimitiveType("signed char", 1, 1),
+ "__int16": PrimitiveType("short", 2, 2),
+ "unsigned __int16": PrimitiveType("unsigned short", 2, 2),
+ "__int32": PrimitiveType("int", 4, 4),
+ "unsigned __int32": PrimitiveType("unsigned int", 4, 4),
+ "__int64": PrimitiveType("long long", 8, 8),
+ "unsigned __int64": PrimitiveType("unsigned long long", 8, 8),
+
+ "uint8_t": PrimitiveType("unsigned char", 1, 1),
+ "sint8_t": PrimitiveType("signed char", 1, 1),
+ "int16_t": PrimitiveType("short", 2, 2),
+ "uint16_t": PrimitiveType("unsigned short", 2, 2),
+ "int32_t": PrimitiveType("int", 4, 4),
+ "uint32_t": PrimitiveType("unsigned int", 4, 4),
+ "int64_t": PrimitiveType("long long", 8, 8),
+ "uint64_t": PrimitiveType("unsigned long long", 8, 8),
+
+ "intptr": PrimitiveType("intptr", "intptr", "intptr"),
+ "intp": PrimitiveType("intp", "intptr", "intptr"),
+ "uintp": PrimitiveType("uintp", "intptr", "intptr"),
+ "void*": PrimitiveType("void*", "intptr", "intptr"),
+
+ "long int": PrimitiveType("long int", 8, 8),
+ "unsigned long int": PrimitiveType("unsigned long int", 8, 8),
+}
+
+g_SpecialStructs = {
+ "CSteamID": PrimitiveType("unsigned long long", 8, 8),
+ "CGameID": PrimitiveType("unsigned long long", 8, 8),
+ "GameID_t": PrimitiveType("unsigned long long", 8, 8),
+ "SteamIPAddress_t": PrimitiveType("SteamIPAddress_t", 16 + 4, 1),
+ "SteamNetworkingIdentity": PrimitiveType("SteamNetworkingIdentity", 4 + 128, 1),
+ "SteamNetworkingIPAddr": PrimitiveType("SteamNetworkingIPAddr", 20, 1), # Why this is not CLASS??????????
+ # Contains bit fields that size can't be represented as bytes count
+ "SteamIDComponent_t": PrimitiveType("SteamIDComponent_t", 8, 8),
+}
+
+
+class Settings:
+ warn_utf8bom = False
+ warn_includeguardname = False
+ warn_spacing = False
+ print_unuseddefines = False
+ print_skippedtypedefs = False
+ fake_gameserver_interfaces = False
+ print_debug = False
+
+class BlankLine(object):
+ pass # linenum?
+
+class Comment:
+ def __init__(self, rawcomments, comments, rawlinecomment, linecomment):
+ self.rawprecomments = rawcomments
+ self.precomments = comments
+ self.rawlinecomment = rawlinecomment
+ self.linecomment = linecomment
+
+class ArgAttribute:
+ def __init__(self, name="", value=""):
+ self.name = name
+ self.value = value
+
+class Arg:
+ def __init__(self, name="", type_="", default=None, attribute=None):
+ self.name = name
+ self.type = type_
+ self.default = default
+ self.attribute = attribute # ArgAttribute
+
+class FunctionAttribute:
+ def __init__(self):
+ self.name = ""
+ self.value = ""
+
+class Function:
+ def __init__(self):
+ self.name = ""
+ self.returntype = ""
+ self.args: list[Arg] = [] # Arg
+ self.ifstatements = []
+ self.comments = []
+ self.linecomment = ""
+ self.attributes = [] # FunctionAttribute
+ self.private = False
+
+class Interface:
+ def __init__(self):
+ self.name = ""
+ self.functions: list[Function] = [] # Function
+ self.c = None # Comment
+
+class Define:
+ def __init__(self, name, value, spacing, comments):
+ self.name = name
+ self.value = value
+ self.spacing = spacing
+ self.c = comments
+
+class Constant:
+ def __init__(self, name, value, type_, comments):
+ self.name = name
+ self.value = value
+ self.type = type_
+ self.c = comments # Comment
+
+class EnumField:
+ def __init__(self):
+ self.name = ""
+ self.value = ""
+ self.prespacing = " "
+ self.postspacing = " "
+ self.c = None # Comment
+
+class Enum:
+ def __init__(self, name, comments):
+ self.name = name
+ self.fields = [] # EnumField
+ self.c = comments
+ self.endcomments = None # Comment
+ # enums' size is always 4(an int)
+ self.size = 4
+ self.pack = 4
+
+class Struct:
+ def __init__(self, name, packsize: int | Literal["PlatformABIDefault"] | None, comments, scopePath):
+ self.name = name
+ # keep it to remain compatibility
+ self.packsize = packsize
+ self.c = comments # Comment
+ self.fields: list[StructField] = [] # StructField
+ self.nested_struct: list[Struct] = [] # nested structs
+ self.outer_type: Struct | Union | None = None
+ self.scopeDepth: int = scopePath
+ self.callbackid: str | None = None
+ self.endcomments = None # Comment
+ self.pack = packsize
+ self.size: int | None = None
+ self.packsize_aware = False
+ self.is_skipped: bool = False
+ self.is_sequential = packsize == "PlatformABIDefault"
+
+ def calculate_offsets(self, defaultAlign: int):
+ def calcRealSize(sizelike: int | Literal['intptr']) -> int:
+ if sizelike == 'intptr':
+ return 8
+ else:
+ return sizelike
+
+ if not self.fields:
+ self.size = 1
+ return []
+
+ effective_struct_pack = self.packsize if self.packsize is not None else defaultAlign
+
+ result = []
+ current_offset = 0
+
+ for field in self.fields:
+ pack = field.pack or defaultAlign
+ effective_field_pack = calcRealSize(pack)
+ effective_field_pack = min(effective_field_pack, defaultAlign)
+ padding = 0
+ if effective_field_pack > 0:
+ padding = (effective_field_pack - (current_offset % effective_field_pack)) % effective_field_pack
+ current_offset += padding
+
+ if field.size is None: # For classes with typedef inside
+ return []
+
+ effective_struct_pack = max(effective_struct_pack, effective_field_pack)
+ field_total_size = calcRealSize(field.size) * (field.arraysize or 1)
+
+ # store offset and total size into layout info
+ result.append(FieldOffset(field.name, current_offset))
+
+ current_offset += field_total_size
+
+ total_size = current_offset
+ # if effective_struct_pack > 0:
+ # padding = (effective_struct_pack - (total_size % effective_struct_pack)) % effective_struct_pack
+ # total_size += padding
+
+ self.pack = min(
+ calcRealSize(max(self.fields, key=lambda x: calcRealSize(x.size)).size),
+ effective_struct_pack
+ )
+ self.size = total_size
+ return result
+
+ def should_not_generate(self):
+ return self.name in g_SkippedStructs or self.is_skipped or (self.outer_type is not None) or len(self.nested_struct) > 0
+
+class Union:
+ def __init__(self, name, isUnnamed, pack):
+ self.name: str = name
+ self.isUnnamed: bool = isUnnamed
+ self.pack: int = pack
+ self.size: int | None = None
+ self.fields: list[StructField] = []
+ self.outer_type: Struct | Union | None = None
+ self.endcomments = None # Comment
+ pass
+
+ def calculate_offsets(self, defaultAlign: int):
+ if not self.fields:
+ self.size = 1
+ return self.size
+
+ # find out the largest pack and it's size
+ max_field = max(self.fields, key=lambda f: f.size)
+ max_size = max_field.size
+ max_pack = max_field.pack if max_field.pack != None else defaultAlign
+
+ # align with largest field's packsize
+ if max_pack:
+ remainder = max_size % max_pack
+ if remainder != 0:
+ self.size = max_size + (max_pack - remainder)
+ else:
+ self.size = max_size
+ else:
+ self.size = max_size
+
+ return self.size
+
+'''Also used in Union'''
+class StructField:
+ def __init__(self, name, typee, arraysize: str | None, comments):
+ self.name: str = name
+ self.type = typee
+ self.arraysizeStr = arraysize
+ self.arraysize: int | None = None
+ self.c = comments # Comment
+ self.size: int | Literal['intptr'] = None # Popluated after parsed, before generate
+ self.pack: int | Literal['intptr'] = None # Also populated lazily
+
+class FieldOffset:
+ def __init__(self, name: str, offset: int):
+ self.name = name
+ self.offset = offset
+
+ def __eq__(self, value):
+ return self.name == value.name and self.offset == value.offset
+
+class Typedef:
+ def __init__(self, name, typee, filename, comments, size: int, pack: Optional[int] | None = None):
+ self.name = name
+ self.type = typee
+ self.filename = filename
+ self.c = comments
+ self.size: int | Literal['intptr'] = size
+ self.pack: int | Literal['intptr'] = pack
+
+class SteamFile:
+ def __init__(self, name):
+ self.name = name
+ self.header = []
+ self.includes = []
+ self.defines: list[Define] = [] # Define
+ self.constants: list[Constant] = [] # Constant
+ self.enums: list[Enum] = [] # Enum
+ self.structs: list[Struct] = [] # Struct
+ self.unions: list[Union] = [] # Union
+ self.callbacks: list[Struct] = [] # Struct
+ self.interfaces: list[Interface] = [] # Interface
+ self.typedefs:list[Typedef] = [] # Typedef
+
+class ParserState:
+ def __init__(self, file):
+ self.f: SteamFile = file # SteamFile
+ self.lines = []
+ self.line: str = ""
+ self.originalline = ""
+ self.linesplit: list[str] = []
+ """
+ linenum is Zero based
+ """
+ self.linenum = 0
+ self.rawcomments = []
+ self.comments = []
+ self.rawlinecomment = None
+ self.linecomment = None
+ self.ifstatements = []
+ # packsize stack
+ self.packsize = []
+ self.funcState = 0
+ self.scopeDepth = 0
+ self.complexTypeStack: list[Literal['union', 'struct', 'enum']] = []
+
+ self.interface: Interface | None = None
+ self.function: Function | None = None
+ self.enum: Enum | None = None
+ self.struct: Struct | None = None
+ self.union: Union | None = None
+ self.callbackmacro = None
+
+ self.bInHeader = True
+ self.bInMultilineComment = False
+ self.bInMultilineMacro = False
+ self.bInPrivate = False
+ self.isInlineMethodDeclared = False
+ self.callbackid: str | None = None
+ self.isClassLikeStruct: bool | None = None
+ self.functionAttributes: list[FunctionAttribute] = [] # FunctionAttribute
+
+ self.currentSpecialStruct: PrimitiveType = None
+
+ def getIndentLevel(self) -> int:
+ return self.originalline.count('\t', 0, len(self.originalline) - len(self.line))
+
+ # Types that are defined but skipped, tuple of (type name, indent level)
+ SkippedTypeDefinitions: dict[str, tuple[str, int]] = {
+ "union__steamclientpublic_803": ("SteamID_t", 1) # nested union in class CSteamID, too complex to parse
+ }
+
+ def isSkipBlock(self) -> bool:
+ return (self.struct is not None and self.struct.name in self.SkippedTypeDefinitions.keys() and self.getIndentLevel() != self.SkippedTypeDefinitions[self.struct.name][1]) or\
+ (self.union is not None and self.union.name in self.SkippedTypeDefinitions.keys() and self.getIndentLevel() != self.SkippedTypeDefinitions[self.union.name][1])
+
+ def beginUnion(self):
+ self.complexTypeStack.append('union')
+
+ def beginStruct(self):
+ self.complexTypeStack.append('struct')
+
+ def beginEnum(self):
+ self.complexTypeStack.append('enum')
+
+ def endComplexType(self):
+ len(self.complexTypeStack) > 0 and self.complexTypeStack.pop()
+
+ def getCurrentPack(self) -> int | Literal['PlatformABIDefault'] | None:
+ # pack size is default value
+ # our parser can't evaluate #ifdefs, so in the situlation of
+ # using default pack, the self.packsize will be [4, 8]
+ if self.packsize == [4, 8]:
+ # default pack
+ return None
+ elif self.packsize == [4]:
+ # we can't eval #ifdefs, so all push will be recorded without
+ # checking if it is really sets pack value
+ # one of [4, 8] is not used by #ifdef, if code pops in this state
+ # it means platform ABI default pack is restored
+ return 'PlatformABIDefault'
+ else:
+ return self.packsize[-1] if len(self.packsize) > 0 else None
+
+ def getCurrentComplexType(self) -> Literal['struct', 'union', 'enum'] | None:
+ return self.complexTypeStack[-1] if len(self.complexTypeStack) > 0 else None
+
+class Parser:
+ files = None
+ typedefs = []
+ ignoredStructs: list[Struct] = []
+
+ def __init__(self, folder):
+ self.files: list[SteamFile] = [SteamFile(f) for f in os.listdir(folder)
+ if os.path.isfile(os.path.join(folder, f))
+ and f.endswith(".h")
+ and f not in g_SkippedFiles]
+ self.files
+ self.files.sort(key=lambda f: f.name)
+
+ self.typedefs:list[Typedef] = [
+ ]
+
+
+ for f in self.files:
+ s = ParserState(f)
+ filepath = os.path.join(folder, f.name)
+ with open(filepath, 'r', encoding="latin-1") as infile:
+ s.lines = infile.readlines()
+
+ if s.lines[0][:3] == codecs.BOM_UTF8:
+ # Reload file with UTF-8 encoding
+ infile.close()
+ infile = open(filepath, 'r', encoding="utf-8")
+ s.lines = infile.readlines()
+ s.lines[0] = s.lines[0][3:]
+
+ if Settings.warn_utf8bom:
+ printWarning("File contains a UTF8 BOM.", s)
+
+ self.parse(s)
+
+
+ self.populate_typedef_layouts()
+ # self.populate_struct_field_sizes()
+
+ # Hack to give us the GameServer interfaces.
+ # We want this for autogen but probably don't want it for anything else.
+ if Settings.fake_gameserver_interfaces:
+ for f in [f for f in self.files if f.name in g_GameServerInterfaces]:
+ gs_f = SteamFile(f.name.replace("isteam", "isteamgameserver", 1))
+ gs_f.interfaces = copy.deepcopy(f.interfaces)
+ for i in gs_f.interfaces:
+ i.name = i.name.replace("ISteam", "ISteamGameServer", 1)
+ self.files.append(gs_f)
+
+ self.findout_platform_aware_structs()
+
+ def parse(self, s: ParserState):
+ for linenum, line in enumerate(s.lines):
+ s.line = line
+ s.originalline = line
+ s.linenum = linenum
+
+ s.line = s.line.rstrip()
+ self.parse_comments(s)
+
+ # Comments get removed from the line, often leaving blank lines, thus we do this after parsing comments
+ if not s.line:
+ continue
+
+ s.linesplit = s.line.split()
+
+ if s.bInHeader:
+ self.parse_header(s)
+
+ if self.parse_skippedlines(s):
+ self.consume_comments(s)
+ continue
+
+ self.parse_preprocessor(s)
+ self.parse_typedefs(s)
+ self.parse_constants(s)
+ self.parse_enums(s)
+ self.visit_union(s)
+ self.parse_structs(s)
+ self.parse_callbackmacros(s)
+ self.parse_interfaces(s)
+ if not s.line:
+ continue
+
+ self.parse_classes(s)
+ self.parse_scope(s)
+
+ def parse_comments(self, s):
+ self.parse_comments_multiline(s)
+ self.parse_comments_singleline(s)
+ s.line = s.line.strip()
+
+ def parse_comments_multiline(self, s):
+ strComment = None
+ multilineOpenerPos = s.line.find("/*")
+ bHasOpening = (multilineOpenerPos != -1)
+ multilineCloserPos = s.line.find("*/")
+ bHasClosing = (multilineCloserPos != -1)
+
+ multipleQuoteblocks = False
+ if s.line.count("/*") > 1 or s.line.count("*/") > 1:
+ multipleQuoteblocks = True
+
+ # TODO - Ugly Code that works well
+ if bHasOpening:
+ if bHasClosing:
+ strComment = s.line[multilineOpenerPos+2:multilineCloserPos]
+ s.line = s.line[:multilineOpenerPos] + s.line[multilineCloserPos+2:]
+ s.bInMultilineComment = False
+ else:
+ strComment = s.line[multilineOpenerPos+2:]
+ s.line = s.line[:multilineOpenerPos]
+ s.bInMultilineComment = True
+ elif s.bInMultilineComment:
+ if bHasClosing:
+ strComment = s.line[:multilineCloserPos]
+ s.line = s.line[multilineCloserPos+2:]
+ s.bInMultilineComment = False
+ else:
+ strComment = s.line
+ s.line = ""
+
+ if strComment is not None:
+ s.comments.append(strComment.rstrip())
+
+ if multipleQuoteblocks:
+ self.parse_comments_multiline(s)
+
+ def parse_comments_singleline(self, s):
+ if s.linecomment is not None:
+ s.comments.append(s.linecomment)
+ s.rawcomments.append(s.rawlinecomment)
+ s.rawlinecomment = None
+ s.linecomment = None
+
+ if not s.line:
+ s.rawcomments.append(BlankLine())
+ return
+
+ commentPos = s.line.find("//")
+
+ if commentPos != -1:
+ s.linecomment = s.line[commentPos+2:]
+ s.line = s.line[:commentPos]
+
+ commentPos = s.originalline.index("//")
+ whitespace = len(s.originalline[:commentPos]) - len(s.originalline[:commentPos].rstrip())
+ startpos = commentPos - whitespace
+ s.rawlinecomment = s.originalline[startpos:].rstrip()
+
+ def parse_header(self, s):
+ if s.line:
+ s.f.header.extend(s.comments)
+ s.comments = []
+ s.bInHeader = False
+
+ def parse_skippedlines(self, s):
+ if "!defined(API_GEN)" in s.ifstatements:
+ if s.line.startswith("#if"):
+ s.ifstatements.append("ugh")
+ elif s.line.startswith("#endif"):
+ s.ifstatements.pop()
+ return True
+
+ if s.line.endswith("\\"):
+ s.bInMultilineMacro = True
+ return True
+
+ if s.bInMultilineMacro:
+ s.bInMultilineMacro = False
+ return True
+
+ for skip in g_SkippedLines:
+ if skip in s.line:
+ return True
+
+ if not s.interface and 'inline' in s.line:
+ return True
+
+ return False
+
+ def parse_preprocessor(self, s: ParserState):
+ if not s.line.startswith("#"):
+ return
+
+ elif s.line.startswith("#else"):
+ previf = s.ifstatements[-1]
+ s.ifstatements.pop()
+ s.ifstatements.append("!(" + previf + ") // #else")
+ elif s.line.startswith("#include"):
+ self.consume_comments(s)
+ includefile = s.linesplit[1]
+ includefile = includefile[1:-1] # Trim the "" or <>
+ s.f.includes.append(includefile)
+ elif s.line.startswith("#ifdef"):
+ token = s.linesplit[1]
+ s.ifstatements.append("defined(" + token + ")")
+ elif s.line.startswith("#ifndef"):
+ token = s.linesplit[1]
+ s.ifstatements.append("!defined(" + token + ")")
+ elif s.line.startswith("#if"):
+ s.ifstatements.append(s.line[3:].strip())
+ elif s.line.startswith("#endif"):
+ s.ifstatements.pop()
+ elif s.line.startswith("#define"):
+ comments = self.consume_comments(s)
+ if Settings.warn_includeguardname:
+ if not s.ifstatements:
+ if s.linesplit[1] != s.f.name.upper().replace(".", "_"):
+ printWarning("Include guard does not match the file name.", s)
+
+ if len(s.linesplit) > 2:
+ spacing = s.line[s.line.index(s.linesplit[1]) + len(s.linesplit[1]):s.line.index(s.linesplit[2])]
+ s.f.defines.append(Define(s.linesplit[1], s.linesplit[2], spacing, comments))
+ elif Settings.print_unuseddefines:
+ print("Unused Define: " + s.line)
+ elif s.line.startswith("#pragma pack"):
+ if "push" in s.line:
+ tmpline = s.line[s.line.index(",")+1:-1].strip()
+
+ packsize = None
+ try:
+ packsize = int(tmpline)
+ except ValueError:
+ pass
+
+ s.packsize.append(packsize)
+ elif "pop" in s.line:
+ s.packsize.pop()
+ elif s.line.startswith("#pragma"):
+ pass
+ elif s.line.startswith("#error"):
+ pass
+ elif s.line.startswith("#warning"):
+ pass
+ elif s.line.startswith("#elif"):
+ pass
+ elif s.line.startswith("#undef"):
+ pass
+ else:
+ printUnhandled("Preprocessor", s)
+
+
+ def parse_typedefs(self, s: ParserState):
+ if s.linesplit[0] != "typedef":
+ return
+
+ comments = self.consume_comments(s)
+
+ # Skips typedefs in the Callback/CallResult classes
+ if s.scopeDepth > 0:
+ if Settings.print_skippedtypedefs:
+ print("Skipped typedef because it's in a class or struct: " + s.line)
+ return
+
+ # Skips typedefs that we don't currently support, So far they are all function pointers.
+ if "(" in s.line or "[" in s.line:
+ if Settings.print_skippedtypedefs:
+ print("Skipped typedef because it contains '(' or '[': " + s.line)
+ return
+
+ # Currently skips typedef struct ValvePackingSentinel_t
+ if not s.line.endswith(";"):
+ if Settings.print_skippedtypedefs:
+ print("Skipped typedef because it does not end with ';': " + s.line)
+ return
+
+ name = s.linesplit[-1].rstrip(";")
+ typee = " ".join(s.linesplit[1:-1])
+ if name.startswith("*"):
+ typee += " *"
+ name = name[1:]
+
+ aliasedType = self.resolveTypeInfo(typee)
+ size = aliasedType.size
+ pack = aliasedType.pack
+
+ typedef = Typedef(name, typee, s.f.name, comments, size, pack)
+
+ self.typedefs.append(typedef)
+ s.f.typedefs.append(typedef)
+
+ def populate_typedef_layouts(self):
+ for typedef in self.typedefs:
+ typee = typedef.type
+
+ if typee in g_PrimitiveTypesLayout.keys():
+ primitive_def = g_PrimitiveTypesLayout[typee]
+ typedef.pack = primitive_def.pack
+ typedef.size = primitive_def.size
+ return
+
+ def resolveFinalType(typee):
+ underlying_type: PrimitiveType | Typedef | None = g_PrimitiveTypesLayout.get(typee)
+
+ if '*' in typee:
+ return g_PrimitiveTypesLayout["intptr"]
+
+ if underlying_type == None:
+ underlying_type = next((typedef for typedef in self.typedefs if typedef.name == typee), None)
+
+ if underlying_type == None:
+ # scan in steam interface files
+ underlying_type = next([typedef for file in self.files for typedef in file["typedefs"]], None)
+
+ if underlying_type.name not in g_PrimitiveTypesLayout.keys():
+ return resolveFinalType(underlying_type)
+ else:
+ return underlying_type
+
+ underlying_type = resolveFinalType(typee)
+
+ if underlying_type == None and '*' not in typee:
+ print(f"[WARNING] typedef \"{typedef.name}\"'s underlying type \"{typee}\" is not in primitive list")
+ # is pointer
+ elif '*' in typee:
+ size = 'intptr'
+ pack = 'intptr'
+ else:
+ size = underlying_type.size
+ pack = underlying_type.pack
+
+ typedef.size = size
+ typedef.pack = pack
+
+ def parse_constants(self, s):
+ if s.linesplit[0] != "const" and not s.line.startswith("static const"):
+ return
+
+ if s.scopeDepth > 1:
+ return
+
+ comments = self.consume_comments(s)
+
+ # Currently skips one unfortunate function definition where the first arg on the new line starts with const. Like so:
+ # void func(void arg1,
+ # const arg2) = 0;
+ if "=" not in s.linesplit:
+ return
+
+ result = re.match(r".*const\s+(.*)\s+(\w+)\s+=\s+(.*);$", s.line)
+
+ if not result:
+ return
+
+ constant = Constant(result.group(2), result.group(3), result.group(1), comments);
+ s.f.constants.append(constant)
+
+ def parse_enums(self, s: ParserState):
+ if s.enum:
+ if s.line == "{":
+ return
+
+ if (s.line.endswith("};") or re.match(r"^}\s*[\w_]*;$", s.line)) and (len(s.complexTypeStack) == 0 or s.complexTypeStack[-1] == 'enum'):
+ # Hack to get comments between the last field and }; :(
+ s.enum.endcomments = self.consume_comments(s)
+ # Don't append unnamed (constant) enums
+ if s.enum.name is not None:
+ s.f.enums.append(s.enum)
+
+ s.endComplexType()
+ s.enum = None
+ return
+
+ self.parse_enumfields(s)
+ return
+
+ if s.linesplit[0] != "enum":
+ return
+
+ comments = self.consume_comments(s)
+
+ # Actually a constant like: enum { k_name = value };
+ if "};" in s.linesplit:
+ # Skips lines like: "enum { k_name1 = value, k_name2 = value };"
+ # Currently only skips one enum in CCallbackBase
+ #
+ # Also steamnetworkingtypes.h has
+ # two different anon enum defined same named field,
+ # broke our project. Skip it.
+ if "," in s.line or s.f.name == 'steamnetworkingtypes.h':
+ return
+
+ # Skips lines in macros
+ # Currently only skips one enum in DEFINE_CALLBACK
+ if s.linesplit[-1] == "\\":
+ return
+
+ if s.struct:
+ # not to push complex type stack here, since it's single line only
+ result = re.match("^enum { (.*) = (.*) };", s.line)
+ name = result.group(1)
+
+ if name == "k_iCallback":
+ s.callbackid = result.group(2)
+ return
+
+ constant = Constant(s.linesplit[2], s.linesplit[4], "int", comments);
+ s.f.constants.append(constant)
+ return
+
+ if len(s.linesplit) == 1 or (len(s.linesplit) >= 2 and '{' == s.linesplit[1]):
+ s.beginEnum()
+ s.enum = Enum(None, comments)
+ # unnamed Constants like:
+ '''enum {
+ k_name1 = value,
+ k_name2 = value,
+ };'''
+ return
+
+ s.beginEnum()
+ s.enum = Enum(s.linesplit[1], comments)
+
+ def parse_enumfields(self, s):
+ result = re.match(r"^(\w+,?)([ \t]*)=?([ \t]*)(.*)$", s.line)
+ comments = self.consume_comments(s)
+
+ # HACK: This is a hack for multiline fields :(
+ if s.line.endswith("="):
+ value = "="
+ else:
+ value = result.group(4)
+
+ # Nameless Enums are actually just constants
+ if s.enum.name is None:
+ if s.enum.c:
+ comments.precomments = s.enum.c.precomments
+ s.enum.c = None
+ constant = Constant(result.group(1), value.rstrip(","), "int", comments)
+ s.f.constants.append(constant)
+ return
+
+ field = EnumField()
+ field.name = result.group(1)
+
+ if value:
+ field.prespacing = result.group(2)
+ field.postspacing = result.group(3)
+ field.value = value
+
+ field.c = comments
+ s.enum.fields.append(field)
+
+ def parse_structs(self, s: ParserState):
+ if s.enum or s.isSkipBlock() or s.currentSpecialStruct:
+ return
+
+ if s.struct and s.linesplit[0] != "struct":
+ if (s.line == "};" or re.match(r"^}\s*[\w_]*;$", s.line)) and (len(s.complexTypeStack) == 0 or s.complexTypeStack[-1] == 'struct'):
+ if s.struct.name in g_ClassSpecialRBracket:
+ special = g_ClassSpecialRBracket[s.struct.name]
+ if special.lineZeroBased == s.line and special.action == 'ContniueStruct':
+ return
+
+ s.struct.endcomments = self.consume_comments(s)
+
+ if s.callbackid:
+ s.struct.callbackid = s.callbackid
+ s.f.callbacks.append(s.struct)
+ s.callbackid = None
+ else:
+ if isinstance(s.struct, Struct):
+ s.f.structs.append(s.struct)
+ elif isinstance(s.struct, Union):
+ return
+ else:
+ printUnhandled("unknown ComplexType appears in s.struct", s)
+
+ s.isClassLikeStruct = None
+ s.endComplexType()
+
+ currentStruct: Struct = s.struct
+
+ # restore current struct in parser state to outer struct
+ if len(s.complexTypeStack) >= 2 and s.complexTypeStack[-2] == 'struct':
+ currentStruct.outer_type.nested_struct.append(currentStruct)
+
+ if s.struct.name in g_SpecialStructs:
+ s.struct.packsize_aware = False # HACK hope so
+
+
+ outertype = currentStruct.outer_type
+ if isinstance(outertype, Struct):
+ s.struct = outertype
+ s.union = None
+ elif isinstance(outertype, Union):
+ s.union = outertype
+ s.struct = None
+ else:
+ s.struct = None
+ s.union = None
+
+ else:
+ self.parse_complextype_fields(s)
+ else:
+ if s.linesplit[0] != "struct":
+ return
+
+
+
+ if len(s.linesplit) > 1 and s.linesplit[1].startswith("ISteam"):
+ return
+
+ # Skip Forward Declares
+ if s.linesplit[1].endswith(";"):
+ return
+
+ # special structs
+ typeNameCandidate = s.linesplit[1]
+ if typeNameCandidate in g_SpecialStructs.keys():
+ if s.linesplit[0] == 'struct':
+ s.currentSpecialStruct = g_SpecialStructs[typeNameCandidate]
+
+ self.parse_scope(s)
+
+ if s.line.startswith('}'):
+ varNameMatchResult = re.match(r"^}\s*(\w*);$", s.line)
+ if varNameMatchResult != None:
+ s.struct.outer_type.fields.append(StructField(varNameMatchResult.group(1), typeNameCandidate, None, ""))
+
+ s.currentSpecialStruct = None
+ return
+
+ s.beginStruct()
+
+ if s.linesplit[0] == "class":
+ s.isClassLikeStruct = True
+ else:
+ s.isClassLikeStruct = False
+
+ comments = self.consume_comments(s)
+
+ outerTypeCandidate = s.struct or s.union
+ s.struct = Struct(s.linesplit[1].strip(), s.getCurrentPack(),\
+ comments, s.scopeDepth)
+ s.struct.outer_type = outerTypeCandidate
+ if s.linesplit[1].strip() in g_SkippedStructs:
+ s.struct.is_skipped = True
+
+ def visit_inline_method(self, s: ParserState):
+ pass
+
+ def parse_complextype_fields(self, s: ParserState):
+ if s.struct and s.isSkipBlock() or s.currentSpecialStruct:
+ return
+
+ comments = self.consume_comments(s)
+
+ if s.line.startswith("enum"):
+ return
+
+ if s.line.startswith('friend '): # in classes
+ return
+
+ if s.line == "{":
+ return
+
+ def try_match(line, s: ParserState):
+ if ':' in line and s.struct:
+ # Contains bitfield that can't be represented
+ printWarning(f"{s.struct.name} contains bitfield, skipping", s)
+ self.parse_scope(s)
+ return
+
+ typeinfo = s.struct if s.struct else s.union
+
+ fieldarraysizeText = None
+
+ result = re.match(r"^(?!\s*(?:typedef|struct|union|enum|return)\b)([^=.]*\s\**)(\w+);$", line)
+ if result is None:
+ result = re.match(r"^(.*\s\*?)(\w+)\[\s*(\w+)?\s*\];$", line)
+ if result is not None:
+ fieldarraysizeText = result.group(3)
+ else:
+ return
+
+ fieldtype = result.group(1).rstrip()
+ fieldname = result.group(2)
+
+ # ignore wrongly parsed result
+ # for example {type 'void' name: '(int a0, int a1)'
+ if '(' in fieldname or '(' in fieldtype\
+ or ')' in fieldname or ')' in fieldtype\
+ or '*' in fieldname\
+ or '{' in fieldtype or '}' in fieldtype\
+ or '{' in fieldname or '}' in fieldname:
+ return
+
+
+ newField = StructField(fieldname, fieldtype, fieldarraysizeText, comments)
+ typeinfo.fields.append(newField)
+
+ if ',' in s.line:
+ result = re.match(r"^(\s*\w+)\s*([\w,\s\[$*\d]*);$", s.line)
+ if not result: return
+
+
+ mainType = result.group(1).strip()
+ varNames = result.group(2).split(',')
+
+ for varName in varNames:
+ try_match(f"{mainType} {varName};", s)
+ else:
+ try_match(s.line, s)
+
+ def visit_union(self, s: ParserState):
+ if s.enum or s.isSkipBlock():
+ return
+
+ if s.union and s.linesplit[0] != "union":
+ if s.line == "{":
+ # some unions put open brace at next line
+ return
+
+ if (s.line == "};" or re.match(r"^}\s*[\w_]*;$", s.line)) and (len(s.complexTypeStack) == 0 or s.complexTypeStack[-1] == 'union'):
+ s.union.endcomments = self.consume_comments(s)
+ s.f.unions.append(s.union)
+ s.endComplexType()
+ s.union = None
+ else:
+ self.parse_complextype_fields(s)
+ pass
+ elif s.union == None:
+ if s.linesplit[0] != "union":
+ return
+
+ # Skip Forward Declares
+ if len(s.linesplit) >= 2 and s.linesplit[1].endswith(";"):
+ return
+
+ s.beginUnion()
+ typeName = None
+ # varName = None
+ isUnnamed = True
+
+ if s.linesplit[0] == 'union':
+ if len(s.linesplit) > 2:
+ typeName = s.linesplit[1]
+ isUnnamed = False
+ else:
+ typeName = f"union__{s.f.name[:-2]}_{s.linenum + 1}"
+
+ s.union = Union(typeName, isUnnamed, s.packsize)
+ if s.union.outer_type:
+ # just ignore it's name, generate one for it
+ s.union.outer_type.fields.append(StructField(f"unnamed_field_{typeName}", typeName, 1, ""))
+
+
+ pass
+
+ def parse_callbackmacros(self, s: ParserState):
+ if s.callbackmacro:
+ comments = self.consume_comments(s)
+ if s.line.startswith("STEAM_CALLBACK_END("):
+ s.f.callbacks.append(s.callbackmacro)
+ s.callbackmacro = None
+ elif s.line.startswith("STEAM_CALLBACK_MEMBER_ARRAY"):
+ result = re.match(r"^STEAM_CALLBACK_MEMBER_ARRAY\(.*,\s+(.*?)\s*,\s*(\w*)\s*,\s*(\d*)\s*\)", s.line)
+
+ fieldtype = result.group(1)
+ fieldname = result.group(2)
+ fieldarraysize = result.group(3)
+
+ s.callbackmacro.fields.append(StructField(fieldname, fieldtype, fieldarraysize, comments))
+ elif s.line.startswith("STEAM_CALLBACK_MEMBER"):
+ result = re.match(r"^STEAM_CALLBACK_MEMBER\(.*,\s+(.*?)\s*,\s*(\w*)\[?(\d+)?\]?\s*\)", s.line)
+
+ fieldtype = result.group(1)
+ fieldname = result.group(2)
+ fieldarraysize = result.group(3)
+
+ s.callbackmacro.fields.append(StructField(fieldname, fieldtype, fieldarraysize, comments))
+
+ else:
+ printWarning("Unexpected line in Callback Macro")
+
+ return
+
+ if not s.line.startswith("STEAM_CALLBACK_BEGIN"):
+ return
+
+ comments = self.consume_comments(s)
+
+ result = re.match(r"^STEAM_CALLBACK_BEGIN\(\s?(\w+),\s?(.*?)\s*\)", s.line)
+
+ s.callbackmacro = Struct(result.group(1), s.getCurrentPack(), comments, s.scopeDepth)
+ s.callbackmacro.callbackid = result.group(2)
+
+ def parse_interfaces(self, s):
+ if s.line.startswith("class ISteam"):
+ comments = self.consume_comments(s)
+ if s.linesplit[1].endswith(';') or s.linesplit[1].endswith("Response"): # Ignore Forward Declares and Matchmaking Responses
+ return
+
+ s.interface = Interface()
+ s.interface.name = s.linesplit[1]
+ s.interface.c = comments
+
+ if s.interface:
+ self.parse_interface_functions(s)
+
+ def parse_interface_function_atrributes(self, s):
+ for a in g_FuncAttribs:
+ if s.line.startswith(a):
+ attr = FunctionAttribute()
+ attr.name = s.line[:s.line.index("(")]
+ attr.value = s.line[s.line.index("(")+1:s.line.rindex(")")].strip()
+ s.functionAttributes.append(attr)
+
+ def parse_interface_functions(self, s):
+ self.parse_interface_function_atrributes(s)
+
+ if s.line.startswith("STEAM_PRIVATE_API"):
+ s.bInPrivate = True
+ s.line = s.line[s.line.index("(")+1:].strip()
+ s.linesplit = s.linesplit[1:]
+
+ bInPrivate = s.bInPrivate
+ if s.bInPrivate:
+ if s.line.endswith(")"):
+ s.bInPrivate = False
+ s.line = s.line[:-1].strip()
+ s.linesplit = s.linesplit[:-1]
+
+
+ # Skip lines that don't start with virtual, except when we're currently parsing a function
+ if not s.function and not (s.line.startswith("virtual") or s.line.startswith("inline")):
+ return
+
+ if '~' in s.line: # Skip destructor
+ return
+
+ args = ""
+ attr = None
+ if s.function == None:
+ s.function = Function()
+ if len(s.ifstatements) > 1:
+ s.function.ifstatements = s.ifstatements[-1]
+ s.function.comments = s.comments
+ s.function.linecomment = s.linecomment
+ s.function.private = bInPrivate
+ s.function.attributes = s.functionAttributes
+ s.functionAttributes = []
+ self.consume_comments(s)
+
+ linesplit_iter = iter(enumerate(s.linesplit))
+ for i, token in linesplit_iter:
+ if s.funcState == 0: # Return Value
+ if token == "virtual" or token == "inline":
+ continue
+
+ if token.startswith("*"):
+ s.function.returntype += "*"
+ token = token[1:]
+ s.funcState = 1
+ elif "(" in token:
+ s.function.returntype = s.function.returntype.strip()
+ s.funcState = 1
+ else:
+ s.function.returntype += token + " "
+ continue
+
+ if s.funcState == 1: # Method Name
+ s.function.name = token.split("(", 1)[0]
+
+ if token[-1] == ")":
+ s.funcState = 3
+ elif token[-1] == ";":
+ s.funcState = 0
+ s.interface.functions.append(s.function)
+ s.function = None
+ break
+ elif token[-1] != "(": # Like f(void arg )
+ if Settings.warn_spacing:
+ printWarning("Function is missing whitespace between the opening parentheses and first arg.", s)
+ token = token.split("(")[1]
+ s.funcState = 2
+ else:
+ s.funcState = 2
+ continue
+
+ if s.funcState == 2: # Args
+ # Strip clang attributes
+ bIsAttrib = False
+ for a in g_ArgAttribs:
+ if token.startswith(a):
+ attr = ArgAttribute()
+ bIsAttrib = True
+ break
+ if bIsAttrib:
+ openparen_index = token.index("(")
+ attr.name = token[:openparen_index]
+ if len(token) > openparen_index+1:
+ if token.endswith(")"):
+ attr.value = token[openparen_index+1:-1]
+ continue
+ else:
+ attr.value = token[openparen_index+1:]
+ s.funcState = 4
+ continue
+
+ if token.startswith("**"):
+ args += token[:2]
+ token = token[2:]
+ elif token.startswith("*") or token.startswith("&"):
+ args += token[0]
+ token = token[1:]
+
+ if len(token) == 0:
+ continue
+
+ if token.startswith(")"): # Like f( void arg ")"
+ if args:
+ TEST = 1
+ TEST2 = 0 # TODO: Cleanup, I don't even know what the fuck is going on here anymore.
+ if "**" in s.linesplit[i-1]:
+ TEST -= 2
+ TEST2 += 2
+ elif "*" in s.linesplit[i-1] or "&" in s.linesplit[i-1]:
+ TEST -= 1
+ TEST2 += 1
+
+ arg = Arg()
+ arg.type = args[:-len(s.linesplit[i-1]) - TEST].strip()
+ arg.name = s.linesplit[i-1][TEST2:]
+ arg.attribute = attr
+ s.function.args.append(arg)
+ args = ""
+ attr = None
+ s.funcState = 3
+ elif token.endswith(")"): # Like f( void "arg)"
+ if Settings.warn_spacing:
+ printWarning("Function is missing whitespace between the closing parentheses and first arg.", s)
+
+ arg = Arg()
+ arg.type = args.strip()
+ arg.name = token[:-1]
+ arg.attribute = attr
+ s.function.args.append(arg)
+ args = ""
+ attr = None
+ s.funcState = 3
+ elif token[-1] == ",": # Like f( void "arg," void arg2 )
+ TEST2 = 0
+ if "*" in token[:-1] or "&" in token[:-1]:
+ TEST2 += 1
+
+ arg = Arg()
+ arg.type = args.strip()
+ arg.name = token[:-1][TEST2:]
+ arg.attribute = attr
+ s.function.args.append(arg)
+ args = ""
+ attr = None
+ elif token == "=":
+ # Copied from ")" above
+ TEST = 1
+ TEST2 = 0 # TODO: Cleanup, I don't even know what the fuck is going on here anymore.
+ if "*" in s.linesplit[i-1] or "&" in s.linesplit[i-1]:
+ TEST -= 1
+ TEST2 += 1
+
+ arg = Arg()
+ arg.type = args[:-len(s.linesplit[i-1]) - TEST].strip()
+ arg.name = s.linesplit[i-1][TEST2:]
+ arg.default = s.linesplit[i+1].rstrip(",")
+ arg.attribute = attr
+ s.function.args.append(arg)
+ args = ""
+ attr = None
+ next(linesplit_iter, None)
+ else:
+ args += token + " "
+
+ continue
+
+ if s.funcState == 3: # = 0; or line
+ if token.endswith(";"):
+ s.funcState = 0
+ s.interface.functions.append(s.function)
+ s.function = None
+ break
+ continue
+
+ if s.funcState == 4: # ATTRIBS
+ if token.endswith(")"):
+ attr.value += token[:-1]
+ s.funcState = 2
+ else:
+ attr.value += token
+ continue
+
+ def parse_classes(self, s: ParserState):
+ if s.linesplit[0] != "class":
+ return
+
+ if s.line.startswith("class ISteam"):
+ return
+
+ self.consume_comments(s)
+
+ def parse_scope(self, s):
+ if "{" in s.line:
+ s.scopeDepth += 1
+
+ if s.line.count("{") > 1:
+ printWarning("Multiple occurences of '{'", s)
+
+ if "}" in s.line:
+ s.scopeDepth -= 1
+
+ if s.interface and s.scopeDepth == 0:
+ s.f.interfaces.append(s.interface)
+ s.interface = None
+
+ if s.scopeDepth < 0:
+ printWarning("scopeDepth is less than 0!", s)
+
+ if s.line.count("}") > 1:
+ printWarning("Multiple occurences of '}'", s)
+
+ def consume_comments(self, s):
+ c = Comment(s.rawcomments, s.comments, s.rawlinecomment, s.linecomment)
+ s.rawcomments = []
+ s.comments = []
+ s.rawlinecomment = None
+ s.linecomment = None
+ return c
+
+ # I initially choose camel case by my habit, but keep this name here
+ # for hinting it this is an external available API is also useful
+ def resolveTypeInfo(self, typeName):
+ # search order: primitive, pointer, enum, typedef, struct. no callbacks
+ result = g_PrimitiveTypesLayout.get(typeName)
+
+ if not result and '*' in typeName:
+ return g_PrimitiveTypesLayout["intptr"]
+
+ if not result:
+ result = g_SpecialStructs.get(typeName)
+
+ if not result:
+ result = next((typedef for typedef in self.typedefs if typedef.name == typeName), None)
+
+ if not result:
+ # see enums
+ allEnums = reduce(operator.concat, [f.enums for f in self.files ])
+ result = next((enum for enum in allEnums if enum.name == typeName), None)
+ if not result:
+ # see structs or callback structs
+ allstructs = reduce(operator.concat, [f.structs for f in self.files ])
+ allcallbacks = reduce(operator.concat, [f.callbacks for f in self.files])
+
+ allstructs = allstructs + allcallbacks
+
+ result = next((struct for struct in allstructs if struct.name == typeName), None)
+
+ if not result:
+ print(f"[WARNING] typename {typeName} not found across primitive, struct and typedef, maybe it is a nested type.")
+
+ return result
+
+ def resolveConstValue(self, name) -> Constant:
+ for f in self.files:
+ result = next((constant for constant in f.constants if constant.name == name), None)
+ if result is not None:
+ return result
+
+ return None
+
+
+ def populate_union_sizes(self, defaultPack = 8):
+ for file in self.files:
+ unions = file.unions
+ for union in unions:
+ union.calculate_offsets(defaultPack)
+
+ def populate_struct_field_layout(self, struct: Struct, defaultPack = 8):
+ for field in struct.fields:
+ typeinfo = self.resolveTypeInfo(field.type)
+
+ if typeinfo is None:
+ # this usually means typedef is used inside a class,
+ # but reminder we treat classes as struct
+ self.ignoredStructs.append(struct)
+ return []
+
+ # check if we facing a struct which may not populated yet
+ if isinstance(typeinfo, Struct):
+ # we assume there will no circular references across structs
+ if not typeinfo.size:
+ self.populate_struct_field_layout(typeinfo, defaultPack)
+ typeinfo.calculate_offsets(defaultPack)
+
+ field.size = typeinfo.size
+ field.pack = typeinfo.pack or struct.pack or defaultPack
+ if (field.arraysizeStr is not None):
+ arrsize = field.arraysizeStr
+ field.arraysize = int(arrsize) if arrsize.isdigit() else eval(self.resolveConstValue(arrsize).value, {}, )
+
+ struct.calculate_offsets(defaultPack)
+
+
+ def findout_platform_aware_structs(self):
+ self.packSizeAwareStructs: list[str] = []
+ self.populate_typedef_layouts()
+
+ for file in self.files:
+ structs: list[Struct] = []
+ structs.extend(file.callbacks)
+ structs.extend(file.structs)
+
+ for struct in structs:
+ if struct.is_sequential:
+ print_debug(f"Struct {struct.name} is aligns by platform ABI default, means sequential")
+ continue
+
+ self.populate_struct_field_layout(struct, 8)
+ offsetsLargePack: list[FieldOffset] = struct.calculate_offsets(8)
+ offsetsLargePack.sort(key = lambda item: item.name)
+ sizeLarge = struct.size
+
+ self.populate_struct_field_layout(struct, 4)
+ offsetsSmallPack: list[FieldOffset] = struct.calculate_offsets(4)
+ offsetsSmallPack.sort(key = lambda item: item.name)
+ sizeSmall = struct.size
+
+ if offsetsLargePack != offsetsSmallPack or sizeLarge != sizeSmall:
+ print_debug(f"Found packsize aware struct '{struct.name}'")
+ struct.packsize_aware = True
+ self.packSizeAwareStructs.append(struct.name)
+
+ pass
+
+def print_debug(string: str):
+ if Settings.print_debug:
+ print(f"[DEBUG][PostParse] {string}")
+
+def printWarning(string, s):
+ print("[WARNING] " + string + " - In File: " + s.f.name + " - On Line " + str(s.linenum) + " - " + s.line)
+
+
+def printUnhandled(string, s):
+ print("[UNHANDLED] " + string + " - In File: " + s.f.name + " - On Line " + str(s.linenum) + " - " + s.line)
+
+
+def parse(folder):
+ """Parses the Steamworks headers contained in a folder"""
+ return Parser(folder)
diff --git a/CodeGen/SteamworksParser/test_pack_size.py b/CodeGen/SteamworksParser/test_pack_size.py
new file mode 100644
index 00000000..4c8955a1
--- /dev/null
+++ b/CodeGen/SteamworksParser/test_pack_size.py
@@ -0,0 +1,71 @@
+from types import SimpleNamespace
+from steamworksparser import Struct, StructField, parse, Settings
+import os
+import json
+import itertools
+# Settings.print_skippedtypedefs = True
+# Settings.print_unuseddefines = True
+# Settings.warn_spacing = True
+# Settings.print_debug = True
+
+filepath1 = "./bin/packsize-aware-list.aggressive.txt"
+filepath2 = "./bin/packsize-aware-list.conservative.txt"
+
+special_structs = []
+special_structs_conservative = []
+
+# read size-different based special struct
+with open(filepath1, 'r') as f:
+ special_structs = [line.strip() for line in f if line.strip()]
+
+# any differences in struct info will be a special struct, which called conservative
+with open(filepath2, 'r') as f:
+ special_structs_conservative = [line.strip() for line in f if line.strip()]
+
+parser = parse("./steamtest") # put steam headers inside
+
+mismatchCallbackDiagnostics:list[tuple[int, str, str, str]] = [] # (callbackid, name, message, code)
+matchStructs: list[str] = []
+mismatchStructs: list[str] = []
+
+
+for structName in parser.packSizeAwareStructs:
+ special = False
+ specialConservative = False
+ typeinfo: Struct = parser.resolveTypeInfo(structName)
+ if structName in special_structs:
+ special = True
+ special_structs.remove(structName)
+ if structName in special_structs_conservative:
+ specialConservative = True
+ special_structs_conservative.remove(structName)
+
+ if not special and not specialConservative:
+ mismatchStructs.append(structName)
+ diagRecord = (typeinfo.callbackid, structName, f"{structName} is absolutely not a special marshalling struct", "W1")
+ mismatchCallbackDiagnostics.append(diagRecord)
+ continue
+
+ if specialConservative and not special:
+ diagRecord = (typeinfo.callbackid, structName, f"{structName} might be a special marshalling struct by align issues", "W2")
+ mismatchCallbackDiagnostics.append(diagRecord)
+
+ if special:
+ matchStructs.append(structName)
+
+for missingCriticialStruct in special_structs:
+ typeinfo: Struct = parser.resolveTypeInfo(missingCriticialStruct)
+ diagRecord = (typeinfo.callbackid, missingCriticialStruct, f"Critical special marshalling struct {missingCriticialStruct} is missing", "E3")
+ mismatchCallbackDiagnostics.append(diagRecord)
+
+for missingOptionalStruct in special_structs:
+ typeinfo: Struct = parser.resolveTypeInfo(missingOptionalStruct)
+ diagRecord = (typeinfo.callbackid, missingOptionalStruct, f"{structName} might be a special marshalling struct by align issues", "W2")
+ mismatchCallbackDiagnostics.append(diagRecord)
+
+with open("./bin/struct_test_result.txt", "w") as f:
+ for diag in mismatchCallbackDiagnostics:
+ fallbackStr = "None"
+ formatted = f"{diag[3]}: {diag[2]}\n\tname: {diag[1]}, cbid(optional): {diag[0] or fallbackStr}\n"
+ print(formatted)
+ f.write(formatted)
diff --git a/CodeGen/src/interfaces.py b/CodeGen/src/interfaces.py
index 856a6193..e66d0384 100644
--- a/CodeGen/src/interfaces.py
+++ b/CodeGen/src/interfaces.py
@@ -1,7 +1,9 @@
import os
+import re
import sys
from collections import OrderedDict
from SteamworksParser import steamworksparser
+from SteamworksParser.steamworksparser import Arg, Function, FunctionAttribute, Interface, Parser, Struct, ArgAttribute
g_SkippedFiles = (
# We don't currently support the following interfaces because they don't provide a factory of their own.
@@ -532,38 +534,38 @@
g_FixedAttributeValues = {
"ISteamInventory_GetItemsWithPrices": {
- "pArrayItemDefs": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
- "pCurrentPrices": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
- "pBasePrices": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pArrayItemDefs": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pCurrentPrices": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pBasePrices": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
},
"ISteamGameServerInventory_GetItemsWithPrices": {
- "pArrayItemDefs": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
- "pCurrentPrices": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
- "pBasePrices": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pArrayItemDefs": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pCurrentPrices": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
+ "pBasePrices": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "unArrayLength"),
},
"ISteamUGC_GetQueryUGCContentDescriptors": {
- "pvecDescriptors": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "cMaxEntries"),
+ "pvecDescriptors": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "cMaxEntries"),
},
"ISteamGameServerUGC_GetQueryUGCContentDescriptors": {
- "pvecDescriptors": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "cMaxEntries"),
+ "pvecDescriptors": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "cMaxEntries"),
},
"ISteamNetworkingMessages_ReceiveMessagesOnChannel": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
"ISteamGameServerNetworkingMessages_ReceiveMessagesOnChannel": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
"ISteamNetworkingSockets_ReceiveMessagesOnConnection": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
"ISteamGameServerNetworkingSockets_ReceiveMessagesOnConnection": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
"ISteamNetworkingSockets_ReceiveMessagesOnPollGroup": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
"ISteamGameServerNetworkingSockets_ReceiveMessagesOnPollGroup": {
- "ppOutMessages": steamworksparser.ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
+ "ppOutMessages": ArgAttribute("STEAM_OUT_ARRAY_COUNT", "nMaxMessages"),
},
}
@@ -597,24 +599,24 @@
g_Output = []
g_Typedefs = None
-def main(parser):
+def main(parser: Parser):
try:
os.makedirs("../com.rlabrecque.steamworks.net/Runtime/autogen/")
except OSError:
pass
- with open("templates/header.txt", "r") as f:
+ with open("templates/header.txt", "r", encoding="utf-8") as f:
global HEADER
HEADER = f.read()
global g_Typedefs
g_Typedefs = parser.typedefs
for f in parser.files:
- parse(f)
+ parse(f, parser)
with open("../com.rlabrecque.steamworks.net/Runtime/autogen/NativeMethods.cs", "wb") as out:
#out.write(bytes(HEADER, "utf-8"))
- with open("templates/nativemethods.txt", "r") as f:
+ with open("templates/nativemethods.txt", "r", encoding="utf-8") as f:
out.write(bytes(f.read(), "utf-8"))
for line in g_NativeMethods:
out.write(bytes(line + "\n", "utf-8"))
@@ -625,7 +627,7 @@ def main(parser):
def get_arg_attribute(strEntryPoint, arg):
return g_FixedAttributeValues.get(strEntryPoint, dict()).get(arg.name, arg.attribute)
-def parse(f):
+def parse(f, parser: Parser):
if f.name in g_SkippedFiles:
return
@@ -633,7 +635,7 @@ def parse(f):
del g_Output[:]
for interface in f.interfaces:
- parse_interface(f, interface)
+ parse_interface(f, interface, parser)
if g_Output:
with open('../com.rlabrecque.steamworks.net/Runtime/autogen/' + os.path.splitext(f.name)[0] + '.cs', 'wb') as out:
@@ -645,7 +647,7 @@ def parse(f):
out.write(bytes("#endif // !DISABLESTEAMWORKS\n", "utf-8"))
-def parse_interface(f, interface):
+def parse_interface(f, interface: Interface, parser: Parser):
if interface.name in g_SkippedInterfaces:
return
@@ -686,7 +688,17 @@ def parse_interface(f, interface):
if func.private:
continue
- parse_func(f, interface, func)
+ strEntryPoint = interface.name + '_' + func.name
+ for attr in func.attributes:
+ if attr.name == "STEAM_FLAT_NAME":
+ strEntryPoint = interface.name + '_' + attr.value
+ break
+
+ parsed_args = parse_args(strEntryPoint, func.args, None, parser)
+ parse_func_native(f, interface, func, strEntryPoint, parsed_args, False, bGameServerVersion, parser)
+
+ generate_wrapper_function(f, interface, func, parsed_args, strEntryPoint, bGameServerVersion, parser)
+
# Remove last whitespace
if not bGameServerVersion:
@@ -705,19 +717,7 @@ def parse_interface(f, interface):
g_Output.append("\t}")
-def parse_func(f, interface, func):
- strEntryPoint = interface.name + '_' + func.name
-
- for attr in func.attributes:
- if attr.name == "STEAM_FLAT_NAME":
- strEntryPoint = interface.name + '_' + attr.value
- break
-
- if "GameServer" in interface.name and interface.name != "ISteamGameServer" and interface.name != "ISteamGameServerStats":
- bGameServerVersion = True
- else:
- bGameServerVersion = False
-
+def parse_func_native(f, interface, func: Function, strEntryPoint: str, args, generatingLargePack: bool, bGameServerVersion: bool, parser: Parser):
wrapperreturntype = None
strCast = ""
returntype = func.returntype
@@ -735,15 +735,9 @@ def parse_func(f, interface, func):
if wrapperreturntype == None:
wrapperreturntype = returntype
- args = parse_args(strEntryPoint, func.args)
pinvokeargs = args[0] # TODO: NamedTuple
- wrapperargs = args[1]
- argnames = args[2]
- stringargs = args[3]
- outstringargs = args[4][0]
- outstringsize = args[4][1]
- args_with_explicit_count = args[5]
-
+ isPacksizeAware = args[6]
+ largePackPInvokeArgs = args[9]
if not bGameServerVersion:
g_NativeMethods.append("\t\t[DllImport(NativeLibraryName, EntryPoint = \"SteamAPI_{0}\", CallingConvention = CallingConvention.Cdecl)]".format(strEntryPoint))
@@ -753,6 +747,48 @@ def parse_func(f, interface, func):
g_NativeMethods.append("\t\tpublic static extern {0} {1}({2});".format(returntype, strEntryPoint, pinvokeargs))
g_NativeMethods.append("")
+ if isPacksizeAware:
+ g_NativeMethods.append("\t#if STEAMWORKS_ANYCPU")
+ g_NativeMethods.append("\t\t[DllImport(NativeLibraryName, EntryPoint = \"SteamAPI_{0}\", CallingConvention = CallingConvention.Cdecl)]".format(strEntryPoint))
+
+ if returntype == "bool":
+ g_NativeMethods.append("\t\t[return: MarshalAs(UnmanagedType.I1)]")
+
+ g_NativeMethods.append("\t\tpublic static extern {0} {1}({2});".format(returntype, strEntryPoint, largePackPInvokeArgs))
+ g_NativeMethods.append("\t#endif")
+ g_NativeMethods.append("")
+ pass
+
+def generate_wrapper_function(f, interface, func: Function,
+ args: tuple[str, str, str, list[str], tuple[list[str], list[Arg]], OrderedDict, str, bool, str],
+ strEntryPoint: str, bGameServerVersion: bool, _):
+ wrapperargs = args[1]
+ argnames = args[2]
+ stringargs = args[3]
+ outstringargs = args[4][0]
+ outstringsize = args[4][1]
+ args_with_explicit_count = args[5]
+ isPacksizeAware = args[6]
+ largePackNativeArgs: str = args[7]
+ largePackByrefArgs: list[(str, str, bool)] = args[8] # (typeName, argName, shouldAssignInput)
+
+ strCast = ""
+ wrapperreturntype = None
+ returntype = func.returntype
+ returntype = g_SpecialReturnTypeDict.get(strEntryPoint, returntype)
+ for t in g_Typedefs:
+ if t.name == returntype:
+ if t.name not in g_SkippedTypedefs:
+ wrapperreturntype = returntype
+ strCast = "(" + returntype + ")"
+ returntype = t.type
+ break
+ returntype = g_TypeDict.get(returntype, returntype)
+ returntype = g_TypeDict.get(func.returntype, returntype)
+ returntype = g_ReturnTypeDict.get(func.returntype, returntype)
+ if wrapperreturntype == None:
+ wrapperreturntype = returntype
+
functionBody = []
if 'GameServer' in interface.name:
@@ -786,36 +822,89 @@ def parse_func(f, interface, func):
if returntype != "void":
strReturnable = returntype + " ret = "
- for i, a in enumerate(outstringargs):
+ for i, argName in enumerate(outstringargs):
if not outstringsize:
- functionBody.append("\t\t\tIntPtr " + a + "2;")
+ functionBody.append("\t\t\tIntPtr " + argName + "2;")
continue
cast = ""
if outstringsize[i].type != "int":
cast = "(int)"
- functionBody.append("\t\t\tIntPtr " + a + "2 = Marshal.AllocHGlobal(" + cast + outstringsize[i].name + ");")
+ functionBody.append("\t\t\tIntPtr " + argName + "2 = Marshal.AllocHGlobal(" + cast + outstringsize[i].name + ");")
+ # TODO fix `ISteamGameServerClient_CreateSteamPipe`
indentlevel = "\t\t\t"
if stringargs:
indentlevel += "\t"
- for a in stringargs:
- functionBody.append("\t\t\tusing (var " + a + "2 = new InteropHelp.UTF8StringHandle(" + a + "))")
+ for argName in stringargs:
+ functionBody.append("\t\t\tusing (var " + argName + "2 = new InteropHelp.UTF8StringHandle(" + argName + "))")
functionBody[-1] += " {"
if bGameServerVersion:
- strEntryPoint2 = interface.name.replace("GameServer", "") + '_' + func.name
+ invokingNativeFunctionName = interface.name.replace("GameServer", "") + '_' + func.name
for attr in func.attributes:
if attr.name == "STEAM_FLAT_NAME":
- strEntryPoint2 = interface.name.replace("GameServer", "") + '_' + attr.value
+ invokingNativeFunctionName = interface.name.replace("GameServer", "") + '_' + attr.value
break
else:
- strEntryPoint2 = strEntryPoint
+ invokingNativeFunctionName = strEntryPoint
+
+ if not isPacksizeAware:
+ functionBody.append("{0}{1}{2}NativeMethods.{3}({4});".format(
+ indentlevel, strReturnable, strCast,
+ invokingNativeFunctionName, argnames))
+ else:
+ b:list[str] = []
+
+ b.append("#if STEAMWORKS_ANYCPU")
+ if returntype != "void":
+ b.append(f"{wrapperreturntype} ret;")
+
+ invocationTemplate = "{0}{1}{2}NativeMethods.{3}({4});"
+ prebuiltInvocationExpression = invocationTemplate.format(
+ "", "" if returntype == "void" else "ret = ", strCast,
+ invokingNativeFunctionName, argnames)
+
+ prebuiltInvocationExpressionLargePack = invocationTemplate.format(
+ "", "" if returntype == "void" else "ret = ", strCast,
+ invokingNativeFunctionName, largePackNativeArgs
+ )
+
+ # b.append(f"{returntype} anyCpuResult;")
+ b.append("if (!Packsize.IsLargePack) {")
+ b.append("\t" + prebuiltInvocationExpression)
+ b.append("} else {")
+
+ # generate large-pack byref intermediate struct variables
+ for lpArg in largePackByrefArgs:
+ if not lpArg[0].endswith("[]"):
+ assignByRefManaged = "" if not lpArg[2] else f" = {lpArg[1]}"
+ b.append(f"\t{lpArg[0]}_LargePack {lpArg[1]}_lp{assignByRefManaged};")
+ else:
+ b.append(f"\t{lpArg[0][:-2]}_LargePack[] {lpArg[1]}_lp = new {lpArg[0][:-2]}_LargePack[{lpArg[1]}.Length];")
+ b.append(f"\tfor (int i = 0; i < {lpArg[1]}.Length; i++)")
+ b.append(f"\t\t{lpArg[1]}_lp[i] = {lpArg[1]}[i];")
+
+ b.append("\t" + prebuiltInvocationExpressionLargePack)
+ # convert large pack form to managed form
+ for lpArg in largePackByrefArgs:
+ if not lpArg[0].endswith('[]'):
+ b.append(f"\t{lpArg[1]} = {lpArg[1]}_lp;")
+ else:
+ b.append(f"\tfor (int i = 0; i < {lpArg[1]}.Length; i++)")
+ b.append(f"\t\t{lpArg[1]}[i] = {lpArg[1]}_lp[i];")
+ b.append("}")
- functionBody.append("{0}{1}{2}NativeMethods.{3}({4});".format(indentlevel, strReturnable, strCast, strEntryPoint2, argnames))
+ b.append("#else")
+ b.append("{0}{1}{2}NativeMethods.{3}({4});".format(
+ "", strReturnable, strCast,
+ invokingNativeFunctionName, argnames))
+ b.append("#endif")
+
+ functionBody.extend(map(lambda l: "\t\t\t" + l, b))
if outstringargs:
retcmp = "ret != 0"
@@ -824,21 +913,31 @@ def parse_func(f, interface, func):
elif returntype == "int":
retcmp = "ret != -1"
retcmp = g_SpecialOutStringRetCmp.get(strEntryPoint, retcmp)
- for a in outstringargs:
+ for argName in outstringargs:
if returntype == "void":
- functionBody.append(indentlevel + a + " = InteropHelp.PtrToStringUTF8(" + a + "2);")
+ functionBody.append(indentlevel + argName + " = InteropHelp.PtrToStringUTF8(" + argName + "2);")
else:
- functionBody.append(indentlevel + a + " = " + retcmp + " ? InteropHelp.PtrToStringUTF8(" + a + "2) : null;")
+ functionBody.append(indentlevel + argName + " = " + retcmp + " ? InteropHelp.PtrToStringUTF8(" + argName + "2) : null;")
if strEntryPoint != "ISteamRemoteStorage_GetUGCDetails":
- functionBody.append(indentlevel + "Marshal.FreeHGlobal(" + a + "2);")
+ functionBody.append(indentlevel + "Marshal.FreeHGlobal(" + argName + "2);")
+
+ if (returntype != "void" and (isPacksizeAware)):
+ if not outstringargs:
+ functionBody.append(indentlevel + "#if STEAMWORKS_ANYCPU")
+ functionBody.append(indentlevel + "return ret;")
+ if not outstringargs:
+ functionBody.append(indentlevel + "#endif")
+ elif returntype != 'void' and outstringargs:
+ functionBody.append(indentlevel + "return ret;")
+ elif returntype != "void" and not isPacksizeAware:
+ pass
- if returntype != "void":
- functionBody.append(indentlevel + "return ret;")
if stringargs:
functionBody.append("\t\t\t}")
+
comments = func.comments
if func.linecomment:
comments.append(func.linecomment)
@@ -857,37 +956,65 @@ def parse_func(f, interface, func):
g_Output.append("\t\t}")
g_Output.append("")
-def parse_args(strEntryPoint, args):
+def parse_args(strEntryPoint: str, args: list[Arg], _: bool, parser: Parser):
+ # Akarinnnnn: I think we should extract a result class
pinvokeargs = "IntPtr instancePtr, "
+ pinvokeargsLargePack = pinvokeargs
wrapperargs = ""
- argnames = ""
+ nativeFunctionArgs = ""
+ nativeFunctionArgsLargePack = ""
stringargs = []
outstringargs = []
outstringsize = []
+ isMethodPacksizeAware = False
args_with_explicit_count = OrderedDict()
+ largePackArgMarshalInfo: list[(str, str, bool)] = []
ifacename = strEntryPoint[1:strEntryPoint.index('_')]
+
+ #region init native function params string
if "GameServer" in ifacename:
if ifacename != "SteamGameServer" and ifacename != "SteamGameServerStats":
ifacename = ifacename.replace("GameServer", "")
- argnames = "CSteamGameServerAPIContext.Get" + ifacename + "(), "
+ nativeFunctionArgs = "CSteamGameServerAPIContext.Get" + ifacename + "(), "
+ nativeFunctionArgsLargePack = "CSteamGameServerAPIContext.Get" + ifacename + "(), "
else:
- argnames = "CSteamAPIContext.Get" + ifacename + "(), "
+ nativeFunctionArgs = "CSteamAPIContext.Get" + ifacename + "(), "
+ nativeFunctionArgsLargePack = "CSteamAPIContext.Get" + ifacename + "(), "
getNextArgAsStringSize = False
argNamesToAddAsStringSize = []
for arg in args:
+
+ #region populate PInvoke params list and wrapper args (both LP and SP)
potentialtype = arg.type.rstrip("*").lstrip("const ").rstrip()
- argtype = g_TypeDict.get(arg.type, arg.type)
- if argtype.endswith("*"):
- argtype = "out " + g_TypeDict.get(potentialtype, potentialtype)
- argtype = g_SpecialArgsDict.get(strEntryPoint, dict()).get(arg.name, argtype)
+ isThisArgPackAware = potentialtype in parser.packSizeAwareStructs
+
+ isMethodPacksizeAware = True if isThisArgPackAware else isMethodPacksizeAware
+
+ pInvokeArgType = g_TypeDict.get(arg.type, arg.type)
+
+ isParamArray = False
+ largePackArgMarshalRecord = None
+ if pInvokeArgType.endswith("*"):
+ wrapperParamType = g_TypeDict.get(potentialtype, potentialtype)
+ pInvokeArgType = "out " + wrapperParamType
+
+ if isThisArgPackAware:
+ # add this arg to marshal list
+ largePackArgMarshalRecord = (potentialtype, arg.name, True)
+
+
+ pInvokeArgType = g_SpecialArgsDict.get(strEntryPoint, dict()).get(arg.name, pInvokeArgType)
argattribute = get_arg_attribute(strEntryPoint, arg)
if argattribute:
- if argattribute.name == "STEAM_OUT_ARRAY" or argattribute.name == "STEAM_OUT_ARRAY_CALL" or argattribute.name == "STEAM_OUT_ARRAY_COUNT" or argattribute.name == "STEAM_ARRAY_COUNT" or argattribute.name == "STEAM_ARRAY_COUNT_D":
- argtype = g_TypeDict.get(potentialtype, potentialtype) + "[]"
+ if argattribute.name in ("STEAM_OUT_ARRAY", "STEAM_OUT_ARRAY_CALL", "STEAM_OUT_ARRAY_COUNT", "STEAM_ARRAY_COUNT","STEAM_ARRAY_COUNT_D"):
+ isParamArray = True
+ pInvokeArgType = g_TypeDict.get(potentialtype, potentialtype) + "[]"
+ if isMethodPacksizeAware:
+ pInvokeLargePackType = g_TypeDict.get(potentialtype, potentialtype) + "_LargePack[]"
if argattribute.name == "STEAM_OUT_ARRAY_COUNT":
commaindex = argattribute.value.find(',')
@@ -896,22 +1023,37 @@ def parse_args(strEntryPoint, args):
else:
args_with_explicit_count[arg.name] = argattribute.value
+ if isParamArray and isThisArgPackAware :
+ (t, n, byref) = largePackArgMarshalRecord
+ largePackArgMarshalRecord = (t + "[]", n, byref)
if arg.type == "MatchMakingKeyValuePair_t **": # TODO: Fixme - Small Hack... We do this because MatchMakingKeyValuePair's have ARRAY_COUNT() and two **'s, things get broken :(
- argtype = "IntPtr"
+ pInvokeArgType = "IntPtr"
# We skip byte[] because it is a primitive type that C# can essentially mmap and get a great perf increase while marshalling.
# We need to do this for other primitive types eventually but that will require more testing to make sure nothing breaks.
- if argtype.endswith("[]") and argtype != "byte[]":
- argtype = "[In, Out] " + argtype
- elif argtype == "bool":
- argtype = "[MarshalAs(UnmanagedType.I1)] " + argtype
+ if pInvokeArgType.endswith("[]") and pInvokeArgType != "byte[]":
+ pInvokeArgType = "[In, Out] " + pInvokeArgType
+ elif pInvokeArgType == "bool":
+ pInvokeArgType = "[MarshalAs(UnmanagedType.I1)] " + pInvokeArgType
+
+ pinvokeargs += pInvokeArgType + " " + arg.name + ", "
+ if isThisArgPackAware:
+ if pInvokeArgType.endswith('[]'):
+ pinvokeargsLargePack += f"{pInvokeArgType[:-2]}_LargePack[] {arg.name}_lp, "
+ if isThisArgPackAware:
+ (t, n, b) = largePackArgMarshalRecord
+ largePackArgMarshalRecord = (f"{t}[]", n, b)
+ else:
+ pinvokeargsLargePack += f"{pInvokeArgType}_LargePack {arg.name}_lp, "
- pinvokeargs += argtype + " " + arg.name + ", "
+ else:
+ pinvokeargsLargePack += pInvokeArgType + " " + arg.name + ", "
- argtype = argtype.replace("[In, Out] ", "").replace("[MarshalAs(UnmanagedType.I1)] ", "")
- wrapperargtype = g_WrapperArgsTypeDict.get(arg.type, argtype)
+ pInvokeArgType = pInvokeArgType.replace("[In, Out] ", "").replace("[MarshalAs(UnmanagedType.I1)] ", "")
+ wrapperargtype = g_WrapperArgsTypeDict.get(arg.type, pInvokeArgType)
wrapperargtype = g_SpecialWrapperArgsDict.get(strEntryPoint, dict()).get(arg.name, wrapperargtype)
+
if wrapperargtype == "InteropHelp.UTF8StringHandle":
wrapperargtype = "string"
elif arg.type == "char *" or arg.type == "char*":
@@ -922,28 +1064,45 @@ def parse_args(strEntryPoint, args):
if arg.default:
wrapperargs += " = " + g_ArgDefaultLookup.get(arg.default, arg.default)
wrapperargs += ", "
-
- if argtype.startswith("out"):
- argnames += "out "
+
+
+ if pInvokeArgType.startswith("out"):
+ nativeFunctionArgs += "out "
+ nativeFunctionArgsLargePack += "out "
+ if isThisArgPackAware:
+ (t, n, _) = largePackArgMarshalRecord
+ largePackArgMarshalRecord = (t, n, False)
elif wrapperargtype.startswith("ref"):
- argnames += "ref "
+ nativeFunctionArgs += "ref "
+ nativeFunctionArgsLargePack += "ref "
+ if isThisArgPackAware:
+ # make original value passing in
+ (t, n, _) = (largePackArgMarshalRecord)
+ largePackArgMarshalRecord = (t, n, True)
if wrapperargtype == "System.Collections.Generic.IList":
- argnames += "new InteropHelp.SteamParamStringArray(" + arg.name + ")"
+ nativeFunctionArgs += "new InteropHelp.SteamParamStringArray(" + arg.name + ")"
+ nativeFunctionArgsLargePack += "new InteropHelp.SteamParamStringArray(" + arg.name + ")"
elif wrapperargtype == "MatchMakingKeyValuePair_t[]":
- argnames += "new MMKVPMarshaller(" + arg.name + ")"
+ nativeFunctionArgs += "new MMKVPMarshaller(" + arg.name + ")"
+ nativeFunctionArgsLargePack += "new MMKVPMarshaller(" + arg.name + ")"
elif wrapperargtype.endswith("Response"):
- argnames += "(IntPtr)" + arg.name
+ nativeFunctionArgs += "(IntPtr)" + arg.name
+ nativeFunctionArgsLargePack += "(IntPtr)" + arg.name
elif arg.name.endswith("Deprecated"):
- if argtype == "IntPtr":
- argnames += "IntPtr.Zero"
- elif argtype == "bool":
- argnames += "false"
+ if pInvokeArgType == "IntPtr":
+ nativeFunctionArgs += "IntPtr.Zero"
+ nativeFunctionArgsLargePack += "IntPtr.Zero"
+ elif pInvokeArgType == "bool":
+ nativeFunctionArgs += "false"
+ nativeFunctionArgsLargePack += "false"
else:
- argnames += "0"
+ nativeFunctionArgs += "0"
+ nativeFunctionArgsLargePack += "0"
else:
- argnames += arg.name
-
+ nativeFunctionArgs += arg.name
+ nativeFunctionArgsLargePack += arg.name
+
if getNextArgAsStringSize:
getNextArgAsStringSize = False
outstringsize.append(arg)
@@ -954,10 +1113,12 @@ def parse_args(strEntryPoint, args):
if wrapperargtype == "string":
stringargs.append(arg.name)
- argnames += "2"
+ nativeFunctionArgs += "2"
+ nativeFunctionArgsLargePack += "2"
elif wrapperargtype == "out string":
outstringargs.append(arg.name)
- argnames += "2"
+ nativeFunctionArgs += "2"
+ nativeFunctionArgsLargePack += "2"
if argattribute:
if argattribute.name == "STEAM_OUT_STRING_COUNT":
argNamesToAddAsStringSize.append(argattribute.value)
@@ -965,13 +1126,26 @@ def parse_args(strEntryPoint, args):
pass
else:
getNextArgAsStringSize = True
+
+
+
+ if isThisArgPackAware:
+ nativeFunctionArgsLargePack += "_lp"
+ largePackArgMarshalInfo.append(largePackArgMarshalRecord)
+
+ nativeFunctionArgs += ", "
+ nativeFunctionArgsLargePack += ", "
- argnames += ", "
pinvokeargs = pinvokeargs.rstrip(", ")
+ pinvokeargsLargePack = pinvokeargsLargePack.rstrip(", ")
+ nativeFunctionArgsLargePack = nativeFunctionArgsLargePack.rstrip(", ")
wrapperargs = wrapperargs.rstrip(", ")
- argnames = argnames.rstrip(", ")
- return (pinvokeargs, wrapperargs, argnames, stringargs, (outstringargs, outstringsize), args_with_explicit_count)
+ nativeFunctionArgs = nativeFunctionArgs.rstrip(", ")
+ nativeFunctionArgsLargePack = nativeFunctionArgsLargePack.rstrip(", ")
+ return (pinvokeargs, wrapperargs, nativeFunctionArgs, stringargs, (outstringargs, outstringsize),
+ args_with_explicit_count, isMethodPacksizeAware, nativeFunctionArgsLargePack,
+ largePackArgMarshalInfo, pinvokeargsLargePack if isMethodPacksizeAware else None)
if __name__ == "__main__":
diff --git a/CodeGen/src/structs.py b/CodeGen/src/structs.py
index 6fb5cb46..e1b92768 100644
--- a/CodeGen/src/structs.py
+++ b/CodeGen/src/structs.py
@@ -1,16 +1,23 @@
import os
import sys
-from SteamworksParser import steamworksparser
+from copy import deepcopy
+from SteamworksParser.steamworksparser import BlankLine, FieldOffset, Parser, Settings, Struct, StructField
g_TypeConversionDict = {
"uint8": "byte",
"uint16": "ushort",
"uint32": "uint",
"uint64": "ulong",
+ "uint8_t": "byte",
+ "uint16_t": "ushort",
+ "uint32_t": "uint",
+ "uint64_t": "ulong",
"char": "string",
"int32": "int",
"int64": "long",
+ "int32_t": "int",
+ "int64_t": "long",
"uint8 *": "IntPtr",
"const char *": "string",
@@ -64,6 +71,7 @@
g_SequentialStructs = (
"MatchMakingKeyValuePair_t",
+ "SteamNetConnectionInfo_t"
)
g_SpecialFieldTypes = {
@@ -94,19 +102,24 @@
}
}
-def main(parser):
+def main(parser: Parser):
try:
os.makedirs("../com.rlabrecque.steamworks.net/Runtime/autogen/")
except OSError:
pass
+ packsizeAwareStructNames = parser.packSizeAwareStructs
+
lines = []
callbacklines = []
+
+ anyCpuConditionalMarshallerLines = [] # Contains conditional marshaller code only
+
for f in parser.files:
for struct in f.structs:
- lines.extend(parse(struct))
+ lines.extend(parse(struct, True, anyCpuConditionalMarshallerLines, packsizeAwareStructNames, parser))
for callback in f.callbacks:
- callbacklines.extend(parse(callback))
+ callbacklines.extend(parse(callback, True, anyCpuConditionalMarshallerLines, packsizeAwareStructNames, parser))
with open("../com.rlabrecque.steamworks.net/Runtime/autogen/SteamStructs.cs", "wb") as out:
with open("templates/header.txt", "r") as f:
@@ -125,62 +138,167 @@ def main(parser):
out.write(bytes(line + "\n", "utf-8"))
out.write(bytes("}\n\n", "utf-8"))
out.write(bytes("#endif // !DISABLESTEAMWORKS\n", "utf-8"))
+
+ with open("../Standalone3.0/anycpu/autogen/SteamMarshallerTable.g.cs", "wb") as out:
+ with open("templates/header.txt", "r") as f:
+ out.write(bytes(f.read(), "utf-8"))
+
+ with open("templates/anycpu/SteamMarshallerTable.head.cs", "r") as f:
+ out.write(bytes(f.read(), "utf-8"))
+
+ for line in anyCpuConditionalMarshallerLines:
+ out.write(bytes("\t\t\t\t" + line + "\n", "utf-8"))
+
+ with open("templates/anycpu/SteamMarshallerTable.tail.cs", "r") as f:
+ out.write(bytes(f.read(), "utf-8"))
+
+ out.write(bytes("#endif // !DISABLESTEAMWORKS\n", "utf-8"))
-def parse(struct):
- if struct.name in g_SkippedStructs:
+def parse(struct: Struct, isMainStruct, marshalTableLines: list[str], packsizeAwareStructNames: list[str], parser: Parser) -> list[str]:
+ # ignore structs that manually defined by us
+ # ignore nested structs, they probably handled by hand
+ # ignore structs which has nested types, they probably interop by hand
+ if struct.name in g_SkippedStructs or struct.should_not_generate():
+ return []
+
+ if struct.is_sequential and not isMainStruct:
return []
lines = []
for comment in struct.c.rawprecomments:
- if type(comment) is steamworksparser.BlankLine:
+ if type(comment) is BlankLine:
continue
lines.append("\t" + comment)
- structname = struct.name
-
+ structname: str = struct.name
+ # We have analyzed this struct and stored the value of its packsize,
+ # it's stored in Struct.pack, None for default packsize
+ # If the struct is packsize-aware, we generate large variants of it.
packsize = g_CustomPackSize.get(structname, "Packsize.value")
+ isExplicitStruct = False
if g_ExplicitStructs.get(structname, False):
lines.append("\t[StructLayout(LayoutKind.Explicit, Pack = " + packsize + ")]")
- elif struct.packsize:
+ isExplicitStruct = True
+ elif isMainStruct and not struct.is_sequential:
+
+ if struct.packsize != "Packsize.value" and structname not in g_SequentialStructs:
+ customsize = ""
+ if len(struct.fields) == 0:
+ customsize = ", Size = 1"
+ lines.append("\t[StructLayout(LayoutKind.Sequential, Pack = " + packsize + customsize + ")]")
+ elif not isMainStruct:
+ packsize = str(8)
customsize = ""
if len(struct.fields) == 0:
- customsize = ", Size = 1"
- lines.append("\t[StructLayout(LayoutKind.Sequential, Pack = " + packsize + customsize + ")]")
+ customsize = ", Size = 1"
+ lines.append("\t[StructLayout(LayoutKind.Sequential, Pack = 8" + customsize + ")]")
if struct.callbackid:
lines.append("\t[CallbackIdentity(Constants." + struct.callbackid + ")]")
- for name in g_SequentialStructs:
- if name == structname:
+ # use pack-size sematic for sequential
+ for name in g_SequentialStructs or struct.is_sequential:
+ if name == structname or struct.is_sequential:
lines.append("\t[StructLayout(LayoutKind.Sequential)]")
break
- lines.append("\tpublic struct " + structname + " {")
+ if isMainStruct:
+ if struct.callbackid:
+ lines.append("\tpublic struct " + structname )
+ lines.append("\t#if STEAMWORKS_ANYCPU")
+ lines.append("\t\t: ISteamCallbackIdentity")
+ lines.append("\t#endif")
+ lines.append("\t{")
+ else:
+ lines.append("\tpublic struct " + structname + " {" )
+ else:
+ lines.append("\tinternal struct " + structname + " {")
+
lines.extend(insert_constructors(structname))
- if struct.callbackid:
+ if struct.callbackid and isMainStruct:
lines.append("\t\tpublic const int k_iCallback = Constants." + struct.callbackid + ";")
+ lines.append("\t\tpublic static int CallbackIdentity { get; } = Constants." + struct.callbackid + ";")
+ fieldHandlingStructName = structname
for field in struct.fields:
- lines.extend(parse_field(field, structname))
+ if not isMainStruct:
+ fieldHandlingStructName = fieldHandlingStructName[:structname.rindex("_")]
+
+ lines.extend(parse_field(field, fieldHandlingStructName, isMainStruct, parser))
+
+ if fieldHandlingStructName in packsizeAwareStructNames and not isMainStruct:
+ mainStructName = structname[:structname.rindex("_")]
+ packKind = structname[structname.rindex("_") + 1:]
+
+ lines.append("")
+ lines.append(f"\t\tpublic static implicit operator {mainStructName}({mainStructName}_{packKind} value) {{")
+ lines.append(f"\t\t\t{mainStructName} result = default;")
+
+ for field in struct.fields:
+ gen_fieldcopycode(field, structname, lines)
+
+ lines.append(f"\t\t\treturn result;")
+ lines.append("\t\t}")
+
+ lines.append("")
+ lines.append(f"\t\tpublic static implicit operator {mainStructName}_{packKind}({mainStructName} value) {{")
+ lines.append(f"\t\t\t{mainStructName}_{packKind} result = default;")
+
+ for field in struct.fields:
+ gen_fieldcopycode(field, structname, lines)
+
+ lines.append(f"\t\t\treturn result;")
+ lines.append("\t\t}")
+ pass
if struct.endcomments:
for comment in struct.endcomments.rawprecomments:
- if type(comment) is steamworksparser.BlankLine:
+ if type(comment) is BlankLine:
lines.append("\t\t")
else:
lines.append("\t" + comment)
+ # Generate Any CPU marshal helper
+ if isMainStruct and struct.name in packsizeAwareStructNames and not isExplicitStruct:
+ marshalTableLines.append(f"if (typeof(T) == typeof({structname}) && Packsize.IsLargePack)")
+ marshalTableLines.append(f"\tImpl<{structname}>.Marshaller = (unmanaged) =>")
+ marshalTableLines.append(f"\t\tSystem.Runtime.InteropServices.Marshal.PtrToStructure<{structname}_LargePack>(unmanaged);")
+ marshalTableLines.append("")
+
+
+ # pass
+
lines.append("\t}")
lines.append("")
+ # Generate Any CPU struct variant for default pack-sized structs
+ if isMainStruct and not isExplicitStruct and struct.name in packsizeAwareStructNames:
+ lines.append("\t#if STEAMWORKS_ANYCPU")
+
+ largePackStruct = deepcopy(struct)
+ largePackStruct.name = structname + "_LargePack"
+ largePackStruct.packsize = 8
+ lines.extend(parse(largePackStruct, False, marshalTableLines, packsizeAwareStructNames, parser))
+
+ lines.append("\t#endif")
+
return lines
-def parse_field(field, structname):
+def gen_fieldcopycode(field, structname, marshalTableLines):
+ fieldtype = g_TypeConversionDict.get(field.type, field.type)
+ fieldtype = g_SpecialFieldTypes.get(structname, dict()).get(field.name, fieldtype)
+
+ if field.arraysize and fieldtype == "string":
+ marshalTableLines.append(f"\t\t\tresult.{field.name}_ = value.{field.name}_;")
+ else:
+ marshalTableLines.append(f"\t\t\tresult.{field.name} = value.{field.name};")
+
+def parse_field(field: StructField, structname: str, isMainStruct: bool, parser: Parser):
lines = []
for comment in field.c.rawprecomments:
- if type(comment) is steamworksparser.BlankLine:
+ if type(comment) is BlankLine:
lines.append("\t\t")
else:
lines.append("\t" + comment)
@@ -196,30 +314,36 @@ def parse_field(field, structname):
if field.c.rawlinecomment:
comment = field.c.rawlinecomment
- if field.arraysize:
+ if field.arraysizeStr:
constantsstr = ""
- if not field.arraysize.isdigit():
+ if not field.arraysizeStr.isdigit():
constantsstr = "Constants."
if fieldtype == "byte[]":
- lines.append("\t\t[MarshalAs(UnmanagedType.ByValArray, SizeConst = " + constantsstr + field.arraysize + ")]")
+ lines.append("\t\t[MarshalAs(UnmanagedType.ByValArray, SizeConst = " + constantsstr + field.arraysizeStr + ")]")
if structname == "MatchMakingKeyValuePair_t":
- lines.append("\t\t[MarshalAs(UnmanagedType.ByValTStr, SizeConst = " + constantsstr + field.arraysize + ")]")
+ lines.append("\t\t[MarshalAs(UnmanagedType.ByValTStr, SizeConst = " + constantsstr + field.arraysizeStr + ")]")
else:
- lines.append("\t\t[MarshalAs(UnmanagedType.ByValArray, SizeConst = " + constantsstr + field.arraysize + ")]")
+ lines.append("\t\t[MarshalAs(UnmanagedType.ByValArray, SizeConst = " + constantsstr + field.arraysizeStr + ")]")
fieldtype += "[]"
if fieldtype == "bool":
lines.append("\t\t[MarshalAs(UnmanagedType.I1)]")
- if field.arraysize and fieldtype == "string[]":
- lines.append("\t\tprivate byte[] " + field.name + "_;")
- lines.append("\t\tpublic string " + field.name + comment)
+ # HACK real type is `string`, `[]` is added by `fieldtype += "[]"`
+ if field.arraysizeStr and fieldtype == "string[]":
+ lines.append("\t\tinternal byte[] " + field.name + "_;")
+ lines.append("\t\tpublic string " + field.name + comment)
lines.append("\t\t{")
lines.append("\t\t\tget { return InteropHelp.ByteArrayToStringUTF8(" + field.name + "_); }")
- lines.append("\t\t\tset { InteropHelp.StringToByteArrayUTF8(value, " + field.name + "_, " + constantsstr + field.arraysize + "); }")
+ lines.append("\t\t\tset { InteropHelp.StringToByteArrayUTF8(value, " + field.name + "_, " + constantsstr + field.arraysizeStr + "); }")
lines.append("\t\t}")
else:
+ if not isMainStruct:
+ typeInfo = parser.resolveTypeInfo(field.type)
+ if isinstance(typeInfo, Struct) and typeInfo.packsize_aware:
+ fieldtype = fieldtype + "_LargePack"
+
lines.append("\t\tpublic " + fieldtype + " " + field.name + ";" + comment)
return lines
@@ -240,5 +364,5 @@ def insert_constructors(name):
print("TODO: Usage Instructions")
exit()
- steamworksparser.Settings.fake_gameserver_interfaces = True
- main(steamworksparser.parse(sys.argv[1]))
\ No newline at end of file
+ Settings.fake_gameserver_interfaces = True
+ main(parse(sys.argv[1]))
\ No newline at end of file
diff --git a/CodeGen/templates/anycpu/SteamMarshallerTable.head.cs b/CodeGen/templates/anycpu/SteamMarshallerTable.head.cs
new file mode 100644
index 00000000..dbd18b9b
--- /dev/null
+++ b/CodeGen/templates/anycpu/SteamMarshallerTable.head.cs
@@ -0,0 +1,18 @@
+///
+// This file is generated by CodeGen/src/struct.py
+
+#if !STEAMWORKS_ANYCPU
+#error This file for Any CPU variant, not meaningful to any other platform.
+#endif
+
+using System;
+using System.Collections.Frozen;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Steamworks {
+ public static partial class SteamMarshallerTable {
+ private static partial class Impl {
+ static Impl() {
diff --git a/CodeGen/templates/anycpu/SteamMarshallerTable.tail.cs b/CodeGen/templates/anycpu/SteamMarshallerTable.tail.cs
new file mode 100644
index 00000000..44036b84
--- /dev/null
+++ b/CodeGen/templates/anycpu/SteamMarshallerTable.tail.cs
@@ -0,0 +1,4 @@
+ }
+ }
+ }
+}
diff --git a/CodeGen/templates/custom_types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs b/CodeGen/templates/custom_types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
index d3419904..84cb3326 100644
--- a/CodeGen/templates/custom_types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
+++ b/CodeGen/templates/custom_types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
@@ -27,7 +27,15 @@ public struct ISteamNetworkingConnectionSignaling
/// You can assume that the same value of hConn will be used
/// every time.
public bool SendSignal(HSteamNetConnection hConn, ref SteamNetConnectionInfo_t info, IntPtr pMsg, int cbMsg) {
- return NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info, pMsg, cbMsg);
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info, pMsg, cbMsg);
+ } else {
+ SteamNetConnectionInfo_t info_lp = info;
+ ret = NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info_lp, pMsg, cbMsg);
+ info = info_lp;
+ }
+ return ret;
}
/// Called when the connection no longer needs to send signals.
diff --git a/CodeGen/templates/nativemethods.txt b/CodeGen/templates/nativemethods.txt
index b017d94f..51ba867d 100644
--- a/CodeGen/templates/nativemethods.txt
+++ b/CodeGen/templates/nativemethods.txt
@@ -1,4 +1,4 @@
-// This file is provided under The MIT License as part of Steamworks.NET.
+// This file is provided under The MIT License as part of Steamworks.NET.
// Copyright (c) 2013-2022 Riley Labrecque
// Please see the included LICENSE.txt for additional information.
@@ -33,10 +33,11 @@
using System.Runtime.InteropServices;
using IntPtr = System.IntPtr;
+using SysPath = System.IO.Path;
namespace Steamworks {
[System.Security.SuppressUnmanagedCodeSecurity()]
- internal static class NativeMethods {
+ internal static partial class NativeMethods {
#if STEAMWORKS_WIN && STEAMWORKS_X64
internal const string NativeLibraryName = "steam_api64";
internal const string NativeLibrary_SDKEncryptedAppTicket = "sdkencryptedappticket64";
@@ -303,6 +304,10 @@ namespace Steamworks {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref ISteamNetworkingConnectionSignaling self, HSteamNetConnection hConn, ref SteamNetConnectionInfo_t info, IntPtr pMsg, int cbMsg);
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref ISteamNetworkingConnectionSignaling self, HSteamNetConnection hConn, ref SteamNetConnectionInfo_t_LargePack info_lp, IntPtr pMsg, int cbMsg);
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingConnectionSignaling_Release", CallingConvention = CallingConvention.Cdecl)]
public static extern void SteamAPI_ISteamNetworkingConnectionSignaling_Release(ref ISteamNetworkingConnectionSignaling self);
#endregion
diff --git a/Standalone3.0/.editorconfig b/Standalone3.0/.editorconfig
new file mode 100644
index 00000000..ddcc40de
--- /dev/null
+++ b/Standalone3.0/.editorconfig
@@ -0,0 +1,297 @@
+# 如果要从更高级别的目录继承 .editorconfig 设置,请删除以下行
+root = true
+
+# c# 文件
+[*.cs]
+
+#### Core EditorConfig 选项 ####
+
+# 缩进和间距
+indent_size = 4
+indent_style = tab
+tab_width = 4
+
+# 新行首选项
+end_of_line = crlf
+insert_final_newline = false
+
+#### .NET 代码操作 ####
+
+# 类型成员
+dotnet_hide_advanced_members = false
+dotnet_member_insertion_location = with_other_members_of_the_same_kind
+dotnet_property_generation_behavior = prefer_auto_properties
+
+# 符号搜索
+dotnet_search_reference_assemblies = true
+
+#### .NET 编码约定 ####
+
+# 组织 Using
+dotnet_separate_import_directive_groups = false
+dotnet_sort_system_directives_first = false
+file_header_template = unset
+
+# this. 和 Me. 首选项
+dotnet_style_qualification_for_event = false
+dotnet_style_qualification_for_field = false
+dotnet_style_qualification_for_method = false
+dotnet_style_qualification_for_property = false
+
+# 语言关键字与 bcl 类型首选项
+dotnet_style_predefined_type_for_locals_parameters_members = true
+dotnet_style_predefined_type_for_member_access = true
+
+# 括号首选项
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
+
+# 修饰符首选项
+dotnet_style_require_accessibility_modifiers = for_non_interface_members
+
+# 表达式级首选项
+dotnet_prefer_system_hash_code = true
+dotnet_style_coalesce_expression = true
+dotnet_style_collection_initializer = false
+dotnet_style_explicit_tuple_names = true
+dotnet_style_namespace_match_folder = false
+dotnet_style_null_propagation = true
+dotnet_style_object_initializer = true
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_prefer_auto_properties = true
+dotnet_style_prefer_collection_expression = when_types_loosely_match
+dotnet_style_prefer_compound_assignment = true
+dotnet_style_prefer_conditional_expression_over_assignment = true
+dotnet_style_prefer_conditional_expression_over_return = true
+dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed
+dotnet_style_prefer_inferred_anonymous_type_member_names = true
+dotnet_style_prefer_inferred_tuple_names = true
+dotnet_style_prefer_is_null_check_over_reference_equality_method = true
+dotnet_style_prefer_simplified_boolean_expressions = true
+dotnet_style_prefer_simplified_interpolation = true
+
+# 字段首选项
+dotnet_style_readonly_field = true
+
+# 参数首选项
+dotnet_code_quality_unused_parameters = all
+
+# 禁止显示首选项
+dotnet_remove_unnecessary_suppression_exclusions = none
+
+# 新行首选项
+dotnet_style_allow_multiple_blank_lines_experimental = false
+dotnet_style_allow_statement_immediately_after_block_experimental = true
+
+#### c# 编码约定 ####
+
+# var 首选项
+csharp_style_var_elsewhere = false:silent
+csharp_style_var_for_built_in_types = false:silent
+csharp_style_var_when_type_is_apparent = false:silent
+
+# Expression-bodied 成员
+csharp_style_expression_bodied_accessors = true:silent
+csharp_style_expression_bodied_constructors = false:silent
+csharp_style_expression_bodied_indexers = false:silent
+csharp_style_expression_bodied_lambdas = true:silent
+csharp_style_expression_bodied_local_functions = false:silent
+csharp_style_expression_bodied_methods = false:silent
+csharp_style_expression_bodied_operators = false:silent
+csharp_style_expression_bodied_properties = true:silent
+
+# 模式匹配首选项
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_prefer_extended_property_pattern = true:suggestion
+csharp_style_prefer_not_pattern = true:suggestion
+csharp_style_prefer_pattern_matching = false:silent
+csharp_style_prefer_switch_expression = false:suggestion
+
+# Null 检查首选项
+csharp_style_conditional_delegate_call = true:suggestion
+
+# 修饰符首选项
+csharp_prefer_static_anonymous_function = true:suggestion
+csharp_prefer_static_local_function = true:suggestion
+csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
+csharp_style_prefer_readonly_struct = false:suggestion
+csharp_style_prefer_readonly_struct_member = true:suggestion
+
+# 代码块首选项
+csharp_prefer_braces = true:silent
+csharp_prefer_simple_using_statement = false:suggestion
+csharp_prefer_system_threading_lock = false:suggestion
+csharp_style_namespace_declarations = block_scoped:silent
+csharp_style_prefer_method_group_conversion = true:silent
+csharp_style_prefer_primary_constructors = false:suggestion
+csharp_style_prefer_simple_property_accessors = true:suggestion
+csharp_style_prefer_top_level_statements = false:silent
+
+# 表达式级首选项
+csharp_prefer_simple_default_expression = true:suggestion
+csharp_style_deconstructed_variable_declaration = true:suggestion
+csharp_style_implicit_object_creation_when_type_is_apparent = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+csharp_style_prefer_implicitly_typed_lambda_expression = true:suggestion
+csharp_style_prefer_index_operator = true:suggestion
+csharp_style_prefer_local_over_anonymous_function = true:suggestion
+csharp_style_prefer_null_check_over_type_check = true:suggestion
+csharp_style_prefer_range_operator = true:suggestion
+csharp_style_prefer_tuple_swap = true:suggestion
+csharp_style_prefer_unbound_generic_type_in_nameof = true:suggestion
+csharp_style_prefer_utf8_string_literals = true:suggestion
+csharp_style_throw_expression = true:suggestion
+csharp_style_unused_value_assignment_preference = discard_variable:suggestion
+csharp_style_unused_value_expression_statement_preference = discard_variable:silent
+
+# "using" 指令首选项
+csharp_using_directive_placement = outside_namespace:silent
+
+# 新行首选项
+csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true:silent
+csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true:silent
+csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true:silent
+csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true:silent
+csharp_style_allow_embedded_statements_on_same_line_experimental = true:silent
+
+#### C# 格式规则 ####
+
+# 新行首选项
+csharp_new_line_before_catch = false
+csharp_new_line_before_else = false
+csharp_new_line_before_finally = false
+csharp_new_line_before_members_in_anonymous_types = false
+csharp_new_line_before_members_in_object_initializers = false
+csharp_new_line_before_open_brace = types,properties,accessors
+csharp_new_line_between_query_expression_clauses = true
+
+# 缩进首选项
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_case_contents_when_block = false
+csharp_indent_labels = one_less_than_current
+csharp_indent_switch_labels = true
+
+# 空格键首选项
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = false
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# 包装首选项
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = true
+
+#### 命名样式 ####
+
+# 命名规则
+
+dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
+dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
+dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
+
+dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.types_should_be_pascal_case.symbols = types
+dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
+dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
+
+dotnet_naming_rule.fields_should_be_underscore_camel_case.severity = suggestion
+dotnet_naming_rule.fields_should_be_underscore_camel_case.symbols = fields
+dotnet_naming_rule.fields_should_be_underscore_camel_case.style = underscore_camel_case
+
+# 符号规范
+
+dotnet_naming_symbols.interface.applicable_kinds = interface
+dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.interface.required_modifiers =
+
+dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
+dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.types.required_modifiers =
+
+dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
+dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
+dotnet_naming_symbols.non_field_members.required_modifiers =
+
+dotnet_naming_symbols.fields.applicable_kinds = field
+dotnet_naming_symbols.fields.applicable_accessibilities = private
+dotnet_naming_symbols.fields.required_modifiers =
+
+# 命名样式
+
+dotnet_naming_style.pascal_case.required_prefix =
+dotnet_naming_style.pascal_case.required_suffix =
+dotnet_naming_style.pascal_case.word_separator =
+dotnet_naming_style.pascal_case.capitalization = pascal_case
+
+dotnet_naming_style.begins_with_i.required_prefix = I
+dotnet_naming_style.begins_with_i.required_suffix =
+dotnet_naming_style.begins_with_i.word_separator =
+dotnet_naming_style.begins_with_i.capitalization = pascal_case
+
+dotnet_naming_style.underscore_camel_case.required_prefix = _
+dotnet_naming_style.underscore_camel_case.required_suffix =
+dotnet_naming_style.underscore_camel_case.word_separator =
+dotnet_naming_style.underscore_camel_case.capitalization = camel_case
+
+[*.{cs,vb}]
+end_of_line = crlf
+dotnet_style_qualification_for_field = false:silent
+dotnet_style_qualification_for_property = false:silent
+dotnet_style_qualification_for_method = false:silent
+dotnet_style_qualification_for_event = false:silent
+tab_width = 4
+indent_size = 4
+dotnet_style_operator_placement_when_wrapping = beginning_of_line
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent
+dotnet_code_quality_unused_parameters = all:suggestion
+dotnet_style_readonly_field = true:suggestion
+dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent
+dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent
+dotnet_style_allow_multiple_blank_lines_experimental = false:silent
+dotnet_style_allow_statement_immediately_after_block_experimental = true:silent
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+dotnet_style_prefer_is_null_check_over_reference_equality_method = false:suggestion
+dotnet_style_prefer_auto_properties = true:silent
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = false:suggestion
+dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
+dotnet_style_prefer_conditional_expression_over_assignment = true:silent
+dotnet_style_prefer_conditional_expression_over_return = true:silent
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_tuple_names = true:suggestion
+dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
+dotnet_style_prefer_compound_assignment = true:suggestion
+dotnet_style_prefer_simplified_interpolation = false:error
+dotnet_style_prefer_collection_expression = never:error
+dotnet_style_namespace_match_folder = false:suggestion
+dotnet_style_predefined_type_for_locals_parameters_members = true:silent
+dotnet_style_predefined_type_for_member_access = true:silent
\ No newline at end of file
diff --git a/Standalone3.0/CONTRIBUTING.md b/Standalone3.0/CONTRIBUTING.md
new file mode 100644
index 00000000..84ae8dcd
--- /dev/null
+++ b/Standalone3.0/CONTRIBUTING.md
@@ -0,0 +1,289 @@
+# Steamworks.NET.AnyCPU Contributing Guidelines
+
+## Table of Contents
+- [Introduction](#introduction)
+- [Getting Started](#getting-started)
+- [Project Structure](#project-structure)
+- [Development Workflow](#development-workflow)
+- [Code Generation](#code-generation)
+- [Testing](#testing)
+- [Pull Request Guidelines](#pull-request-guidelines)
+- [Community](#community)
+
+## Introduction
+
+### Project Overview
+Steamworks.NET.AnyCPU is a fork of Steamworks.NET that provides AnyCPU support, allowing the library to work seamlessly across different processor architectures (x86, x64, ARM, etc.).
+
+### Relations between `Akarinnnnn/Steamworks.NET.AnyCPU` and `rlabrecque/Steamworks.NET`
+
+Steamworks.NET.AnyCPU originated as a patch for Steamworks.NET. However, due to its extensive modifications to `CodeGen`, the resulting commit volume became too large, far exceeding that of the branch that upgraded the target SDK from 1.62 to 1.63. Therefore, in the short term, AnyCPU will remain as an independent fork.
+
+**Main Contributors:**
+- @Akarinnnnn Any CPU rewrite
+- @Chicken-Bones ~~Vibe code the guy above~~AnyCPU idea initiator, DLL resolve hook and conditional marshal prototype provider
+- @ryan-linehan CI/CD in NuGet packaging
+
+**Credits**
+- @rlabrecque
+
+## Getting Started
+
+### Prerequisites
+- **Python 3.13** (required for CodeGen)
+- **.NET SDK** (version specified in project files)
+- **Git**
+- **Visual Studio 2022** or **Visual Studio Code** (using VSC for Python, VS for C# is recommended)
+- **Rider** and **PyCharm** (if you prefer JetBrains tools, but currently `.gitignore` isn't ready for them)
+
+### Setting Up Development Environment
+1. Clone the repository:
+ ```bash
+ git clone https://github.com/Akarinnnnn/Steamworks.NET.AnyCPU.git
+ cd Steamworks.NET.AnyCPU
+ ```
+
+2. Verify Python installation:
+ ```bash
+ python --version
+ # Should output: Python 3.13.x
+ # or python3 if your python command is bound to 2.x
+ ```
+
+3. Restore .NET dependencies:
+ ```bash
+ dotnet restore Standalone3.0/Steamworks.NET.sln
+ ```
+
+4. Build the project:
+ ```bash
+ dotnet build Standalone3.0/Steamworks.NET.sln
+ ```
+
+5. Create your `Steamworks.NET.AnyCPU` package
+ ```bash
+ dotnet pack --version $SEMVER Standalone3.0/Steamworks.NET.sln
+ ```
+
+## Project Structure
+
+### 1. Solution View of `Steamworks.NET`
+- **`src/`**: Shared source between Steamworks.NET.AnyCPU and Unity Package Manager. Linked from `$REPOSITORY_ROOT/com.rlabrecque.steamworks.net/Runtime`
+ - **Important**: Any edits without `#if STEAMWORKS_ANYCPU` should be carefully considered as they will affect Unity, which targeting to `netstandard2.0` or `netstandard2.1` depends on Unity version.
+ - `src/autogen`: First type of generated source files. Generator is located at `$REPOSITORY_ROOT/CodeGen`, @Akarinnnnn added AnyCPU modifications.
+ - `src/types`: Second type of generated source files. Generator is located at `$REPOSITORY_ROOT/CodeGen`, mostly done by original author @rlabrecque. This type is mostly from templates.
+
+- **`native/`**: Steamworks native dependencies for supported platforms. Linked from `$REPOSITORY_ROOT/com.rlabrecque.steamworks.net/Plugin`
+ - **Important**: These are provided by Valve, bundled with the current version, and should not be edited.
+ - If you need to update them for upgrading target SDK version, ask the whole Steamworks.NET community.
+
+- **`anycpu/`**: The AnyCPU specific source code. This is where you should make your edits for the AnyCPU version of Steamworks.NET.
+ - The sub-folder structure is mirrored with `src/`.
+ - **Important**: Files prefixed with `*.g.cs` are **generated** and should not be edited directly. If you need to edit them, edit the Generator in `$REPOSITORY_ROOT/CodeGen` and regenerate the code.
+
+### 2. `$REPOSITORY_ROOT/CodeGen`
+Python project, C# binding generator(Binder). This repository uses Python 3.13 to run the code. Previously contained the submodule `CodeGen/SteamworksParser/`, later integrated into this repository via `git subtree`.
+
+- **`templates/`**: Stores templates for generated files, including generated file headers, `Steamworks.NET/src/types`, and partial `*.g.cs` files.
+- **`SteamworksParser/`**: Parser that scans Steamworks SDK C++ header files line by line, scanning types, fields, interface member functions, and type aliases. @Akarinnnnn added type size analysis, field size analysis, object layout analysis, and structure cross-platform compatibility analysis features on top of the original. Also includes some debugging scripts.
+- **`Steam/`**: Stores Steamworks SDK C++ header files for the corresponding version, used for binding generation.
+- **`src/`**: Binding generator.
+
+## Development Workflow
+
+### Branch Strategy
+- Stable release branch doesn't exist currently, production-ready code is hold in tags.
+- **`anycpu-2`**: Development branch for upcoming features
+- **Feature branches**: `feature/description` (e.g., `feature/add-new-interface`)
+- **Bug fix branches**: `fix/issue-description` (e.g., `fix/memory-leak-issue123`)
+- **Hotfix branches**: `hotfix/critical-issue` (for urgent fixes to production)
+
+### Commit Guidelines
+- Use descriptive commit messages in the present tense
+- Reference issue numbers when applicable (e.g., `Fixes #123`)
+
+### Coding Standards
+- Enable `.editorconfig` support to your editor, most coding standards are defined there
+- Use meaningful variable and method names
+- Add XML documentation comments for public APIs
+- Keep methods focused and concise (single responsibility principle)
+
+## Code Generation
+
+### When to Regenerate Code
+You should regenerate code when:
+1. Steamworks SDK headers are updated
+2. Templates are modified
+3. Binder logic is changed
+4. New types need to be added
+5. Fixing issues in generated code
+
+### Regeneration Process
+1. Navigate to `CodeGen/` directory:
+ ```bash
+ cd CodeGen
+ ```
+
+2. Run the generator script:
+ ```bash
+ python Steamworks.NET_CodeGen.py
+ ```
+
+3. Verify generated files:
+ - Check for compilation errors
+ - Verify type mappings are correct
+ - Ensure no breaking changes
+
+4. Test the changes:
+ In another terminal do:
+ ```bash
+ cd Standalone3.0
+ dotnet build
+ ```
+
+### Common Issues and Solutions
+- **Missing Python modules**: Run `pip install -r requirements.txt` (if available)
+- **Parser errors**: Navigate to corresponding parse logic in `SteamworksParser.py` and fix it
+- **Other binder errors**: Navigate to corresponding bind logic in `src/.py` and fix it
+- **Generation failures**: Review template files for syntax errors
+
+## Testing
+
+### Testing Requirements
+- All changes should be tested before submission
+- Verify generated code compiles correctly
+- Test with sample applications when possible
+- Ensure cross-platform compatibility (x86, x64, ARM) if possible
+- Run existing unit tests (if available)
+
+### Testing Strategy
+1. **Compilation Testing**: Ensure the project builds without errors
+2. **Runtime Testing**: Test basic Steamworks functionality, `SteamAPI.Init()` and `SteamAPI.Shutdown()`
+3. **Cross-Platform Testing**: Verify on different architectures, do your best
+4. **Integration Testing**: Test with Unity projects (if applicable)
+
+### Creating Tests
+When adding new features or fixing bugs:
+1. When creating tests, add documentation describing the expected behavior
+2. Include setup instructions for the test environment
+
+## Pull Request Guidelines
+
+### Before Submitting a PR
+1. Ensure your code follows the project's coding standards, use `dotnet format` or format hotkey first
+2. Run any existing tests
+3. Update documentation if needed
+4. Rebase onto the latest target branch
+5. Squash commits when appropriate
+6. Ensure commit messages are clear and descriptive
+
+### PR Description Template
+```markdown
+## Description
+Brief description of the changes. Explain what problem this solves or what feature this adds.
+
+## Related Issues
+Fixes #issue_number
+Closes #issue_number
+Related to #issue_number
+
+## Changes Made
+- List specific changes made
+- Include technical details if relevant
+- Mention any breaking changes
+
+## Testing
+Describe how you tested the changes:
+- [ ] Compilation passes
+- [ ] Basic functionality works
+- [ ] (Optional, if possible) Cross-platform compatibility verified
+- [ ] No regressions in existing features
+
+## Checklist
+- [ ] Code follows project standards
+- [ ] Tests pass (or N/A if no tests exist)
+- [ ] Documentation updated
+- [ ] No breaking changes (or clearly documented if breaking)
+- [ ] PR targets the correct branch
+```
+
+### PR Review Process
+1. **Initial Review**: Maintainers are busy to fight for life, but your PR will be reviewed sometime
+2. **Feedback**: Address any feedback or requested changes
+3. **Approval**: Once approved, the PR will be merged
+4. **Merge Strategy**: Plain Merge for history clear
+
+## Community
+
+### Communication Channels
+- **GitHub Issues**: For bug reports and feature requests
+- **GitHub Discussions**: For questions and general discussions
+- **Pull Requests**: For code contributions
+- **Discord Chat**: We don't have that yet
+
+### How to Report Issues
+When reporting issues, please include:
+1. Clear description of the problem
+2. Steps to reproduce
+3. Expected vs actual behavior
+4. Environment details (OS, CPU architecture, .NET version, Unity version if applicable)
+5. Relevant code snippets or error messages
+
+### How to Request Features
+When requesting features:
+1. Describe the use case
+2. Explain the benefits
+3. Provide examples of how it would be used
+4. Consider if it aligns with project goals
+
+### Code of Conduct
+Please be respectful and constructive in all interactions. We follow these principles:
+- Be welcoming and inclusive
+- Be respectful of different viewpoints
+- Focus on what is best for the community
+- Show empathy towards other community members
+
+Violations of the code of conduct should be reported to the maintainers.
+
+### Recognition
+Contributors will be:
+- Acknowledged in release notes for significant contributions
+- Given credit in relevant documentation
+
+---
+
+## Additional Resources
+
+### Documentation
+- [Steamworks Documentation](https://partner.steamgames.com/doc/sdk)
+- [Original Steamworks.NET Documentation](https://steamworks.github.io/)
+
+### Useful Commands
+```bash
+# Build the project
+dotnet build Standalone3.0/Steamworks.NET.sln
+
+# Clean build artifacts
+dotnet clean Standalone3.0/Steamworks.NET.sln
+
+# Run code generator
+cd CodeGen
+python Steamworks.NET_CodeGen.py
+
+# Check for compilation errors
+dotnet build --no-restore --verbosity minimal
+
+# Create NuGet package yourself
+cd Standalone3.0
+dotnet pack --version $SEMVER -o path/to/your/test/packages/registry
+```
+
+### Troubleshooting
+- **Build failures**: Check .NET SDK version compatibility
+- **Missing dependencies**: `dotnet restore` and `python -m pip install`
+- **Python errors**: Verify Python 3.13 is installed correctly
+
+---
+
+*Thank you for contributing to Steamworks.NET.AnyCPU! Your contributions help make this project better for everyone.*
+Heart from Cyberstan, no AI was hurt during the writing process🤖.
\ No newline at end of file
diff --git a/Standalone3.0/Steamworks.NET.csproj b/Standalone3.0/Steamworks.NET.csproj
new file mode 100644
index 00000000..63068486
--- /dev/null
+++ b/Standalone3.0/Steamworks.NET.csproj
@@ -0,0 +1,79 @@
+
+
+
+ net8.0
+ Steamworks
+ git
+ STEAMWORKS_LIN_OSX;STEAMWORKS_X64;STEAMWORKS_ANYCPU
+ True
+
+
+
+ false
+
+ Steamworks.NET.AnyCPU
+ rlabrecque Fa鸽
+
+ MIT
+ https://github.com/Akarinnnnn/Steamworks.NET.AnyCPU
+ https://github.com/Akarinnnnn/Steamworks.NET.AnyCPU.git
+ README.md
+ true
+ snupkg
+
+
+
+
+
+
+
+
+
+
+
+
+ runtimes/win-x86/native
+ PreserveNewest
+ steam_api.dll
+
+
+ runtimes/win-x64/native
+ PreserveNewest
+ steam_api64.dll
+
+
+ runtimes/linux-x64/native
+ PreserveNewest
+ libsteam_api.so
+
+
+
+ runtimes/android-arm64/native
+
+
+
+ runtimes/linux-arm64/native
+
+
+
+ runtimes/osx-x64/native
+
+
+
+ runtimes/osx-arm64/native
+ PreserveNewest
+ libsteam_api.dylib
+
+
+
+
+
+
+
diff --git a/Standalone3.0/Steamworks.NET.sln b/Standalone3.0/Steamworks.NET.sln
new file mode 100644
index 00000000..82f4b6d1
--- /dev/null
+++ b/Standalone3.0/Steamworks.NET.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.29009.5
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Steamworks.NET", "Steamworks.NET.csproj", "{F34F403D-1D4D-4DC6-BBAE-DA31190EC88C}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F34F403D-1D4D-4DC6-BBAE-DA31190EC88C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F34F403D-1D4D-4DC6-BBAE-DA31190EC88C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F34F403D-1D4D-4DC6-BBAE-DA31190EC88C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F34F403D-1D4D-4DC6-BBAE-DA31190EC88C}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {EDFD04E1-5140-4A08-9F0B-3BE1A9B58AE6}
+ EndGlobalSection
+EndGlobal
diff --git a/Standalone3.0/anycpu/ISteamCallbackIdentity.cs b/Standalone3.0/anycpu/ISteamCallbackIdentity.cs
new file mode 100644
index 00000000..a4940c40
--- /dev/null
+++ b/Standalone3.0/anycpu/ISteamCallbackIdentity.cs
@@ -0,0 +1,14 @@
+namespace Steamworks
+{
+ ///
+ /// A marker that indicates implemented type is a async Steam callback result.
+ /// Library consumer should not implement this interface.
+ ///
+ public interface ISteamCallbackIdentity
+ {
+ ///
+ /// Steam async callback identity value.
+ ///
+ public static abstract int CallbackIdentity { get; }
+ }
+}
diff --git a/Standalone3.0/anycpu/SteamMarshallerTable.cs b/Standalone3.0/anycpu/SteamMarshallerTable.cs
new file mode 100644
index 00000000..1f603836
--- /dev/null
+++ b/Standalone3.0/anycpu/SteamMarshallerTable.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Steamworks
+{
+ public static partial class SteamMarshallerTable
+ {
+ // private static readonly FrozenDictionary> s_marshallerLookupTable;
+
+ private static partial class Impl
+ {
+ public static readonly Func Marshaller =
+ unmanaged => System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+ }
+
+ // partial, in generated file
+ // static ConditionalMarshallerTable();
+
+ public static T Marshal(IntPtr unmanagetype)
+ {
+ return Impl.Marshaller(unmanagetype);
+ }
+ }
+}
diff --git a/Standalone3.0/anycpu/autogen/NativeMethods.AnyCPU.cs b/Standalone3.0/anycpu/autogen/NativeMethods.AnyCPU.cs
new file mode 100644
index 00000000..6d1f8434
--- /dev/null
+++ b/Standalone3.0/anycpu/autogen/NativeMethods.AnyCPU.cs
@@ -0,0 +1,69 @@
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+
+#if STEAMWORKS_ANYCPU
+
+namespace Steamworks
+{
+ internal partial class NativeMethods
+ {
+ static NativeMethods() {
+ NativeLibrary.SetDllImportResolver(typeof(NativeMethods).Assembly, DllImportResolver);
+ }
+
+ private static IntPtr DllImportResolver(string libraryName, System.Reflection.Assembly assembly, DllImportSearchPath? searchPath) {
+ // check is requesting library name matches steam native
+ // we don't check requester here because we want to ensure we are the first loader of steam native
+ // otherwise other libraries may have already loaded steam native with wrong architecture
+ if (libraryName == NativeLibraryName || libraryName == NativeLibrary_SDKEncryptedAppTicket) {
+ // check are we on win64, the special case we are going to handle
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.Is64BitProcess) {
+ // modify library name to x64 version
+ libraryName = $"{libraryName}64";
+ }
+
+ if (!NativeLibrary.TryLoad(libraryName, assembly, searchPath, out nint lib)) {
+ // godot specific search
+ // in case of first chance search failed, build the full path of steam native, include extension name,
+ // and try load again, this is for the case when steam native is not in default `dlopen()` search path
+ // but in the same directory as the assembly.
+ string extension;
+ string libFilenamePrefix = "lib";
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+ extension = ".dylib";
+ else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
+ extension = ".dll";
+ libFilenamePrefix = ""; // no prefix is applied on Windows
+ } else
+ extension = ".so"; // I can't imagine what else platforms other than linux that
+ // Steamworks.NET.AnyCPU will run on, but let's be future proof
+
+ string searchDirectory = Path.GetDirectoryName(assembly.Location);
+
+ if (string.IsNullOrEmpty(searchDirectory)) {
+ System.Diagnostics.Debug.WriteLine("It seems you are loading Steamworks.NET.AnyCPU from memory," +
+ " auto-detect steam native location is not possible," +
+ " now trying to load from AppDomain.BaseDirectory." +
+ " If still fails, please call" +
+ " NativeLibrary.SetDllImporterResplver(typeof(Steamworks.SteamAPI).Assembly, YourResolver) manually.");
+
+ searchDirectory = AppDomain.CurrentDomain.BaseDirectory;
+ }
+
+ string path = Path.Combine(searchDirectory, Path.ChangeExtension(libFilenamePrefix + libraryName, extension));
+
+ // second chance search, not caring failures anymore
+ NativeLibrary.TryLoad(path, assembly, null, out lib);
+ }
+
+ return lib;
+ }
+
+ return 0;
+ }
+ }
+}
+#else
+#error This file is Steamworks.NET.AnyCPU specific, not applicable to other vairant
+#endif
diff --git a/Standalone3.0/anycpu/autogen/SteamMarshallerTable.g.cs b/Standalone3.0/anycpu/autogen/SteamMarshallerTable.g.cs
new file mode 100644
index 00000000..42f5017e
--- /dev/null
+++ b/Standalone3.0/anycpu/autogen/SteamMarshallerTable.g.cs
@@ -0,0 +1,307 @@
+// This file is provided under The MIT License as part of Steamworks.NET.
+// Copyright (c) 2013-2022 Riley Labrecque
+// Please see the included LICENSE.txt for additional information.
+
+// This file is automatically generated.
+// Changes to this file will be reverted when you update Steamworks.NET
+
+#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || UNITY_ANDROID || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
+ #define DISABLESTEAMWORKS
+#endif
+
+#if !DISABLESTEAMWORKS
+
+using System.Runtime.InteropServices;
+using IntPtr = System.IntPtr;
+
+///
+// This file is generated by CodeGen/src/struct.py
+
+#if !STEAMWORKS_ANYCPU
+#error This file for Any CPU variant, not meaningful to any other platform.
+#endif
+
+using System;
+using System.Collections.Frozen;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Steamworks {
+ public static partial class SteamMarshallerTable {
+ private static partial class Impl {
+ static Impl() {
+ if (typeof(T) == typeof(FileDetailsResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(FriendsGetFollowerCount_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(FriendsIsFollowing_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(FriendsEnumerateFollowingList_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(EquippedProfileItems_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(GSReputation_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(GSStatsReceived_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(GSStatsStored_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_NeedsPaint_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_StartRequest_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_URLChanged_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_FinishedRequest_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_OpenLinkInNewTab_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_ChangedTitle_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_LinkAtPosition_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_JSAlert_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_JSConfirm_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_FileOpenDialog_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_NewWindow_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_StatusText_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_ShowToolTip_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTML_UpdateToolTip_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTTPRequestCompleted_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTTPRequestHeadersReceived_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(HTTPRequestDataReceived_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamInputConfigurationLoaded_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamInputGamepadSlotChange_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamInventoryEligiblePromoItemDefIDs_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamInventoryStartPurchaseResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamPartyBeaconLocation_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(LobbyCreated_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(JoinPartyCallback_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(CreateBeaconCallback_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamNetConnectionStatusChangedCallback_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageFileShareResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStoragePublishFileResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageDeletePublishedFileResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageEnumerateUserPublishedFilesResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageSubscribePublishedFileResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageEnumerateUserSubscribedFilesResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageUnsubscribePublishedFileResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageUpdatePublishedFileResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageDownloadUGCResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageGetPublishedFileDetailsResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageEnumerateWorkshopFilesResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageGetPublishedItemVoteDetailsResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageUpdateUserPublishedItemVoteResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageUserVoteDetails_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageEnumerateUserSharedWorkshopFilesResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStorageSetUserPublishedFileActionResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoteStoragePublishedFileUpdated_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamUGCDetails_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(CreateItemResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(ItemInstalled_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(DownloadItemResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(AddUGCDependencyResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoveUGCDependencyResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(AddAppDependencyResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(RemoveAppDependencyResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(GetAppDependenciesResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(DeleteItemResult_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(ValidateAuthTicketResponse_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(MicroTxnAuthorizationResponse_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(LeaderboardEntry_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(LeaderboardScoreUploaded_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(LeaderboardUGCSet_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ if (typeof(T) == typeof(SteamNetConnectionInfo_t) && Packsize.IsLargePack)
+ Impl.Marshaller = (unmanaged) =>
+ System.Runtime.InteropServices.Marshal.PtrToStructure(unmanaged);
+
+ }
+ }
+ }
+}
+#endif // !DISABLESTEAMWORKS
diff --git a/com.rlabrecque.steamworks.net/Runtime/CallbackDispatcher.cs b/com.rlabrecque.steamworks.net/Runtime/CallbackDispatcher.cs
index 7fe17137..7f86a913 100644
--- a/com.rlabrecque.steamworks.net/Runtime/CallbackDispatcher.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/CallbackDispatcher.cs
@@ -12,17 +12,17 @@
#if !DISABLESTEAMWORKS
#if UNITY_3_5 || UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6
- #error Unsupported Unity platform. Steamworks.NET requires Unity 4.7 or higher.
+#error Unsupported Unity platform. Steamworks.NET requires Unity 4.7 or higher.
#elif UNITY_4_7 || UNITY_5 || UNITY_2017 || UNITY_2017_1_OR_NEWER
- #if UNITY_EDITOR_WIN || (UNITY_STANDALONE_WIN && !UNITY_EDITOR)
- #define WINDOWS_BUILD
- #endif
+#if UNITY_EDITOR_WIN || (UNITY_STANDALONE_WIN && !UNITY_EDITOR)
+#define WINDOWS_BUILD
+#endif
#elif STEAMWORKS_WIN
- #define WINDOWS_BUILD
+#define WINDOWS_BUILD
#elif STEAMWORKS_LIN_OSX
// So that we don't enter the else block below.
#else
- #error You need to define STEAMWORKS_WIN, or STEAMWORKS_LIN_OSX. Refer to the readme for more details.
+#error You need to define STEAMWORKS_WIN, or STEAMWORKS_LIN_OSX. Refer to the readme for more details.
#endif
using System;
@@ -31,6 +31,9 @@
using System.Runtime.InteropServices;
namespace Steamworks {
+ ///
+ /// Steamworks manual callback dispatcher
+ ///
public static class CallbackDispatcher {
public delegate void SteamworksExceptionHandler(Exception e);
@@ -41,7 +44,7 @@ private static void DefaultExceptionHandler(Exception e) {
#if UNITY_STANDALONE || UNITY_ANDROID
UnityEngine.Debug.LogException(e);
#elif STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
- Console.WriteLine(e.Message);
+ System.Diagnostics.Debug.WriteLine(e.ToString());
#endif
}
@@ -61,15 +64,18 @@ private static void DefaultExceptionHandler(Exception e) {
private static IntPtr m_pCallbackMsg;
private static int m_initCount;
- #if UNITY_2019_3_OR_NEWER
+#if UNITY_2019_3_OR_NEWER
// In case of disabled Domain Reload, reset static members before entering Play Mode.
[UnityEngine.RuntimeInitializeOnLoadMethod(UnityEngine.RuntimeInitializeLoadType.SubsystemRegistration)]
private static void InitOnPlayMode()
{
m_initCount = 0;
}
- #endif
+#endif
+ ///
+ /// Get a value indicates whether Steamworks manual callback dispatcher is initialized.
+ ///
public static bool IsInitialized {
get { return m_initCount > 0; }
}
@@ -96,7 +102,7 @@ internal static void Shutdown() {
}
internal static void Register(Callback cb) {
- int iCallback = CallbackIdentities.GetCallbackIdentity(cb.GetCallbackType());
+ int iCallback = cb.CallbackIdentity;
var callbacksRegistry = cb.IsGameServer ? m_registeredGameServerCallbacks : m_registeredCallbacks;
lock (m_sync) {
List callbacksList;
@@ -126,7 +132,7 @@ public static void Register(SteamAPICall_t asyncCall, CallResult cr) {
}
internal static void Unregister(Callback cb) {
- int iCallback = CallbackIdentities.GetCallbackIdentity(cb.GetCallbackType());
+ int iCallback = cb.CallbackIdentity;
var callbacksRegistry = cb.IsGameServer ? m_registeredGameServerCallbacks : m_registeredCallbacks;
lock (m_sync) {
List callbacksList;
@@ -235,14 +241,22 @@ internal static void RunFrame(bool isGameServer) {
///
[EditorBrowsable(EditorBrowsableState.Never)] // hide this class from intellisense
public abstract class Callback {
- public abstract bool IsGameServer { get; }
+#pragma warning disable SNETACPU1001 // Member is obsolete
+ internal protected virtual int CallbackIdentity { get => CallbackIdentities.GetCallbackIdentity(GetCallbackType()); }
+#pragma warning restore SNETACPU1001 // Reflection usage is good
+
+ public abstract bool IsGameServer { get; }
internal abstract Type GetCallbackType();
internal abstract void OnRunCallback(IntPtr pvParam);
internal abstract void SetUnregistered();
}
- public sealed class Callback : Callback, IDisposable {
- public delegate void DispatchDelegate(T param);
+ public sealed class Callback : Callback, IDisposable
+#if STEAMWORKS_ANYCPU
+ where T: struct, ISteamCallbackIdentity
+#endif
+ {
+ public delegate void DispatchDelegate(T param);
private event DispatchDelegate m_Func;
private bool m_bGameServer;
@@ -250,12 +264,17 @@ public sealed class Callback : Callback, IDisposable {
private bool m_bDisposed = false;
- ///
- /// Creates a new Callback. You must be calling SteamAPI.RunCallbacks() to retrieve the callbacks.
- /// Returns a handle to the Callback.
- /// This MUST be assigned to a member variable to prevent the GC from cleaning it up.
- ///
- public static Callback Create(DispatchDelegate func) {
+#if STEAMWORKS_ANYCPU
+ ///
+ internal protected sealed override int CallbackIdentity => T.CallbackIdentity;
+#endif
+
+ ///
+ /// Creates a new Callback. You must be calling SteamAPI.RunCallbacks() to retrieve the callbacks.
+ /// Returns a handle to the Callback.
+ /// This MUST be assigned to a member variable to prevent the GC from cleaning it up.
+ ///
+ public static Callback Create(DispatchDelegate func) {
return new Callback(func, bGameServer: false);
}
@@ -311,7 +330,8 @@ public void Unregister() {
m_bIsRegistered = false;
}
- public override bool IsGameServer {
+ ///
+ public override bool IsGameServer {
get { return m_bGameServer; }
}
@@ -321,8 +341,12 @@ internal override Type GetCallbackType() {
internal override void OnRunCallback(IntPtr pvParam) {
try {
+#if !STEAMWORKS_ANYCPU
m_Func(Marshal.PtrToStructure(pvParam));
- }
+#else
+ m_Func(SteamMarshallerTable.Marshal(pvParam));
+#endif
+ }
catch (Exception e) {
CallbackDispatcher.ExceptionHandler(e);
}
@@ -338,12 +362,18 @@ internal override void SetUnregistered() {
///
[EditorBrowsable(EditorBrowsableState.Never)] // hide this class from intellisense
public abstract class CallResult {
- internal protected abstract Type GetCallbackType();
+#pragma warning disable SNETACPU1001 // Member is obsolete
+ ///
+ internal protected virtual int CallbackIdentity { get => CallbackIdentities.GetCallbackIdentity(GetCallbackType()); }
+#pragma warning restore SNETACPU1001 // Reflection usage is good
+ internal protected abstract Type GetCallbackType();
internal protected abstract void OnRunCallResult(IntPtr pvParam, bool bFailed, ulong hSteamAPICall);
internal protected abstract void SetUnregistered();
}
- public sealed class CallResult : CallResult, IDisposable {
+ public sealed class CallResult : CallResult, IDisposable
+ where T: struct, ISteamCallbackIdentity
+ {
public delegate void APIDispatchDelegate(T param, bool bIOFailure);
private event APIDispatchDelegate m_Func;
@@ -352,12 +382,17 @@ public sealed class CallResult : CallResult, IDisposable {
private bool m_bDisposed = false;
- ///
- /// Creates a new async CallResult. You must be calling SteamAPI.RunCallbacks() to retrieve the callback.
- /// Returns a handle to the CallResult.
- /// This MUST be assigned to a member variable to prevent the GC from cleaning it up.
- ///
- public static CallResult Create(APIDispatchDelegate func = null) {
+#if STEAMWORKS_ANYCPU
+ ///
+ internal protected sealed override int CallbackIdentity => T.CallbackIdentity;
+#endif
+
+ ///
+ /// Creates a new async CallResult. You must be calling SteamAPI.RunCallbacks() to retrieve the callback.
+ /// Returns a handle to the CallResult.
+ /// This MUST be assigned to a member variable to prevent the GC from cleaning it up.
+ ///
+ public static CallResult Create(APIDispatchDelegate func = null) {
return new CallResult(func);
}
@@ -420,7 +455,13 @@ internal protected override void OnRunCallResult(IntPtr pvParam, bool bFailed, u
SteamAPICall_t hSteamAPICall = (SteamAPICall_t)hSteamAPICall_;
if (hSteamAPICall == m_hAPICall) {
try {
- m_Func(Marshal.PtrToStructure(pvParam), bFailed);
+ T result;
+#if !STEAMWORKS_ANYCPU
+ result = Marshal.PtrToStructure(pvParam));
+#else
+ result = SteamMarshallerTable.Marshal(pvParam);
+#endif
+ m_Func(result, bFailed);
}
catch (Exception e) {
CallbackDispatcher.ExceptionHandler(e);
diff --git a/com.rlabrecque.steamworks.net/Runtime/CallbackIdentity.cs b/com.rlabrecque.steamworks.net/Runtime/CallbackIdentity.cs
index 4f8e32bd..892a4abd 100644
--- a/com.rlabrecque.steamworks.net/Runtime/CallbackIdentity.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/CallbackIdentity.cs
@@ -11,8 +11,13 @@
#if !DISABLESTEAMWORKS
+using System;
+
namespace Steamworks {
class CallbackIdentities {
+#if STEAMWORKS_ANYCPU
+ [Obsolete("For Steamworks.NET.AnyCPU, use static property TCallback.CallbackIdentity for non reflection scenario.", DiagnosticId = "SNETACPU1001")]
+#endif
public static int GetCallbackIdentity(System.Type callbackStruct) {
#if UNITY_EDITOR || UNITY_STANDALONE || UNITY_ANDROID || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX
foreach (CallbackIdentityAttribute attribute in callbackStruct.GetCustomAttributes(typeof(CallbackIdentityAttribute), false)) {
diff --git a/com.rlabrecque.steamworks.net/Runtime/Packsize.cs b/com.rlabrecque.steamworks.net/Runtime/Packsize.cs
index 658a431c..0417f4ab 100644
--- a/com.rlabrecque.steamworks.net/Runtime/Packsize.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/Packsize.cs
@@ -9,6 +9,7 @@
#define DISABLESTEAMWORKS
#endif
+// We don't expose or use Packsize in the AnyCPU build.
#if !DISABLESTEAMWORKS
// If we're running in the Unity Editor we need the editors platform.
@@ -26,25 +27,28 @@
// We do not want to throw a warning when we're building in Unity but for an unsupported platform. So we'll silently let this slip by.
// It would be nice if Unity itself would define 'UNITY' or something like that...
#elif UNITY_3_5 || UNITY_4_0 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5 || UNITY_2017_1_OR_NEWER
- #define VALVE_CALLBACK_PACK_SMALL
+#define VALVE_CALLBACK_PACK_SMALL
// But we do want to be explicit on the Standalone build for XNA/Monogame.
#else
- #define VALVE_CALLBACK_PACK_LARGE
- #warning You need to define STEAMWORKS_WIN, or STEAMWORKS_LIN_OSX. Refer to the readme for more details.
+#define VALVE_CALLBACK_PACK_LARGE
+#warning You need to define STEAMWORKS_WIN, or STEAMWORKS_LIN_OSX. Refer to the readme for more details.
#endif
+using System;
using System.Runtime.InteropServices;
using IntPtr = System.IntPtr;
namespace Steamworks {
public static class Packsize {
#if VALVE_CALLBACK_PACK_LARGE
- public const int value = 8;
+ internal const int value = 8;
#elif VALVE_CALLBACK_PACK_SMALL
- public const int value = 4;
+ internal const int value = 4;
#endif
+ public static readonly int Value = value;
+#if !STEAMWORKS_ANYCPU
public static bool Test() {
int sentinelSize = Marshal.SizeOf();
int subscribedFilesSize = Marshal.SizeOf();
@@ -57,6 +61,26 @@ public static bool Test() {
#endif
return true;
}
+#else
+ ///
+ /// Get runtime determined value of structure pack size.
+ ///
+ public readonly static int AnyCpuRuntimeValue = InitializeRuntimeValue();
+
+ public readonly static bool IsLargePack = AnyCpuRuntimeValue == 8;
+
+ public readonly static bool IsSmallPack = AnyCpuRuntimeValue == 4;
+
+ private static int InitializeRuntimeValue()
+ {
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ return 8;
+ else
+ return 4;
+ }
+
+ public static bool Test() { return true; }
+#endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
struct ValvePackingSentinel_t {
diff --git a/com.rlabrecque.steamworks.net/Runtime/Steam.cs b/com.rlabrecque.steamworks.net/Runtime/Steam.cs
index 85f16a83..56598303 100644
--- a/com.rlabrecque.steamworks.net/Runtime/Steam.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/Steam.cs
@@ -1,4 +1,4 @@
-// This file is provided under The MIT License as part of Steamworks.NET.
+// This file is provided under The MIT License as part of Steamworks.NET.
// Copyright (c) 2013-2022 Riley Labrecque
// Please see the included LICENSE.txt for additional information.
@@ -8,7 +8,6 @@
#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || UNITY_ANDROID || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
#define DISABLESTEAMWORKS
#endif
-
#if !DISABLESTEAMWORKS
using System.Runtime.InteropServices;
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/NativeMethods.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/NativeMethods.cs
index f577b976..8d1b9795 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/NativeMethods.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/NativeMethods.cs
@@ -1,4 +1,4 @@
-// This file is provided under The MIT License as part of Steamworks.NET.
+// This file is provided under The MIT License as part of Steamworks.NET.
// Copyright (c) 2013-2022 Riley Labrecque
// Please see the included LICENSE.txt for additional information.
@@ -33,10 +33,11 @@
using System.Runtime.InteropServices;
using IntPtr = System.IntPtr;
+using SysPath = System.IO.Path;
namespace Steamworks {
[System.Security.SuppressUnmanagedCodeSecurity()]
- internal static class NativeMethods {
+ internal static partial class NativeMethods {
#if STEAMWORKS_WIN && STEAMWORKS_X64
internal const string NativeLibraryName = "steam_api64";
internal const string NativeLibrary_SDKEncryptedAppTicket = "sdkencryptedappticket64";
@@ -303,6 +304,10 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref ISteamNetworkingConnectionSignaling self, HSteamNetConnection hConn, ref SteamNetConnectionInfo_t info, IntPtr pMsg, int cbMsg);
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref ISteamNetworkingConnectionSignaling self, HSteamNetConnection hConn, ref SteamNetConnectionInfo_t_LargePack info_lp, IntPtr pMsg, int cbMsg);
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingConnectionSignaling_Release", CallingConvention = CallingConvention.Cdecl)]
public static extern void SteamAPI_ISteamNetworkingConnectionSignaling_Release(ref ISteamNetworkingConnectionSignaling self);
#endregion
@@ -1699,6 +1704,12 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamParties_GetBeaconDetails(IntPtr instancePtr, PartyBeaconID_t ulBeaconID, out CSteamID pSteamIDBeaconOwner, out SteamPartyBeaconLocation_t pLocation, IntPtr pchMetadata, int cchMetadata);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_GetBeaconDetails", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamParties_GetBeaconDetails(IntPtr instancePtr, PartyBeaconID_t ulBeaconID, out CSteamID pSteamIDBeaconOwner, out SteamPartyBeaconLocation_t_LargePack pLocation_lp, IntPtr pchMetadata, int cchMetadata);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_JoinParty", CallingConvention = CallingConvention.Cdecl)]
public static extern ulong ISteamParties_JoinParty(IntPtr instancePtr, PartyBeaconID_t ulBeaconID);
@@ -1710,9 +1721,20 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamParties_GetAvailableBeaconLocations(IntPtr instancePtr, [In, Out] SteamPartyBeaconLocation_t[] pLocationList, uint uMaxNumLocations);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_GetAvailableBeaconLocations", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamParties_GetAvailableBeaconLocations(IntPtr instancePtr, [In, Out] SteamPartyBeaconLocation_t_LargePack[] pLocationList_lp, uint uMaxNumLocations);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_CreateBeacon", CallingConvention = CallingConvention.Cdecl)]
public static extern ulong ISteamParties_CreateBeacon(IntPtr instancePtr, uint unOpenSlots, ref SteamPartyBeaconLocation_t pBeaconLocation, InteropHelp.UTF8StringHandle pchConnectString, InteropHelp.UTF8StringHandle pchMetadata);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_CreateBeacon", CallingConvention = CallingConvention.Cdecl)]
+ public static extern ulong ISteamParties_CreateBeacon(IntPtr instancePtr, uint unOpenSlots, ref SteamPartyBeaconLocation_t_LargePack pBeaconLocation_lp, InteropHelp.UTF8StringHandle pchConnectString, InteropHelp.UTF8StringHandle pchMetadata);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_OnReservationCompleted", CallingConvention = CallingConvention.Cdecl)]
public static extern void ISteamParties_OnReservationCompleted(IntPtr instancePtr, PartyBeaconID_t ulBeacon, CSteamID steamIDUser);
@@ -1729,6 +1751,12 @@ internal static class NativeMethods {
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_GetBeaconLocationData", CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamParties_GetBeaconLocationData(IntPtr instancePtr, SteamPartyBeaconLocation_t BeaconLocation, ESteamPartyBeaconLocationData eData, IntPtr pchDataStringOut, int cchDataStringOut);
+
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamParties_GetBeaconLocationData", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamParties_GetBeaconLocationData(IntPtr instancePtr, SteamPartyBeaconLocation_t_LargePack BeaconLocation_lp, ESteamPartyBeaconLocationData eData, IntPtr pchDataStringOut, int cchDataStringOut);
+ #endif
#endregion
#region SteamMusic
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamMusic_BIsEnabled", CallingConvention = CallingConvention.Cdecl)]
@@ -1865,6 +1893,11 @@ internal static class NativeMethods {
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingMessages_GetSessionConnectionInfo", CallingConvention = CallingConvention.Cdecl)]
public static extern ESteamNetworkingConnectionState ISteamNetworkingMessages_GetSessionConnectionInfo(IntPtr instancePtr, ref SteamNetworkingIdentity identityRemote, out SteamNetConnectionInfo_t pConnectionInfo, out SteamNetConnectionRealTimeStatus_t pQuickStatus);
+
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingMessages_GetSessionConnectionInfo", CallingConvention = CallingConvention.Cdecl)]
+ public static extern ESteamNetworkingConnectionState ISteamNetworkingMessages_GetSessionConnectionInfo(IntPtr instancePtr, ref SteamNetworkingIdentity identityRemote, out SteamNetConnectionInfo_t_LargePack pConnectionInfo_lp, out SteamNetConnectionRealTimeStatus_t pQuickStatus);
+ #endif
#endregion
#region SteamNetworkingSockets
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingSockets_CreateListenSocketIP", CallingConvention = CallingConvention.Cdecl)]
@@ -1920,6 +1953,12 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamNetworkingSockets_GetConnectionInfo(IntPtr instancePtr, HSteamNetConnection hConn, out SteamNetConnectionInfo_t pInfo);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingSockets_GetConnectionInfo", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamNetworkingSockets_GetConnectionInfo(IntPtr instancePtr, HSteamNetConnection hConn, out SteamNetConnectionInfo_t_LargePack pInfo_lp);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamNetworkingSockets_GetConnectionRealTimeStatus", CallingConvention = CallingConvention.Cdecl)]
public static extern EResult ISteamNetworkingSockets_GetConnectionRealTimeStatus(IntPtr instancePtr, HSteamNetConnection hConn, ref SteamNetConnectionRealTimeStatus_t pStatus, int nLanes, ref SteamNetConnectionRealTimeLaneStatus_t pLanes);
@@ -2511,6 +2550,12 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamUGC_GetQueryUGCResult(IntPtr instancePtr, UGCQueryHandle_t handle, uint index, out SteamUGCDetails_t pDetails);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetQueryUGCResult", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamUGC_GetQueryUGCResult(IntPtr instancePtr, UGCQueryHandle_t handle, uint index, out SteamUGCDetails_t_LargePack pDetails_lp);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamUGC_GetQueryUGCNumTags", CallingConvention = CallingConvention.Cdecl)]
public static extern uint ISteamUGC_GetQueryUGCNumTags(IntPtr instancePtr, UGCQueryHandle_t handle, uint index);
@@ -3067,6 +3112,12 @@ internal static class NativeMethods {
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool ISteamUserStats_GetDownloadedLeaderboardEntry(IntPtr instancePtr, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, out LeaderboardEntry_t pLeaderboardEntry, [In, Out] int[] pDetails, int cDetailsMax);
+ #if STEAMWORKS_ANYCPU
+ [DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamUserStats_GetDownloadedLeaderboardEntry", CallingConvention = CallingConvention.Cdecl)]
+ [return: MarshalAs(UnmanagedType.I1)]
+ public static extern bool ISteamUserStats_GetDownloadedLeaderboardEntry(IntPtr instancePtr, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, out LeaderboardEntry_t_LargePack pLeaderboardEntry_lp, [In, Out] int[] pDetails, int cDetailsMax);
+ #endif
+
[DllImport(NativeLibraryName, EntryPoint = "SteamAPI_ISteamUserStats_UploadLeaderboardScore", CallingConvention = CallingConvention.Cdecl)]
public static extern ulong ISteamUserStats_UploadLeaderboardScore(IntPtr instancePtr, SteamLeaderboard_t hSteamLeaderboard, ELeaderboardUploadScoreMethod eLeaderboardUploadScoreMethod, int nScore, [In, Out] int[] pScoreDetails, int cScoreDetailsCount);
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamCallbacks.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamCallbacks.cs
index 97fd2854..5e5ec90b 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamCallbacks.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamCallbacks.cs
@@ -21,8 +21,13 @@ namespace Steamworks {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamAppsCallbacks + 5)]
- public struct DlcInstalled_t {
+ public struct DlcInstalled_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamAppsCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamAppsCallbacks + 5;
public AppId_t m_nAppID; // AppID of the DLC
}
@@ -34,8 +39,13 @@ public struct DlcInstalled_t {
//---------------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamAppsCallbacks + 14)]
- public struct NewUrlLaunchParameters_t {
+ public struct NewUrlLaunchParameters_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamAppsCallbacks + 14;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamAppsCallbacks + 14;
}
//-----------------------------------------------------------------------------
@@ -44,13 +54,18 @@ public struct NewUrlLaunchParameters_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamAppsCallbacks + 21)]
- public struct AppProofOfPurchaseKeyResponse_t {
+ public struct AppProofOfPurchaseKeyResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamAppsCallbacks + 21;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamAppsCallbacks + 21;
public EResult m_eResult;
public uint m_nAppID;
public uint m_cchKeyLength;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cubAppProofOfPurchaseKeyMax)]
- private byte[] m_rgchKey_;
+ internal byte[] m_rgchKey_;
public string m_rgchKey
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchKey_); }
@@ -63,8 +78,13 @@ public string m_rgchKey
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamAppsCallbacks + 23)]
- public struct FileDetailsResult_t {
+ public struct FileDetailsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamAppsCallbacks + 23;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamAppsCallbacks + 23;
public EResult m_eResult;
public ulong m_ulFileSize; // original file size in bytes
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
@@ -72,13 +92,51 @@ public struct FileDetailsResult_t {
public uint m_unFlags; //
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: response to GetFileDetails
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamAppsCallbacks + 23)]
+ internal struct FileDetailsResult_t_LargePack {
+ public EResult m_eResult;
+ public ulong m_ulFileSize; // original file size in bytes
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
+ public byte[] m_FileSHA; // original file SHA1 hash
+ public uint m_unFlags; //
+
+ public static implicit operator FileDetailsResult_t(FileDetailsResult_t_LargePack value) {
+ FileDetailsResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulFileSize = value.m_ulFileSize;
+ result.m_FileSHA = value.m_FileSHA;
+ result.m_unFlags = value.m_unFlags;
+ return result;
+ }
+
+ public static implicit operator FileDetailsResult_t_LargePack(FileDetailsResult_t value) {
+ FileDetailsResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulFileSize = value.m_ulFileSize;
+ result.m_FileSHA = value.m_FileSHA;
+ result.m_unFlags = value.m_unFlags;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: called for games in Timed Trial mode
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamAppsCallbacks + 30)]
- public struct TimedTrialStatus_t {
+ public struct TimedTrialStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamAppsCallbacks + 30;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamAppsCallbacks + 30;
public AppId_t m_unAppID; // appID
[MarshalAs(UnmanagedType.I1)]
public bool m_bIsOffline; // if true, time allowed / played refers to offline time, not total time
@@ -92,8 +150,13 @@ public struct TimedTrialStatus_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 4)]
- public struct PersonaStateChange_t {
+ public struct PersonaStateChange_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 4;
public ulong m_ulSteamID; // steamID of the friend who changed
public EPersonaChange m_nChangeFlags; // what's changed
@@ -105,8 +168,13 @@ public struct PersonaStateChange_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 31)]
- public struct GameOverlayActivated_t {
+ public struct GameOverlayActivated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 31;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 31;
public byte m_bActive; // true if it's just been activated, false otherwise
[MarshalAs(UnmanagedType.I1)]
public bool m_bUserInitiated; // true if the user asked for the overlay to be activated/deactivated
@@ -120,17 +188,22 @@ public struct GameOverlayActivated_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 32)]
- public struct GameServerChangeRequested_t {
+ public struct GameServerChangeRequested_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 32;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 32;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
- private byte[] m_rgchServer_;
+ internal byte[] m_rgchServer_;
public string m_rgchServer // server address ("127.0.0.1:27015", "tf2.valvesoftware.com")
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchServer_); }
set { InteropHelp.StringToByteArrayUTF8(value, m_rgchServer_, 64); }
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
- private byte[] m_rgchPassword_;
+ internal byte[] m_rgchPassword_;
public string m_rgchPassword // server password, if any
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchPassword_); }
@@ -144,8 +217,13 @@ public struct GameServerChangeRequested_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 33)]
- public struct GameLobbyJoinRequested_t {
+ public struct GameLobbyJoinRequested_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 33;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 33;
public CSteamID m_steamIDLobby;
// The friend they did the join via (will be invalid if not directly via a friend)
@@ -158,8 +236,13 @@ public struct GameLobbyJoinRequested_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 34)]
- public struct AvatarImageLoaded_t {
+ public struct AvatarImageLoaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 34;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 34;
public CSteamID m_steamID; // steamid the avatar has been loaded for
public int m_iImage; // the image index of the now loaded image
public int m_iWide; // width of the loaded image
@@ -171,8 +254,13 @@ public struct AvatarImageLoaded_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 35)]
- public struct ClanOfficerListResponse_t {
+ public struct ClanOfficerListResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 35;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 35;
public CSteamID m_steamIDClan;
public int m_cOfficers;
public byte m_bSuccess;
@@ -183,8 +271,13 @@ public struct ClanOfficerListResponse_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 36)]
- public struct FriendRichPresenceUpdate_t {
+ public struct FriendRichPresenceUpdate_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 36;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 36;
public CSteamID m_steamIDFriend; // friend who's rich presence has changed
public AppId_t m_nAppID; // the appID of the game (should always be the current game)
}
@@ -195,11 +288,16 @@ public struct FriendRichPresenceUpdate_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 37)]
- public struct GameRichPresenceJoinRequested_t {
+ public struct GameRichPresenceJoinRequested_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 37;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 37;
public CSteamID m_steamIDFriend; // the friend they did the join via (will be invalid if not directly via a friend)
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchMaxRichPresenceValueLength)]
- private byte[] m_rgchConnect_;
+ internal byte[] m_rgchConnect_;
public string m_rgchConnect
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchConnect_); }
@@ -212,8 +310,13 @@ public string m_rgchConnect
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 38)]
- public struct GameConnectedClanChatMsg_t {
+ public struct GameConnectedClanChatMsg_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 38;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 38;
public CSteamID m_steamIDClanChat;
public CSteamID m_steamIDUser;
public int m_iMessageID;
@@ -224,8 +327,13 @@ public struct GameConnectedClanChatMsg_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 39)]
- public struct GameConnectedChatJoin_t {
+ public struct GameConnectedChatJoin_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 39;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 39;
public CSteamID m_steamIDClanChat;
public CSteamID m_steamIDUser;
}
@@ -235,8 +343,13 @@ public struct GameConnectedChatJoin_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 1)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 40)]
- public struct GameConnectedChatLeave_t {
+ public struct GameConnectedChatLeave_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 40;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 40;
public CSteamID m_steamIDClanChat;
public CSteamID m_steamIDUser;
[MarshalAs(UnmanagedType.I1)]
@@ -250,8 +363,13 @@ public struct GameConnectedChatLeave_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 41)]
- public struct DownloadClanActivityCountsResult_t {
+ public struct DownloadClanActivityCountsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 41;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 41;
[MarshalAs(UnmanagedType.I1)]
public bool m_bSuccess;
}
@@ -261,8 +379,13 @@ public struct DownloadClanActivityCountsResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 42)]
- public struct JoinClanChatRoomCompletionResult_t {
+ public struct JoinClanChatRoomCompletionResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 42;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 42;
public CSteamID m_steamIDClanChat;
public EChatRoomEnterResponse m_eChatRoomEnterResponse;
}
@@ -272,49 +395,157 @@ public struct JoinClanChatRoomCompletionResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 43)]
- public struct GameConnectedFriendChatMsg_t {
+ public struct GameConnectedFriendChatMsg_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 43;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 43;
public CSteamID m_steamIDUser;
public int m_iMessageID;
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 44)]
- public struct FriendsGetFollowerCount_t {
+ public struct FriendsGetFollowerCount_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 44;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 44;
+ public EResult m_eResult;
+ public CSteamID m_steamID;
+ public int m_nCount;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 44)]
+ internal struct FriendsGetFollowerCount_t_LargePack {
public EResult m_eResult;
public CSteamID m_steamID;
public int m_nCount;
+
+ public static implicit operator FriendsGetFollowerCount_t(FriendsGetFollowerCount_t_LargePack value) {
+ FriendsGetFollowerCount_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_nCount = value.m_nCount;
+ return result;
+ }
+
+ public static implicit operator FriendsGetFollowerCount_t_LargePack(FriendsGetFollowerCount_t value) {
+ FriendsGetFollowerCount_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_nCount = value.m_nCount;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 45)]
- public struct FriendsIsFollowing_t {
+ public struct FriendsIsFollowing_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 45;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 45;
+ public EResult m_eResult;
+ public CSteamID m_steamID;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bIsFollowing;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 45)]
+ internal struct FriendsIsFollowing_t_LargePack {
public EResult m_eResult;
public CSteamID m_steamID;
[MarshalAs(UnmanagedType.I1)]
public bool m_bIsFollowing;
+
+ public static implicit operator FriendsIsFollowing_t(FriendsIsFollowing_t_LargePack value) {
+ FriendsIsFollowing_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_bIsFollowing = value.m_bIsFollowing;
+ return result;
+ }
+
+ public static implicit operator FriendsIsFollowing_t_LargePack(FriendsIsFollowing_t value) {
+ FriendsIsFollowing_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_bIsFollowing = value.m_bIsFollowing;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 46)]
- public struct FriendsEnumerateFollowingList_t {
+ public struct FriendsEnumerateFollowingList_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 46;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 46;
+ public EResult m_eResult;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cEnumerateFollowersMax)]
+ public CSteamID[] m_rgSteamID;
+ public int m_nResultsReturned;
+ public int m_nTotalResultCount;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 46)]
+ internal struct FriendsEnumerateFollowingList_t_LargePack {
public EResult m_eResult;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cEnumerateFollowersMax)]
public CSteamID[] m_rgSteamID;
public int m_nResultsReturned;
public int m_nTotalResultCount;
+
+ public static implicit operator FriendsEnumerateFollowingList_t(FriendsEnumerateFollowingList_t_LargePack value) {
+ FriendsEnumerateFollowingList_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_rgSteamID = value.m_rgSteamID;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ return result;
+ }
+
+ public static implicit operator FriendsEnumerateFollowingList_t_LargePack(FriendsEnumerateFollowingList_t value) {
+ FriendsEnumerateFollowingList_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_rgSteamID = value.m_rgSteamID;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: Invoked when the status of unread messages changes
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 48)]
- public struct UnreadChatMessagesChanged_t {
+ public struct UnreadChatMessagesChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 48;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 48;
}
//-----------------------------------------------------------------------------
@@ -322,10 +553,15 @@ public struct UnreadChatMessagesChanged_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 49)]
- public struct OverlayBrowserProtocolNavigation_t {
+ public struct OverlayBrowserProtocolNavigation_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 49;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 49;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
- private byte[] rgchURI_;
+ internal byte[] rgchURI_;
public string rgchURI
{
get { return InteropHelp.ByteArrayToStringUTF8(rgchURI_); }
@@ -338,8 +574,13 @@ public string rgchURI
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 50)]
- public struct EquippedProfileItemsChanged_t {
+ public struct EquippedProfileItemsChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 50;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 50;
public CSteamID m_steamID;
}
@@ -348,8 +589,36 @@ public struct EquippedProfileItemsChanged_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 51)]
- public struct EquippedProfileItems_t {
+ public struct EquippedProfileItems_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamFriendsCallbacks + 51;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamFriendsCallbacks + 51;
+ public EResult m_eResult;
+ public CSteamID m_steamID;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bHasAnimatedAvatar;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bHasAvatarFrame;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bHasProfileModifier;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bHasProfileBackground;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bHasMiniProfileBackground;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bFromCache;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose:
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamFriendsCallbacks + 51)]
+ internal struct EquippedProfileItems_t_LargePack {
public EResult m_eResult;
public CSteamID m_steamID;
[MarshalAs(UnmanagedType.I1)]
@@ -364,30 +633,72 @@ public struct EquippedProfileItems_t {
public bool m_bHasMiniProfileBackground;
[MarshalAs(UnmanagedType.I1)]
public bool m_bFromCache;
+
+ public static implicit operator EquippedProfileItems_t(EquippedProfileItems_t_LargePack value) {
+ EquippedProfileItems_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_bHasAnimatedAvatar = value.m_bHasAnimatedAvatar;
+ result.m_bHasAvatarFrame = value.m_bHasAvatarFrame;
+ result.m_bHasProfileModifier = value.m_bHasProfileModifier;
+ result.m_bHasProfileBackground = value.m_bHasProfileBackground;
+ result.m_bHasMiniProfileBackground = value.m_bHasMiniProfileBackground;
+ result.m_bFromCache = value.m_bFromCache;
+ return result;
+ }
+
+ public static implicit operator EquippedProfileItems_t_LargePack(EquippedProfileItems_t value) {
+ EquippedProfileItems_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamID = value.m_steamID;
+ result.m_bHasAnimatedAvatar = value.m_bHasAnimatedAvatar;
+ result.m_bHasAvatarFrame = value.m_bHasAvatarFrame;
+ result.m_bHasProfileModifier = value.m_bHasProfileModifier;
+ result.m_bHasProfileBackground = value.m_bHasProfileBackground;
+ result.m_bHasMiniProfileBackground = value.m_bHasMiniProfileBackground;
+ result.m_bFromCache = value.m_bFromCache;
+ return result;
+ }
}
+ #endif
// callbacks
// callback notification - A new message is available for reading from the message queue
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameCoordinatorCallbacks + 1)]
- public struct GCMessageAvailable_t {
+ public struct GCMessageAvailable_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameCoordinatorCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameCoordinatorCallbacks + 1;
public uint m_nMessageSize;
}
// callback notification - A message failed to make it to the GC. It may be down temporarily
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamGameCoordinatorCallbacks + 2)]
- public struct GCMessageFailed_t {
+ public struct GCMessageFailed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameCoordinatorCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameCoordinatorCallbacks + 2;
}
// callbacks
// client has been approved to connect to this game server
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 1)]
- public struct GSClientApprove_t {
+ public struct GSClientApprove_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 1;
public CSteamID m_SteamID; // SteamID of approved player
public CSteamID m_OwnerSteamID; // SteamID of original owner for game license
}
@@ -395,12 +706,17 @@ public struct GSClientApprove_t {
// client has been denied to connection to this game server
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 2)]
- public struct GSClientDeny_t {
+ public struct GSClientDeny_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 2;
public CSteamID m_SteamID;
public EDenyReason m_eDenyReason;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
- private byte[] m_rgchOptionalText_;
+ internal byte[] m_rgchOptionalText_;
public string m_rgchOptionalText
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchOptionalText_); }
@@ -411,8 +727,13 @@ public string m_rgchOptionalText
// request the game server should kick the user
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 3)]
- public struct GSClientKick_t {
+ public struct GSClientKick_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 3;
public CSteamID m_SteamID;
public EDenyReason m_eDenyReason;
}
@@ -422,11 +743,16 @@ public struct GSClientKick_t {
// client achievement info
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 6)]
- public struct GSClientAchievementStatus_t {
+ public struct GSClientAchievementStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 6;
public ulong m_SteamID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
- private byte[] m_pchAchievement_;
+ internal byte[] m_pchAchievement_;
public string m_pchAchievement
{
get { return InteropHelp.ByteArrayToStringUTF8(m_pchAchievement_); }
@@ -440,16 +766,26 @@ public string m_pchAchievement
// m_bSecure is true if the game server should display itself as secure to users, false otherwise
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 15)]
- public struct GSPolicyResponse_t {
+ public struct GSPolicyResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 15;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 15;
public byte m_bSecure;
}
// GS gameplay stats info
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 7)]
- public struct GSGameplayStats_t {
+ public struct GSGameplayStats_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 7;
public EResult m_eResult; // Result of the call
public int m_nRank; // Overall rank of the server (0-based)
public uint m_unTotalConnects; // Total number of clients who have ever connected to the server
@@ -459,8 +795,13 @@ public struct GSGameplayStats_t {
// send as a reply to RequestUserGroupStatus()
[StructLayout(LayoutKind.Sequential, Pack = 1)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 8)]
- public struct GSClientGroupStatus_t {
+ public struct GSClientGroupStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 8;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 8;
public CSteamID m_SteamIDUser;
public CSteamID m_SteamIDGroup;
[MarshalAs(UnmanagedType.I1)]
@@ -472,8 +813,35 @@ public struct GSClientGroupStatus_t {
// Sent as a reply to GetServerReputation()
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 9)]
- public struct GSReputation_t {
+ public struct GSReputation_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 9;
+ public EResult m_eResult; // Result of the call;
+ public uint m_unReputationScore; // The reputation score for the game server
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bBanned; // True if the server is banned from the Steam
+ // master servers
+
+ // The following members are only filled out if m_bBanned is true. They will all
+ // be set to zero otherwise. Master server bans are by IP so it is possible to be
+ // banned even when the score is good high if there is a bad server on another port.
+ // This information can be used to determine which server is bad.
+
+ public uint m_unBannedIP; // The IP of the banned server
+ public ushort m_usBannedPort; // The port of the banned server
+ public ulong m_ulBannedGameID; // The game ID the banned server is serving
+ public uint m_unBanExpires; // Time the ban expires, expressed in the Unix epoch (seconds since 1/1/1970)
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // Sent as a reply to GetServerReputation()
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 9)]
+ internal struct GSReputation_t_LargePack {
public EResult m_eResult; // Result of the call;
public uint m_unReputationScore; // The reputation score for the game server
[MarshalAs(UnmanagedType.I1)]
@@ -489,21 +857,56 @@ public struct GSReputation_t {
public ushort m_usBannedPort; // The port of the banned server
public ulong m_ulBannedGameID; // The game ID the banned server is serving
public uint m_unBanExpires; // Time the ban expires, expressed in the Unix epoch (seconds since 1/1/1970)
+
+ public static implicit operator GSReputation_t(GSReputation_t_LargePack value) {
+ GSReputation_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_unReputationScore = value.m_unReputationScore;
+ result.m_bBanned = value.m_bBanned;
+ result.m_unBannedIP = value.m_unBannedIP;
+ result.m_usBannedPort = value.m_usBannedPort;
+ result.m_ulBannedGameID = value.m_ulBannedGameID;
+ result.m_unBanExpires = value.m_unBanExpires;
+ return result;
+ }
+
+ public static implicit operator GSReputation_t_LargePack(GSReputation_t value) {
+ GSReputation_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_unReputationScore = value.m_unReputationScore;
+ result.m_bBanned = value.m_bBanned;
+ result.m_unBannedIP = value.m_unBannedIP;
+ result.m_usBannedPort = value.m_usBannedPort;
+ result.m_ulBannedGameID = value.m_ulBannedGameID;
+ result.m_unBanExpires = value.m_unBanExpires;
+ return result;
+ }
}
+ #endif
// Sent as a reply to AssociateWithClan()
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 10)]
- public struct AssociateWithClanResult_t {
+ public struct AssociateWithClanResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 10;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 10;
public EResult m_eResult; // Result of the call;
}
// Sent as a reply to ComputeNewPlayerCompatibility()
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamGameServerCallbacks + 11)]
- public struct ComputeNewPlayerCompatibilityResult_t {
+ public struct ComputeNewPlayerCompatibilityResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerCallbacks + 11;
public EResult m_eResult; // Result of the call;
public int m_cPlayersThatDontLikeCandidate;
public int m_cPlayersThatCandidateDoesntLike;
@@ -518,31 +921,100 @@ public struct ComputeNewPlayerCompatibilityResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamGameServerStatsCallbacks)]
- public struct GSStatsReceived_t {
+ public struct GSStatsReceived_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerStatsCallbacks;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerStatsCallbacks;
+ public EResult m_eResult; // Success / error fetching the stats
+ public CSteamID m_steamIDUser; // The user for whom the stats are retrieved for
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // callbacks
+ //-----------------------------------------------------------------------------
+ // Purpose: called when the latests stats and achievements have been received
+ // from the server
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamGameServerStatsCallbacks)]
+ internal struct GSStatsReceived_t_LargePack {
public EResult m_eResult; // Success / error fetching the stats
public CSteamID m_steamIDUser; // The user for whom the stats are retrieved for
+
+ public static implicit operator GSStatsReceived_t(GSStatsReceived_t_LargePack value) {
+ GSStatsReceived_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamIDUser = value.m_steamIDUser;
+ return result;
+ }
+
+ public static implicit operator GSStatsReceived_t_LargePack(GSStatsReceived_t value) {
+ GSStatsReceived_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamIDUser = value.m_steamIDUser;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: result of a request to store the user stats for a game
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamGameServerStatsCallbacks + 1)]
- public struct GSStatsStored_t {
+ public struct GSStatsStored_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamGameServerStatsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamGameServerStatsCallbacks + 1;
+ public EResult m_eResult; // success / error
+ public CSteamID m_steamIDUser; // The user for whom the stats were stored
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: result of a request to store the user stats for a game
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamGameServerStatsCallbacks + 1)]
+ internal struct GSStatsStored_t_LargePack {
public EResult m_eResult; // success / error
public CSteamID m_steamIDUser; // The user for whom the stats were stored
+
+ public static implicit operator GSStatsStored_t(GSStatsStored_t_LargePack value) {
+ GSStatsStored_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamIDUser = value.m_steamIDUser;
+ return result;
+ }
+
+ public static implicit operator GSStatsStored_t_LargePack(GSStatsStored_t value) {
+ GSStatsStored_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_steamIDUser = value.m_steamIDUser;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: Callback indicating that a user's stats have been unloaded.
// Call RequestUserStats again to access stats for this user
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 8)]
- public struct GSStatsUnloaded_t {
+ public struct GSStatsUnloaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 8;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 8;
public CSteamID m_steamIDUser; // User whose stats have been unloaded
}
@@ -552,8 +1024,13 @@ public struct GSStatsUnloaded_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 1)]
- public struct HTML_BrowserReady_t {
+ public struct HTML_BrowserReady_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 1;
public HHTMLBrowser unBrowserHandle; // this browser is now fully created and ready to navigate to pages
}
@@ -562,8 +1039,34 @@ public struct HTML_BrowserReady_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 2)]
- public struct HTML_NeedsPaint_t {
+ public struct HTML_NeedsPaint_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 2;
+ public HHTMLBrowser unBrowserHandle; // the browser that needs the paint
+ public IntPtr pBGRA; // a pointer to the B8G8R8A8 data for this surface, valid until SteamAPI_RunCallbacks is next called
+ public uint unWide; // the total width of the pBGRA texture
+ public uint unTall; // the total height of the pBGRA texture
+ public uint unUpdateX; // the offset in X for the damage rect for this update
+ public uint unUpdateY; // the offset in Y for the damage rect for this update
+ public uint unUpdateWide; // the width of the damage rect for this update
+ public uint unUpdateTall; // the height of the damage rect for this update
+ public uint unScrollX; // the page scroll the browser was at when this texture was rendered
+ public uint unScrollY; // the page scroll the browser was at when this texture was rendered
+ public float flPageScale; // the page scale factor on this page when rendered
+ public uint unPageSerial; // incremented on each new page load, you can use this to reject draws while navigating to new pages
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: the browser has a pending paint
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 2)]
+ internal struct HTML_NeedsPaint_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the browser that needs the paint
public IntPtr pBGRA; // a pointer to the B8G8R8A8 data for this surface, valid until SteamAPI_RunCallbacks is next called
public uint unWide; // the total width of the pBGRA texture
@@ -576,31 +1079,113 @@ public struct HTML_NeedsPaint_t {
public uint unScrollY; // the page scroll the browser was at when this texture was rendered
public float flPageScale; // the page scale factor on this page when rendered
public uint unPageSerial; // incremented on each new page load, you can use this to reject draws while navigating to new pages
+
+ public static implicit operator HTML_NeedsPaint_t(HTML_NeedsPaint_t_LargePack value) {
+ HTML_NeedsPaint_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pBGRA = value.pBGRA;
+ result.unWide = value.unWide;
+ result.unTall = value.unTall;
+ result.unUpdateX = value.unUpdateX;
+ result.unUpdateY = value.unUpdateY;
+ result.unUpdateWide = value.unUpdateWide;
+ result.unUpdateTall = value.unUpdateTall;
+ result.unScrollX = value.unScrollX;
+ result.unScrollY = value.unScrollY;
+ result.flPageScale = value.flPageScale;
+ result.unPageSerial = value.unPageSerial;
+ return result;
+ }
+
+ public static implicit operator HTML_NeedsPaint_t_LargePack(HTML_NeedsPaint_t value) {
+ HTML_NeedsPaint_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pBGRA = value.pBGRA;
+ result.unWide = value.unWide;
+ result.unTall = value.unTall;
+ result.unUpdateX = value.unUpdateX;
+ result.unUpdateY = value.unUpdateY;
+ result.unUpdateWide = value.unUpdateWide;
+ result.unUpdateTall = value.unUpdateTall;
+ result.unScrollX = value.unScrollX;
+ result.unScrollY = value.unScrollY;
+ result.flPageScale = value.flPageScale;
+ result.unPageSerial = value.unPageSerial;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The browser wanted to navigate to a new page
// NOTE - you MUST call AllowStartRequest in response to this callback
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 3)]
- public struct HTML_StartRequest_t {
+ public struct HTML_StartRequest_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 3;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface navigating
+ public string pchURL; // the url they wish to navigate to
+ public string pchTarget; // the html link target type (i.e _blank, _self, _parent, _top )
+ public string pchPostData; // any posted data for the request
+ [MarshalAs(UnmanagedType.I1)]
+ public bool bIsRedirect; // true if this was a http/html redirect from the last load request
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The browser wanted to navigate to a new page
+ // NOTE - you MUST call AllowStartRequest in response to this callback
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 3)]
+ internal struct HTML_StartRequest_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface navigating
public string pchURL; // the url they wish to navigate to
public string pchTarget; // the html link target type (i.e _blank, _self, _parent, _top )
public string pchPostData; // any posted data for the request
[MarshalAs(UnmanagedType.I1)]
public bool bIsRedirect; // true if this was a http/html redirect from the last load request
+
+ public static implicit operator HTML_StartRequest_t(HTML_StartRequest_t_LargePack value) {
+ HTML_StartRequest_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchTarget = value.pchTarget;
+ result.pchPostData = value.pchPostData;
+ result.bIsRedirect = value.bIsRedirect;
+ return result;
+ }
+
+ public static implicit operator HTML_StartRequest_t_LargePack(HTML_StartRequest_t value) {
+ HTML_StartRequest_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchTarget = value.pchTarget;
+ result.pchPostData = value.pchPostData;
+ result.bIsRedirect = value.bIsRedirect;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The browser has been requested to close due to user interaction (usually from a javascript window.close() call)
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 4)]
- public struct HTML_CloseBrowser_t {
+ public struct HTML_CloseBrowser_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 4;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
}
@@ -609,8 +1194,13 @@ public struct HTML_CloseBrowser_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 5)]
- public struct HTML_URLChanged_t {
+ public struct HTML_URLChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 5;
public HHTMLBrowser unBrowserHandle; // the handle of the surface navigating
public string pchURL; // the url they wish to navigate to
public string pchPostData; // any posted data for the request
@@ -621,47 +1211,188 @@ public struct HTML_URLChanged_t {
public bool bNewNavigation; // true if this was from a fresh tab and not a click on an existing page
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: the browser is navigating to a new url
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 5)]
+ internal struct HTML_URLChanged_t_LargePack {
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface navigating
+ public string pchURL; // the url they wish to navigate to
+ public string pchPostData; // any posted data for the request
+ [MarshalAs(UnmanagedType.I1)]
+ public bool bIsRedirect; // true if this was a http/html redirect from the last load request
+ public string pchPageTitle; // the title of the page
+ [MarshalAs(UnmanagedType.I1)]
+ public bool bNewNavigation; // true if this was from a fresh tab and not a click on an existing page
+
+ public static implicit operator HTML_URLChanged_t(HTML_URLChanged_t_LargePack value) {
+ HTML_URLChanged_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchPostData = value.pchPostData;
+ result.bIsRedirect = value.bIsRedirect;
+ result.pchPageTitle = value.pchPageTitle;
+ result.bNewNavigation = value.bNewNavigation;
+ return result;
+ }
+
+ public static implicit operator HTML_URLChanged_t_LargePack(HTML_URLChanged_t value) {
+ HTML_URLChanged_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchPostData = value.pchPostData;
+ result.bIsRedirect = value.bIsRedirect;
+ result.pchPageTitle = value.pchPageTitle;
+ result.bNewNavigation = value.bNewNavigation;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: A page is finished loading
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 6)]
- public struct HTML_FinishedRequest_t {
+ public struct HTML_FinishedRequest_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 6;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchURL; //
+ public string pchPageTitle; //
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: A page is finished loading
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 6)]
+ internal struct HTML_FinishedRequest_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchURL; //
public string pchPageTitle; //
+
+ public static implicit operator HTML_FinishedRequest_t(HTML_FinishedRequest_t_LargePack value) {
+ HTML_FinishedRequest_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchPageTitle = value.pchPageTitle;
+ return result;
+ }
+
+ public static implicit operator HTML_FinishedRequest_t_LargePack(HTML_FinishedRequest_t value) {
+ HTML_FinishedRequest_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.pchPageTitle = value.pchPageTitle;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: a request to load this url in a new tab
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 7)]
- public struct HTML_OpenLinkInNewTab_t {
+ public struct HTML_OpenLinkInNewTab_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 7;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchURL; //
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: a request to load this url in a new tab
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 7)]
+ internal struct HTML_OpenLinkInNewTab_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchURL; //
+
+ public static implicit operator HTML_OpenLinkInNewTab_t(HTML_OpenLinkInNewTab_t_LargePack value) {
+ HTML_OpenLinkInNewTab_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ return result;
+ }
+
+ public static implicit operator HTML_OpenLinkInNewTab_t_LargePack(HTML_OpenLinkInNewTab_t value) {
+ HTML_OpenLinkInNewTab_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: the page has a new title now
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 8)]
- public struct HTML_ChangedTitle_t {
+ public struct HTML_ChangedTitle_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 8;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 8;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchTitle; //
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: the page has a new title now
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 8)]
+ internal struct HTML_ChangedTitle_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchTitle; //
+
+ public static implicit operator HTML_ChangedTitle_t(HTML_ChangedTitle_t_LargePack value) {
+ HTML_ChangedTitle_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchTitle = value.pchTitle;
+ return result;
+ }
+
+ public static implicit operator HTML_ChangedTitle_t_LargePack(HTML_ChangedTitle_t value) {
+ HTML_ChangedTitle_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchTitle = value.pchTitle;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: results from a search
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 9)]
- public struct HTML_SearchResults_t {
+ public struct HTML_SearchResults_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 9;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public uint unResults; //
public uint unCurrentMatch; //
@@ -672,8 +1403,13 @@ public struct HTML_SearchResults_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 10)]
- public struct HTML_CanGoBackAndForward_t {
+ public struct HTML_CanGoBackAndForward_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 10;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 10;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
[MarshalAs(UnmanagedType.I1)]
public bool bCanGoBack; //
@@ -686,8 +1422,13 @@ public struct HTML_CanGoBackAndForward_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 11)]
- public struct HTML_HorizontalScroll_t {
+ public struct HTML_HorizontalScroll_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 11;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public uint unScrollMax; //
public uint unScrollCurrent; //
@@ -702,8 +1443,13 @@ public struct HTML_HorizontalScroll_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 12)]
- public struct HTML_VerticalScroll_t {
+ public struct HTML_VerticalScroll_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 12;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 12;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public uint unScrollMax; //
public uint unScrollCurrent; //
@@ -718,8 +1464,30 @@ public struct HTML_VerticalScroll_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 13)]
- public struct HTML_LinkAtPosition_t {
+ public struct HTML_LinkAtPosition_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 13;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 13;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public uint x; // NOTE - Not currently set
+ public uint y; // NOTE - Not currently set
+ public string pchURL; //
+ [MarshalAs(UnmanagedType.I1)]
+ public bool bInput; //
+ [MarshalAs(UnmanagedType.I1)]
+ public bool bLiveLink; //
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: response to GetLinkAtPosition call
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 13)]
+ internal struct HTML_LinkAtPosition_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public uint x; // NOTE - Not currently set
public uint y; // NOTE - Not currently set
@@ -728,48 +1496,170 @@ public struct HTML_LinkAtPosition_t {
public bool bInput; //
[MarshalAs(UnmanagedType.I1)]
public bool bLiveLink; //
+
+ public static implicit operator HTML_LinkAtPosition_t(HTML_LinkAtPosition_t_LargePack value) {
+ HTML_LinkAtPosition_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.x = value.x;
+ result.y = value.y;
+ result.pchURL = value.pchURL;
+ result.bInput = value.bInput;
+ result.bLiveLink = value.bLiveLink;
+ return result;
+ }
+
+ public static implicit operator HTML_LinkAtPosition_t_LargePack(HTML_LinkAtPosition_t value) {
+ HTML_LinkAtPosition_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.x = value.x;
+ result.y = value.y;
+ result.pchURL = value.pchURL;
+ result.bInput = value.bInput;
+ result.bLiveLink = value.bLiveLink;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: show a Javascript alert dialog, call JSDialogResponse
// when the user dismisses this dialog (or right away to ignore it)
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 14)]
- public struct HTML_JSAlert_t {
+ public struct HTML_JSAlert_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 14;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 14;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchMessage; //
}
+ #if STEAMWORKS_ANYCPU
//-----------------------------------------------------------------------------
- // Purpose: show a Javascript confirmation dialog, call JSDialogResponse
+ // Purpose: show a Javascript alert dialog, call JSDialogResponse
// when the user dismisses this dialog (or right away to ignore it)
//-----------------------------------------------------------------------------
- [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
- [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 15)]
- public struct HTML_JSConfirm_t {
- public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 15;
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 14)]
+ internal struct HTML_JSAlert_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchMessage; //
+
+ public static implicit operator HTML_JSAlert_t(HTML_JSAlert_t_LargePack value) {
+ HTML_JSAlert_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMessage = value.pchMessage;
+ return result;
+ }
+
+ public static implicit operator HTML_JSAlert_t_LargePack(HTML_JSAlert_t value) {
+ HTML_JSAlert_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMessage = value.pchMessage;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
- // Purpose: when received show a file open dialog
- // then call FileLoadDialogResponse with the file(s) the user selected.
+ // Purpose: show a Javascript confirmation dialog, call JSDialogResponse
+ // when the user dismisses this dialog (or right away to ignore it)
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
- [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 16)]
- public struct HTML_FileOpenDialog_t {
- public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 16;
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 15)]
+ public struct HTML_JSConfirm_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
+ public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 15;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 15;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
- public string pchTitle; //
- public string pchInitialFile; //
+ public string pchMessage; //
}
+ #if STEAMWORKS_ANYCPU
//-----------------------------------------------------------------------------
- // Purpose: a new html window is being created.
- //
+ // Purpose: show a Javascript confirmation dialog, call JSDialogResponse
+ // when the user dismisses this dialog (or right away to ignore it)
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 15)]
+ internal struct HTML_JSConfirm_t_LargePack {
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchMessage; //
+
+ public static implicit operator HTML_JSConfirm_t(HTML_JSConfirm_t_LargePack value) {
+ HTML_JSConfirm_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMessage = value.pchMessage;
+ return result;
+ }
+
+ public static implicit operator HTML_JSConfirm_t_LargePack(HTML_JSConfirm_t value) {
+ HTML_JSConfirm_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMessage = value.pchMessage;
+ return result;
+ }
+ }
+
+ #endif
+ //-----------------------------------------------------------------------------
+ // Purpose: when received show a file open dialog
+ // then call FileLoadDialogResponse with the file(s) the user selected.
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 16)]
+ public struct HTML_FileOpenDialog_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
+ public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 16;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 16;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchTitle; //
+ public string pchInitialFile; //
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: when received show a file open dialog
+ // then call FileLoadDialogResponse with the file(s) the user selected.
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 16)]
+ internal struct HTML_FileOpenDialog_t_LargePack {
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchTitle; //
+ public string pchInitialFile; //
+
+ public static implicit operator HTML_FileOpenDialog_t(HTML_FileOpenDialog_t_LargePack value) {
+ HTML_FileOpenDialog_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchTitle = value.pchTitle;
+ result.pchInitialFile = value.pchInitialFile;
+ return result;
+ }
+
+ public static implicit operator HTML_FileOpenDialog_t_LargePack(HTML_FileOpenDialog_t value) {
+ HTML_FileOpenDialog_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchTitle = value.pchTitle;
+ result.pchInitialFile = value.pchInitialFile;
+ return result;
+ }
+ }
+
+ #endif
+ //-----------------------------------------------------------------------------
+ // Purpose: a new html window is being created.
+ //
// IMPORTANT NOTE: at this time, the API does not allow you to acknowledge or
// render the contents of this new window, so the new window is always destroyed
// immediately. The URL and other parameters of the new window are passed here
@@ -778,8 +1668,35 @@ public struct HTML_FileOpenDialog_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 21)]
- public struct HTML_NewWindow_t {
+ public struct HTML_NewWindow_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 21;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 21;
+ public HHTMLBrowser unBrowserHandle; // the handle of the current surface
+ public string pchURL; // the page to load
+ public uint unX; // the x pos into the page to display the popup
+ public uint unY; // the y pos into the page to display the popup
+ public uint unWide; // the total width of the pBGRA texture
+ public uint unTall; // the total height of the pBGRA texture
+ public HHTMLBrowser unNewWindow_BrowserHandle_IGNORE;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: a new html window is being created.
+ //
+ // IMPORTANT NOTE: at this time, the API does not allow you to acknowledge or
+ // render the contents of this new window, so the new window is always destroyed
+ // immediately. The URL and other parameters of the new window are passed here
+ // to give your application the opportunity to call CreateBrowser and set up
+ // a new browser in response to the attempted popup, if you wish to do so.
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 21)]
+ internal struct HTML_NewWindow_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the current surface
public string pchURL; // the page to load
public uint unX; // the x pos into the page to display the popup
@@ -787,15 +1704,45 @@ public struct HTML_NewWindow_t {
public uint unWide; // the total width of the pBGRA texture
public uint unTall; // the total height of the pBGRA texture
public HHTMLBrowser unNewWindow_BrowserHandle_IGNORE;
+
+ public static implicit operator HTML_NewWindow_t(HTML_NewWindow_t_LargePack value) {
+ HTML_NewWindow_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.unX = value.unX;
+ result.unY = value.unY;
+ result.unWide = value.unWide;
+ result.unTall = value.unTall;
+ result.unNewWindow_BrowserHandle_IGNORE = value.unNewWindow_BrowserHandle_IGNORE;
+ return result;
+ }
+
+ public static implicit operator HTML_NewWindow_t_LargePack(HTML_NewWindow_t value) {
+ HTML_NewWindow_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchURL = value.pchURL;
+ result.unX = value.unX;
+ result.unY = value.unY;
+ result.unWide = value.unWide;
+ result.unTall = value.unTall;
+ result.unNewWindow_BrowserHandle_IGNORE = value.unNewWindow_BrowserHandle_IGNORE;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: change the cursor to display
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 22)]
- public struct HTML_SetCursor_t {
+ public struct HTML_SetCursor_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 22;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 22;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public uint eMouseCursor; // the EHTMLMouseCursor to display
}
@@ -805,41 +1752,139 @@ public struct HTML_SetCursor_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 23)]
- public struct HTML_StatusText_t {
+ public struct HTML_StatusText_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 23;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 23;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchMsg; // the message text
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: informational message from the browser
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 23)]
+ internal struct HTML_StatusText_t_LargePack {
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchMsg; // the message text
+
+ public static implicit operator HTML_StatusText_t(HTML_StatusText_t_LargePack value) {
+ HTML_StatusText_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
+
+ public static implicit operator HTML_StatusText_t_LargePack(HTML_StatusText_t value) {
+ HTML_StatusText_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: show a tooltip
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 24)]
- public struct HTML_ShowToolTip_t {
+ public struct HTML_ShowToolTip_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 24;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 24;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchMsg; // the tooltip text
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: show a tooltip
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 24)]
+ internal struct HTML_ShowToolTip_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchMsg; // the tooltip text
+
+ public static implicit operator HTML_ShowToolTip_t(HTML_ShowToolTip_t_LargePack value) {
+ HTML_ShowToolTip_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
+
+ public static implicit operator HTML_ShowToolTip_t_LargePack(HTML_ShowToolTip_t value) {
+ HTML_ShowToolTip_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: update the text of an existing tooltip
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 25)]
- public struct HTML_UpdateToolTip_t {
+ public struct HTML_UpdateToolTip_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 25;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 25;
+ public HHTMLBrowser unBrowserHandle; // the handle of the surface
+ public string pchMsg; // the new tooltip text
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: update the text of an existing tooltip
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 25)]
+ internal struct HTML_UpdateToolTip_t_LargePack {
public HHTMLBrowser unBrowserHandle; // the handle of the surface
public string pchMsg; // the new tooltip text
+
+ public static implicit operator HTML_UpdateToolTip_t(HTML_UpdateToolTip_t_LargePack value) {
+ HTML_UpdateToolTip_t result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
+
+ public static implicit operator HTML_UpdateToolTip_t_LargePack(HTML_UpdateToolTip_t value) {
+ HTML_UpdateToolTip_t_LargePack result = default;
+ result.unBrowserHandle = value.unBrowserHandle;
+ result.pchMsg = value.pchMsg;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: hide the tooltip you are showing
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 26)]
- public struct HTML_HideToolTip_t {
+ public struct HTML_HideToolTip_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 26;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 26;
public HHTMLBrowser unBrowserHandle; // the handle of the surface
}
@@ -848,8 +1893,13 @@ public struct HTML_HideToolTip_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTMLSurfaceCallbacks + 27)]
- public struct HTML_BrowserRestarted_t {
+ public struct HTML_BrowserRestarted_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTMLSurfaceCallbacks + 27;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTMLSurfaceCallbacks + 27;
public HHTMLBrowser unBrowserHandle; // this is the new browser handle after the restart
public HHTMLBrowser unOldBrowserHandle; // the handle for the browser before the restart, if your handle was this then switch to using unBrowserHandle for API calls
}
@@ -857,8 +1907,38 @@ public struct HTML_BrowserRestarted_t {
// callbacks
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 1)]
- public struct HTTPRequestCompleted_t {
+ public struct HTTPRequestCompleted_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTTPCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTTPCallbacks + 1;
+
+ // Handle value for the request that has completed.
+ public HTTPRequestHandle m_hRequest;
+
+ // Context value that the user defined on the request that this callback is associated with, 0 if
+ // no context value was set.
+ public ulong m_ulContextValue;
+
+ // This will be true if we actually got any sort of response from the server (even an error).
+ // It will be false if we failed due to an internal error or client side network failure.
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bRequestSuccessful;
+
+ // Will be the HTTP status code value returned by the server, k_EHTTPStatusCode200OK is the normal
+ // OK response, if you get something else you probably need to treat it as a failure.
+ public EHTTPStatusCode m_eStatusCode;
+
+ public uint m_unBodySize; // Same as GetHTTPResponseBodySize()
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // callbacks
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 1)]
+ internal struct HTTPRequestCompleted_t_LargePack {
// Handle value for the request that has completed.
public HTTPRequestHandle m_hRequest;
@@ -877,12 +1957,51 @@ public struct HTTPRequestCompleted_t {
public EHTTPStatusCode m_eStatusCode;
public uint m_unBodySize; // Same as GetHTTPResponseBodySize()
+
+ public static implicit operator HTTPRequestCompleted_t(HTTPRequestCompleted_t_LargePack value) {
+ HTTPRequestCompleted_t result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ result.m_bRequestSuccessful = value.m_bRequestSuccessful;
+ result.m_eStatusCode = value.m_eStatusCode;
+ result.m_unBodySize = value.m_unBodySize;
+ return result;
+ }
+
+ public static implicit operator HTTPRequestCompleted_t_LargePack(HTTPRequestCompleted_t value) {
+ HTTPRequestCompleted_t_LargePack result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ result.m_bRequestSuccessful = value.m_bRequestSuccessful;
+ result.m_eStatusCode = value.m_eStatusCode;
+ result.m_unBodySize = value.m_unBodySize;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 2)]
- public struct HTTPRequestHeadersReceived_t {
+ public struct HTTPRequestHeadersReceived_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTTPCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTTPCallbacks + 2;
+
+ // Handle value for the request that has received headers.
+ public HTTPRequestHandle m_hRequest;
+
+ // Context value that the user defined on the request that this callback is associated with, 0 if
+ // no context value was set.
+ public ulong m_ulContextValue;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 2)]
+ internal struct HTTPRequestHeadersReceived_t_LargePack {
// Handle value for the request that has received headers.
public HTTPRequestHandle m_hRequest;
@@ -890,12 +2009,52 @@ public struct HTTPRequestHeadersReceived_t {
// Context value that the user defined on the request that this callback is associated with, 0 if
// no context value was set.
public ulong m_ulContextValue;
+
+ public static implicit operator HTTPRequestHeadersReceived_t(HTTPRequestHeadersReceived_t_LargePack value) {
+ HTTPRequestHeadersReceived_t result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ return result;
+ }
+
+ public static implicit operator HTTPRequestHeadersReceived_t_LargePack(HTTPRequestHeadersReceived_t value) {
+ HTTPRequestHeadersReceived_t_LargePack result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 3)]
- public struct HTTPRequestDataReceived_t {
+ public struct HTTPRequestDataReceived_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamHTTPCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamHTTPCallbacks + 3;
+
+ // Handle value for the request that has received data.
+ public HTTPRequestHandle m_hRequest;
+
+ // Context value that the user defined on the request that this callback is associated with, 0 if
+ // no context value was set.
+ public ulong m_ulContextValue;
+
+
+ // Offset to provide to GetHTTPStreamingResponseBodyData to get this chunk of data
+ public uint m_cOffset;
+
+ // Size to provide to GetHTTPStreamingResponseBodyData to get this chunk of data
+ public uint m_cBytesReceived;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamHTTPCallbacks + 3)]
+ internal struct HTTPRequestDataReceived_t_LargePack {
// Handle value for the request that has received data.
public HTTPRequestHandle m_hRequest;
@@ -910,16 +2069,40 @@ public struct HTTPRequestDataReceived_t {
// Size to provide to GetHTTPStreamingResponseBodyData to get this chunk of data
public uint m_cBytesReceived;
+
+ public static implicit operator HTTPRequestDataReceived_t(HTTPRequestDataReceived_t_LargePack value) {
+ HTTPRequestDataReceived_t result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ result.m_cOffset = value.m_cOffset;
+ result.m_cBytesReceived = value.m_cBytesReceived;
+ return result;
+ }
+
+ public static implicit operator HTTPRequestDataReceived_t_LargePack(HTTPRequestDataReceived_t value) {
+ HTTPRequestDataReceived_t_LargePack result = default;
+ result.m_hRequest = value.m_hRequest;
+ result.m_ulContextValue = value.m_ulContextValue;
+ result.m_cOffset = value.m_cOffset;
+ result.m_cBytesReceived = value.m_cBytesReceived;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: called when a new controller has been connected, will fire once
// per controller if multiple new controllers connect in the same frame
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamControllerCallbacks + 1)]
- public struct SteamInputDeviceConnected_t {
+ public struct SteamInputDeviceConnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamControllerCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamControllerCallbacks + 1;
public InputHandle_t m_ulConnectedDeviceHandle; // Handle for device
}
@@ -929,8 +2112,13 @@ public struct SteamInputDeviceConnected_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamControllerCallbacks + 2)]
- public struct SteamInputDeviceDisconnected_t {
+ public struct SteamInputDeviceDisconnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamControllerCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamControllerCallbacks + 2;
public InputHandle_t m_ulDisconnectedDeviceHandle; // Handle for device
}
@@ -940,8 +2128,34 @@ public struct SteamInputDeviceDisconnected_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamControllerCallbacks + 3)]
- public struct SteamInputConfigurationLoaded_t {
+ public struct SteamInputConfigurationLoaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamControllerCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamControllerCallbacks + 3;
+ public AppId_t m_unAppID;
+ public InputHandle_t m_ulDeviceHandle; // Handle for device
+ public CSteamID m_ulMappingCreator; // May differ from local user when using
+ // an unmodified community or official config
+ public uint m_unMajorRevision; // Binding revision from In-game Action File.
+ // Same value as queried by GetDeviceBindingRevision
+ public uint m_unMinorRevision;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bUsesSteamInputAPI; // Does the configuration contain any Analog/Digital actions?
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bUsesGamepadAPI; // Does the configuration contain any Xinput bindings?
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: called when a controller configuration has been loaded, will fire once
+ // per controller per focus change for Steam Input enabled controllers
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamControllerCallbacks + 3)]
+ internal struct SteamInputConfigurationLoaded_t_LargePack {
public AppId_t m_unAppID;
public InputHandle_t m_ulDeviceHandle; // Handle for device
public CSteamID m_ulMappingCreator; // May differ from local user when using
@@ -953,30 +2167,101 @@ public struct SteamInputConfigurationLoaded_t {
public bool m_bUsesSteamInputAPI; // Does the configuration contain any Analog/Digital actions?
[MarshalAs(UnmanagedType.I1)]
public bool m_bUsesGamepadAPI; // Does the configuration contain any Xinput bindings?
+
+ public static implicit operator SteamInputConfigurationLoaded_t(SteamInputConfigurationLoaded_t_LargePack value) {
+ SteamInputConfigurationLoaded_t result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulDeviceHandle = value.m_ulDeviceHandle;
+ result.m_ulMappingCreator = value.m_ulMappingCreator;
+ result.m_unMajorRevision = value.m_unMajorRevision;
+ result.m_unMinorRevision = value.m_unMinorRevision;
+ result.m_bUsesSteamInputAPI = value.m_bUsesSteamInputAPI;
+ result.m_bUsesGamepadAPI = value.m_bUsesGamepadAPI;
+ return result;
+ }
+
+ public static implicit operator SteamInputConfigurationLoaded_t_LargePack(SteamInputConfigurationLoaded_t value) {
+ SteamInputConfigurationLoaded_t_LargePack result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulDeviceHandle = value.m_ulDeviceHandle;
+ result.m_ulMappingCreator = value.m_ulMappingCreator;
+ result.m_unMajorRevision = value.m_unMajorRevision;
+ result.m_unMinorRevision = value.m_unMinorRevision;
+ result.m_bUsesSteamInputAPI = value.m_bUsesSteamInputAPI;
+ result.m_bUsesGamepadAPI = value.m_bUsesGamepadAPI;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: called when controller gamepad slots change - on Linux/macOS these
// slots are shared for all running apps.
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamControllerCallbacks + 4)]
- public struct SteamInputGamepadSlotChange_t {
+ public struct SteamInputGamepadSlotChange_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamControllerCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamControllerCallbacks + 4;
+ public AppId_t m_unAppID;
+ public InputHandle_t m_ulDeviceHandle; // Handle for device
+ public ESteamInputType m_eDeviceType; // Type of device
+ public int m_nOldGamepadSlot; // Previous GamepadSlot - can be -1 controller doesn't uses gamepad bindings
+ public int m_nNewGamepadSlot; // New Gamepad Slot - can be -1 controller doesn't uses gamepad bindings
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: called when controller gamepad slots change - on Linux/macOS these
+ // slots are shared for all running apps.
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamControllerCallbacks + 4)]
+ internal struct SteamInputGamepadSlotChange_t_LargePack {
public AppId_t m_unAppID;
public InputHandle_t m_ulDeviceHandle; // Handle for device
public ESteamInputType m_eDeviceType; // Type of device
public int m_nOldGamepadSlot; // Previous GamepadSlot - can be -1 controller doesn't uses gamepad bindings
public int m_nNewGamepadSlot; // New Gamepad Slot - can be -1 controller doesn't uses gamepad bindings
+
+ public static implicit operator SteamInputGamepadSlotChange_t(SteamInputGamepadSlotChange_t_LargePack value) {
+ SteamInputGamepadSlotChange_t result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulDeviceHandle = value.m_ulDeviceHandle;
+ result.m_eDeviceType = value.m_eDeviceType;
+ result.m_nOldGamepadSlot = value.m_nOldGamepadSlot;
+ result.m_nNewGamepadSlot = value.m_nNewGamepadSlot;
+ return result;
+ }
+
+ public static implicit operator SteamInputGamepadSlotChange_t_LargePack(SteamInputGamepadSlotChange_t value) {
+ SteamInputGamepadSlotChange_t_LargePack result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulDeviceHandle = value.m_ulDeviceHandle;
+ result.m_eDeviceType = value.m_eDeviceType;
+ result.m_nOldGamepadSlot = value.m_nOldGamepadSlot;
+ result.m_nNewGamepadSlot = value.m_nNewGamepadSlot;
+ return result;
+ }
}
+ #endif
// SteamInventoryResultReady_t callbacks are fired whenever asynchronous
// results transition from "Pending" to "OK" or an error state. There will
// always be exactly one callback per handle.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 0)]
- public struct SteamInventoryResultReady_t {
+ public struct SteamInventoryResultReady_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 0;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 0;
public SteamInventoryResult_t m_handle;
public EResult m_result;
}
@@ -990,8 +2275,13 @@ public struct SteamInventoryResultReady_t {
// afterwards; this is an additional notification for your convenience.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 1)]
- public struct SteamInventoryFullUpdate_t {
+ public struct SteamInventoryFullUpdate_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 1;
public SteamInventoryResult_t m_handle;
}
@@ -1001,40 +2291,118 @@ public struct SteamInventoryFullUpdate_t {
// a definition update in order to process results from the server.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 2)]
- public struct SteamInventoryDefinitionUpdate_t {
+ public struct SteamInventoryDefinitionUpdate_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 2;
}
// Returned
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 3)]
- public struct SteamInventoryEligiblePromoItemDefIDs_t {
+ public struct SteamInventoryEligiblePromoItemDefIDs_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 3;
+ public EResult m_result;
+ public CSteamID m_steamID;
+ public int m_numEligiblePromoItemDefs;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bCachedData; // indicates that the data was retrieved from the cache and not the server
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // Returned
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 3)]
+ internal struct SteamInventoryEligiblePromoItemDefIDs_t_LargePack {
public EResult m_result;
public CSteamID m_steamID;
public int m_numEligiblePromoItemDefs;
[MarshalAs(UnmanagedType.I1)]
public bool m_bCachedData; // indicates that the data was retrieved from the cache and not the server
+
+ public static implicit operator SteamInventoryEligiblePromoItemDefIDs_t(SteamInventoryEligiblePromoItemDefIDs_t_LargePack value) {
+ SteamInventoryEligiblePromoItemDefIDs_t result = default;
+ result.m_result = value.m_result;
+ result.m_steamID = value.m_steamID;
+ result.m_numEligiblePromoItemDefs = value.m_numEligiblePromoItemDefs;
+ result.m_bCachedData = value.m_bCachedData;
+ return result;
+ }
+
+ public static implicit operator SteamInventoryEligiblePromoItemDefIDs_t_LargePack(SteamInventoryEligiblePromoItemDefIDs_t value) {
+ SteamInventoryEligiblePromoItemDefIDs_t_LargePack result = default;
+ result.m_result = value.m_result;
+ result.m_steamID = value.m_steamID;
+ result.m_numEligiblePromoItemDefs = value.m_numEligiblePromoItemDefs;
+ result.m_bCachedData = value.m_bCachedData;
+ return result;
+ }
}
+ #endif
// Triggered from StartPurchase call
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 4)]
- public struct SteamInventoryStartPurchaseResult_t {
+ public struct SteamInventoryStartPurchaseResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 4;
+ public EResult m_result;
+ public ulong m_ulOrderID;
+ public ulong m_ulTransID;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // Triggered from StartPurchase call
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 4)]
+ internal struct SteamInventoryStartPurchaseResult_t_LargePack {
public EResult m_result;
public ulong m_ulOrderID;
public ulong m_ulTransID;
+
+ public static implicit operator SteamInventoryStartPurchaseResult_t(SteamInventoryStartPurchaseResult_t_LargePack value) {
+ SteamInventoryStartPurchaseResult_t result = default;
+ result.m_result = value.m_result;
+ result.m_ulOrderID = value.m_ulOrderID;
+ result.m_ulTransID = value.m_ulTransID;
+ return result;
+ }
+
+ public static implicit operator SteamInventoryStartPurchaseResult_t_LargePack(SteamInventoryStartPurchaseResult_t value) {
+ SteamInventoryStartPurchaseResult_t_LargePack result = default;
+ result.m_result = value.m_result;
+ result.m_ulOrderID = value.m_ulOrderID;
+ result.m_ulTransID = value.m_ulTransID;
+ return result;
+ }
}
+ #endif
// Triggered from RequestPrices
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamInventoryCallbacks + 5)]
- public struct SteamInventoryRequestPricesResult_t {
+ public struct SteamInventoryRequestPricesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamInventoryCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamInventoryCallbacks + 5;
public EResult m_result;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
- private byte[] m_rgchCurrency_;
+ internal byte[] m_rgchCurrency_;
public string m_rgchCurrency
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchCurrency_); }
@@ -1049,8 +2417,13 @@ public string m_rgchCurrency
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 2)]
- public struct FavoritesListChanged_t {
+ public struct FavoritesListChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 2;
public uint m_nIP; // an IP of 0 means reload the whole list, any other value means just one server
public uint m_nQueryPort;
public uint m_nConnPort;
@@ -1071,8 +2444,13 @@ public struct FavoritesListChanged_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 3)]
- public struct LobbyInvite_t {
+ public struct LobbyInvite_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 3;
public ulong m_ulSteamIDUser; // Steam ID of the person making the invite
public ulong m_ulSteamIDLobby; // Steam ID of the Lobby
@@ -1086,8 +2464,13 @@ public struct LobbyInvite_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 4)]
- public struct LobbyEnter_t {
+ public struct LobbyEnter_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 4;
public ulong m_ulSteamIDLobby; // SteamID of the Lobby you have entered
public uint m_rgfChatPermissions; // Permissions of the current user
@@ -1103,8 +2486,13 @@ public struct LobbyEnter_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 5)]
- public struct LobbyDataUpdate_t {
+ public struct LobbyDataUpdate_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 5;
public ulong m_ulSteamIDLobby; // steamID of the Lobby
public ulong m_ulSteamIDMember; // steamID of the member whose data changed, or the room itself
@@ -1118,8 +2506,13 @@ public struct LobbyDataUpdate_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 6)]
- public struct LobbyChatUpdate_t {
+ public struct LobbyChatUpdate_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 6;
public ulong m_ulSteamIDLobby; // Lobby ID
public ulong m_ulSteamIDUserChanged; // user who's status in the lobby just changed - can be recipient
@@ -1134,8 +2527,13 @@ public struct LobbyChatUpdate_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 7)]
- public struct LobbyChatMsg_t {
+ public struct LobbyChatMsg_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 7;
public ulong m_ulSteamIDLobby; // the lobby id this is in
public ulong m_ulSteamIDUser; // steamID of the user who has sent this message
@@ -1151,8 +2549,13 @@ public struct LobbyChatMsg_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 9)]
- public struct LobbyGameCreated_t {
+ public struct LobbyGameCreated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 9;
public ulong m_ulSteamIDLobby; // the lobby we were in
public ulong m_ulSteamIDGameServer; // the new game server that has been created or found for the lobby members
@@ -1166,8 +2569,13 @@ public struct LobbyGameCreated_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 10)]
- public struct LobbyMatchList_t {
+ public struct LobbyMatchList_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 10;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 10;
public uint m_nLobbiesMatching; // Number of lobbies that matched search criteria and we have SteamIDs for
}
@@ -1177,8 +2585,13 @@ public struct LobbyMatchList_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 12)]
- public struct LobbyKicked_t {
+ public struct LobbyKicked_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 12;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 12;
public ulong m_ulSteamIDLobby; // Lobby
public ulong m_ulSteamIDAdmin; // User who kicked you - possibly the ID of the lobby itself
public byte m_bKickedDueToDisconnect; // true if you were kicked from the lobby due to the user losing connection to Steam (currently always true)
@@ -1192,8 +2605,34 @@ public struct LobbyKicked_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 13)]
- public struct LobbyCreated_t {
+ public struct LobbyCreated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 13;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 13;
+
+ public EResult m_eResult; // k_EResultOK - the lobby was successfully created
+ // k_EResultNoConnection - your Steam client doesn't have a connection to the back-end
+ // k_EResultTimeout - you the message to the Steam servers, but it didn't respond
+ // k_EResultFail - the server responded, but with an unknown internal error
+ // k_EResultAccessDenied - your game isn't set to allow lobbies, or your client does haven't rights to play the game
+ // k_EResultLimitExceeded - your game client has created too many lobbies
+
+ public ulong m_ulSteamIDLobby; // chat room, zero if failed
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: Result of our request to create a Lobby
+ // m_eResult == k_EResultOK on success
+ // at this point, the lobby has been joined and is ready for use
+ // a LobbyEnter_t callback will also be received (since the local user is joining their own lobby)
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 13)]
+ internal struct LobbyCreated_t_LargePack {
public EResult m_eResult; // k_EResultOK - the lobby was successfully created
// k_EResultNoConnection - your Steam client doesn't have a connection to the back-end
@@ -1203,8 +2642,23 @@ public struct LobbyCreated_t {
// k_EResultLimitExceeded - your game client has created too many lobbies
public ulong m_ulSteamIDLobby; // chat room, zero if failed
+
+ public static implicit operator LobbyCreated_t(LobbyCreated_t_LargePack value) {
+ LobbyCreated_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulSteamIDLobby = value.m_ulSteamIDLobby;
+ return result;
+ }
+
+ public static implicit operator LobbyCreated_t_LargePack(LobbyCreated_t value) {
+ LobbyCreated_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulSteamIDLobby = value.m_ulSteamIDLobby;
+ return result;
+ }
}
+ #endif
// used by now obsolete RequestFriendsLobbiesResponse_t
// enum { k_iCallback = k_iSteamMatchmakingCallbacks + 14 };
// used by now obsolete PSNGameBootInviteResult_t
@@ -1217,8 +2671,13 @@ public struct LobbyCreated_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMatchmakingCallbacks + 16)]
- public struct FavoritesListAccountsUpdated_t {
+ public struct FavoritesListAccountsUpdated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMatchmakingCallbacks + 16;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMatchmakingCallbacks + 16;
public EResult m_eResult;
}
@@ -1228,14 +2687,19 @@ public struct FavoritesListAccountsUpdated_t {
// to the game with that party.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 1)]
- public struct JoinPartyCallback_t {
+ public struct JoinPartyCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 1;
public EResult m_eResult;
public PartyBeaconID_t m_ulBeaconID;
public CSteamID m_SteamIDBeaconOwner;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- private byte[] m_rgchConnectString_;
+ internal byte[] m_rgchConnectString_;
public string m_rgchConnectString
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchConnectString_); }
@@ -1243,24 +2707,98 @@ public string m_rgchConnectString
}
}
- // Response to CreateBeacon request. If successful, the beacon ID is provided.
- [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
- [CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 2)]
- public struct CreateBeaconCallback_t {
- public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 2;
+ #if STEAMWORKS_ANYCPU
+ // Steam has responded to the user request to join a party via the given Beacon ID.
+ // If successful, the connect string contains game-specific instructions to connect
+ // to the game with that party.
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 1)]
+ internal struct JoinPartyCallback_t_LargePack {
public EResult m_eResult;
public PartyBeaconID_t m_ulBeaconID;
- }
-
- // Someone has used the beacon to join your party - they are in-flight now
+ public CSteamID m_SteamIDBeaconOwner;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
+ internal byte[] m_rgchConnectString_;
+ public string m_rgchConnectString
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchConnectString_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchConnectString_, 256); }
+ }
+
+ public static implicit operator JoinPartyCallback_t(JoinPartyCallback_t_LargePack value) {
+ JoinPartyCallback_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulBeaconID = value.m_ulBeaconID;
+ result.m_SteamIDBeaconOwner = value.m_SteamIDBeaconOwner;
+ result.m_rgchConnectString_ = value.m_rgchConnectString_;
+ return result;
+ }
+
+ public static implicit operator JoinPartyCallback_t_LargePack(JoinPartyCallback_t value) {
+ JoinPartyCallback_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulBeaconID = value.m_ulBeaconID;
+ result.m_SteamIDBeaconOwner = value.m_SteamIDBeaconOwner;
+ result.m_rgchConnectString_ = value.m_rgchConnectString_;
+ return result;
+ }
+ }
+
+ #endif
+ // Response to CreateBeacon request. If successful, the beacon ID is provided.
+ [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
+ [CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 2)]
+ public struct CreateBeaconCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
+ public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 2;
+
+ public EResult m_eResult;
+ public PartyBeaconID_t m_ulBeaconID;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // Response to CreateBeacon request. If successful, the beacon ID is provided.
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 2)]
+ internal struct CreateBeaconCallback_t_LargePack {
+
+ public EResult m_eResult;
+ public PartyBeaconID_t m_ulBeaconID;
+
+ public static implicit operator CreateBeaconCallback_t(CreateBeaconCallback_t_LargePack value) {
+ CreateBeaconCallback_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulBeaconID = value.m_ulBeaconID;
+ return result;
+ }
+
+ public static implicit operator CreateBeaconCallback_t_LargePack(CreateBeaconCallback_t value) {
+ CreateBeaconCallback_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_ulBeaconID = value.m_ulBeaconID;
+ return result;
+ }
+ }
+
+ #endif
+ // Someone has used the beacon to join your party - they are in-flight now
// and we've reserved one of the open slots for them.
// You should confirm when they join your party by calling OnReservationCompleted().
// Otherwise, Steam may timeout their reservation eventually.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 3)]
- public struct ReservationNotificationCallback_t {
+ public struct ReservationNotificationCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 3;
public PartyBeaconID_t m_ulBeaconID;
public CSteamID m_steamIDJoiner;
@@ -1269,8 +2807,13 @@ public struct ReservationNotificationCallback_t {
// Response to ChangeNumOpenSlots call
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 4)]
- public struct ChangeNumOpenSlotsCallback_t {
+ public struct ChangeNumOpenSlotsCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 4;
public EResult m_eResult;
}
@@ -1278,28 +2821,48 @@ public struct ChangeNumOpenSlotsCallback_t {
// The list of possible Party beacon locations has changed
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 5)]
- public struct AvailableBeaconLocationsUpdated_t {
+ public struct AvailableBeaconLocationsUpdated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 5;
}
// The list of active beacons may have changed
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamPartiesCallbacks + 6)]
- public struct ActiveBeaconsUpdated_t {
+ public struct ActiveBeaconsUpdated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamPartiesCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamPartiesCallbacks + 6;
}
// callbacks
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamMusicCallbacks + 1)]
- public struct PlaybackStatusHasChanged_t {
+ public struct PlaybackStatusHasChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMusicCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMusicCallbacks + 1;
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamMusicCallbacks + 2)]
- public struct VolumeHasChanged_t {
+ public struct VolumeHasChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamMusicCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamMusicCallbacks + 2;
public float m_flNewVolume;
}
@@ -1308,8 +2871,13 @@ public struct VolumeHasChanged_t {
// in response, a call to AcceptP2PPacketsFromUser() needs to be made, if you want to talk with them
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingCallbacks + 2)]
- public struct P2PSessionRequest_t {
+ public struct P2PSessionRequest_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingCallbacks + 2;
public CSteamID m_steamIDRemote; // user who wants to talk to us
}
@@ -1318,8 +2886,13 @@ public struct P2PSessionRequest_t {
// further attempts to send will retry making the connection (but will be dropped if we fail again)
[StructLayout(LayoutKind.Sequential, Pack = 1)]
[CallbackIdentity(Constants.k_iSteamNetworkingCallbacks + 3)]
- public struct P2PSessionConnectFail_t {
+ public struct P2PSessionConnectFail_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingCallbacks + 3;
public CSteamID m_steamIDRemote; // user we were sending packets to
public byte m_eP2PSessionError; // EP2PSessionError indicating why we're having trouble
}
@@ -1328,8 +2901,13 @@ public struct P2PSessionConnectFail_t {
// used as part of the CreateListenSocket() / CreateP2PConnectionSocket()
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamNetworkingCallbacks + 1)]
- public struct SocketStatusCallback_t {
+ public struct SocketStatusCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingCallbacks + 1;
public SNetSocket_t m_hSocket; // the socket used to send/receive data to the remote host
public SNetListenSocket_t m_hListenSocket; // this is the server socket that we were listening on; NULL if this was an outgoing connection
public CSteamID m_steamIDRemote; // remote steamID we have connected to, if it has one
@@ -1342,8 +2920,13 @@ public struct SocketStatusCallback_t {
/// Posted when a remote host is sending us a message, and we do not already have a session with them
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingMessagesCallbacks + 1)]
- public struct SteamNetworkingMessagesSessionRequest_t {
+ public struct SteamNetworkingMessagesSessionRequest_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingMessagesCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingMessagesCallbacks + 1;
public SteamNetworkingIdentity m_identityRemote; // user who wants to talk to us
}
@@ -1360,8 +2943,13 @@ public struct SteamNetworkingMessagesSessionRequest_t {
/// none, connecting, and findingroute again.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingMessagesCallbacks + 2)]
- public struct SteamNetworkingMessagesSessionFailed_t {
+ public struct SteamNetworkingMessagesSessionFailed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingMessagesCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingMessagesCallbacks + 2;
/// Detailed info about the session that failed.
/// SteamNetConnectionInfo_t::m_identityRemote indicates who this session
@@ -1407,8 +2995,13 @@ public struct SteamNetworkingMessagesSessionFailed_t {
/// Also note that callbacks will be posted when connections are created and destroyed by your own API calls.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingSocketsCallbacks + 1)]
- public struct SteamNetConnectionStatusChangedCallback_t {
+ public struct SteamNetConnectionStatusChangedCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingSocketsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingSocketsCallbacks + 1;
/// Connection handle
public HSteamNetConnection m_hConn;
@@ -1420,6 +3013,74 @@ public struct SteamNetConnectionStatusChangedCallback_t {
public ESteamNetworkingConnectionState m_eOldState;
}
+ #if STEAMWORKS_ANYCPU
+ /// Callback struct used to notify when a connection has changed state
+ /// This callback is posted whenever a connection is created, destroyed, or changes state.
+ /// The m_info field will contain a complete description of the connection at the time the
+ /// change occurred and the callback was posted. In particular, m_eState will have the
+ /// new connection state.
+ ///
+ /// You will usually need to listen for this callback to know when:
+ /// - A new connection arrives on a listen socket.
+ /// m_info.m_hListenSocket will be set, m_eOldState = k_ESteamNetworkingConnectionState_None,
+ /// and m_info.m_eState = k_ESteamNetworkingConnectionState_Connecting.
+ /// See ISteamNetworkigSockets::AcceptConnection.
+ /// - A connection you initiated has been accepted by the remote host.
+ /// m_eOldState = k_ESteamNetworkingConnectionState_Connecting, and
+ /// m_info.m_eState = k_ESteamNetworkingConnectionState_Connected.
+ /// Some connections might transition to k_ESteamNetworkingConnectionState_FindingRoute first.
+ /// - A connection has been actively rejected or closed by the remote host.
+ /// m_eOldState = k_ESteamNetworkingConnectionState_Connecting or k_ESteamNetworkingConnectionState_Connected,
+ /// and m_info.m_eState = k_ESteamNetworkingConnectionState_ClosedByPeer. m_info.m_eEndReason
+ /// and m_info.m_szEndDebug will have for more details.
+ /// NOTE: upon receiving this callback, you must still destroy the connection using
+ /// ISteamNetworkingSockets::CloseConnection to free up local resources. (The details
+ /// passed to the function are not used in this case, since the connection is already closed.)
+ /// - A problem was detected with the connection, and it has been closed by the local host.
+ /// The most common failure is timeout, but other configuration or authentication failures
+ /// can cause this. m_eOldState = k_ESteamNetworkingConnectionState_Connecting or
+ /// k_ESteamNetworkingConnectionState_Connected, and m_info.m_eState = k_ESteamNetworkingConnectionState_ProblemDetectedLocally.
+ /// m_info.m_eEndReason and m_info.m_szEndDebug will have for more details.
+ /// NOTE: upon receiving this callback, you must still destroy the connection using
+ /// ISteamNetworkingSockets::CloseConnection to free up local resources. (The details
+ /// passed to the function are not used in this case, since the connection is already closed.)
+ ///
+ /// Remember that callbacks are posted to a queue, and networking connections can
+ /// change at any time. It is possible that the connection has already changed
+ /// state by the time you process this callback.
+ ///
+ /// Also note that callbacks will be posted when connections are created and destroyed by your own API calls.
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamNetworkingSocketsCallbacks + 1)]
+ internal struct SteamNetConnectionStatusChangedCallback_t_LargePack {
+
+ /// Connection handle
+ public HSteamNetConnection m_hConn;
+
+ /// Full connection info
+ public SteamNetConnectionInfo_t_LargePack m_info;
+
+ /// Previous state. (Current state is in m_info.m_eState)
+ public ESteamNetworkingConnectionState m_eOldState;
+
+ public static implicit operator SteamNetConnectionStatusChangedCallback_t(SteamNetConnectionStatusChangedCallback_t_LargePack value) {
+ SteamNetConnectionStatusChangedCallback_t result = default;
+ result.m_hConn = value.m_hConn;
+ result.m_info = value.m_info;
+ result.m_eOldState = value.m_eOldState;
+ return result;
+ }
+
+ public static implicit operator SteamNetConnectionStatusChangedCallback_t_LargePack(SteamNetConnectionStatusChangedCallback_t value) {
+ SteamNetConnectionStatusChangedCallback_t_LargePack result = default;
+ result.m_hConn = value.m_hConn;
+ result.m_info = value.m_info;
+ result.m_eOldState = value.m_eOldState;
+ return result;
+ }
+ }
+
+ #endif
/// A struct used to describe our readiness to participate in authenticated,
/// encrypted communication. In order to do this we need:
///
@@ -1430,8 +3091,13 @@ public struct SteamNetConnectionStatusChangedCallback_t {
/// This callback is posted whenever the state of our readiness changes.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingSocketsCallbacks + 2)]
- public struct SteamNetAuthenticationStatus_t {
+ public struct SteamNetAuthenticationStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingSocketsCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingSocketsCallbacks + 2;
/// Status
public ESteamNetworkingAvailability m_eAvail;
@@ -1439,7 +3105,7 @@ public struct SteamNetAuthenticationStatus_t {
/// Non-localized English language status. For diagnostic/debugging
/// purposes only.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- private byte[] m_debugMsg_;
+ internal byte[] m_debugMsg_;
public string m_debugMsg
{
get { return InteropHelp.ByteArrayToStringUTF8(m_debugMsg_); }
@@ -1450,9 +3116,15 @@ public string m_debugMsg
/// A struct used to describe our readiness to use the relay network.
/// To do this we first need to fetch the network configuration,
/// which describes what POPs are available.
+ [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingUtilsCallbacks + 1)]
- public struct SteamRelayNetworkStatus_t {
+ public struct SteamRelayNetworkStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingUtilsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingUtilsCallbacks + 1;
/// Summary status. When this is "current", initialization has
/// completed. Anything else means you are not ready yet, or
@@ -1480,7 +3152,7 @@ public struct SteamRelayNetworkStatus_t {
/// Non-localized English language status. For diagnostic/debugging
/// purposes only.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- private byte[] m_debugMsg_;
+ internal byte[] m_debugMsg_;
public string m_debugMsg
{
get { return InteropHelp.ByteArrayToStringUTF8(m_debugMsg_); }
@@ -1491,32 +3163,53 @@ public string m_debugMsg
//-----------------------------------------------------------------------------
// Purpose: Callback for querying UGC
//-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_ISteamParentalSettingsCallbacks + 1)]
- public struct SteamParentalSettingsChanged_t {
+ public struct SteamParentalSettingsChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_ISteamParentalSettingsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_ISteamParentalSettingsCallbacks + 1;
}
// callbacks
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemotePlayCallbacks + 1)]
- public struct SteamRemotePlaySessionConnected_t {
+ public struct SteamRemotePlaySessionConnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemotePlayCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemotePlayCallbacks + 1;
public RemotePlaySessionID_t m_unSessionID;
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemotePlayCallbacks + 2)]
- public struct SteamRemotePlaySessionDisconnected_t {
+ public struct SteamRemotePlaySessionDisconnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemotePlayCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemotePlayCallbacks + 2;
public RemotePlaySessionID_t m_unSessionID;
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemotePlayCallbacks + 3)]
- public struct SteamRemotePlayTogetherGuestInvite_t {
+ public struct SteamRemotePlayTogetherGuestInvite_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemotePlayCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemotePlayCallbacks + 3;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
- private byte[] m_szConnectURL_;
+ internal byte[] m_szConnectURL_;
public string m_szConnectURL
{
get { return InteropHelp.ByteArrayToStringUTF8(m_szConnectURL_); }
@@ -1526,8 +3219,13 @@ public string m_szConnectURL
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemotePlayCallbacks + 4)]
- public struct SteamRemotePlaySessionAvatarLoaded_t {
+ public struct SteamRemotePlaySessionAvatarLoaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemotePlayCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemotePlayCallbacks + 4;
public RemotePlaySessionID_t m_unSessionID; // sessionID the avatar has been loaded for
public int m_iImage; // the image index of the now loaded image
public int m_iWide; // width of the loaded image
@@ -1540,77 +3238,276 @@ public struct SteamRemotePlaySessionAvatarLoaded_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 7)]
- public struct RemoteStorageFileShareResult_t {
+ public struct RemoteStorageFileShareResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 7;
+ public EResult m_eResult; // The result of the operation
+ public UGCHandle_t m_hFile; // The handle that can be shared with users and features
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
+ internal byte[] m_rgchFilename_;
+ public string m_rgchFilename // The name of the file that was shared
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchFilename_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchFilename_, Constants.k_cchFilenameMax); }
+ }
+ }
+
+ #if STEAMWORKS_ANYCPU
+ // callbacks
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to FileShare()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 7)]
+ internal struct RemoteStorageFileShareResult_t_LargePack {
public EResult m_eResult; // The result of the operation
public UGCHandle_t m_hFile; // The handle that can be shared with users and features
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
- private byte[] m_rgchFilename_;
+ internal byte[] m_rgchFilename_;
public string m_rgchFilename // The name of the file that was shared
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchFilename_); }
set { InteropHelp.StringToByteArrayUTF8(value, m_rgchFilename_, Constants.k_cchFilenameMax); }
}
+
+ public static implicit operator RemoteStorageFileShareResult_t(RemoteStorageFileShareResult_t_LargePack value) {
+ RemoteStorageFileShareResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hFile = value.m_hFile;
+ result.m_rgchFilename_ = value.m_rgchFilename_;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageFileShareResult_t_LargePack(RemoteStorageFileShareResult_t value) {
+ RemoteStorageFileShareResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hFile = value.m_hFile;
+ result.m_rgchFilename_ = value.m_rgchFilename_;
+ return result;
+ }
}
+ #endif
// k_iSteamRemoteStorageCallbacks + 8 is deprecated! Do not reuse
//-----------------------------------------------------------------------------
// Purpose: The result of a call to PublishFile()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 9)]
- public struct RemoteStoragePublishFileResult_t {
+ public struct RemoteStoragePublishFileResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 9;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
[MarshalAs(UnmanagedType.I1)]
public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
}
+ #if STEAMWORKS_ANYCPU
+ // k_iSteamRemoteStorageCallbacks + 8 is deprecated! Do not reuse
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to PublishFile()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 9)]
+ internal struct RemoteStoragePublishFileResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
+
+ public static implicit operator RemoteStoragePublishFileResult_t(RemoteStoragePublishFileResult_t_LargePack value) {
+ RemoteStoragePublishFileResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
+
+ public static implicit operator RemoteStoragePublishFileResult_t_LargePack(RemoteStoragePublishFileResult_t value) {
+ RemoteStoragePublishFileResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
+ }
+
+ #endif
// k_iSteamRemoteStorageCallbacks + 10 is deprecated! Do not reuse
//-----------------------------------------------------------------------------
// Purpose: The result of a call to DeletePublishedFile()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 11)]
- public struct RemoteStorageDeletePublishedFileResult_t {
+ public struct RemoteStorageDeletePublishedFileResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 11;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
}
+ #if STEAMWORKS_ANYCPU
+ // k_iSteamRemoteStorageCallbacks + 10 is deprecated! Do not reuse
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to DeletePublishedFile()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 11)]
+ internal struct RemoteStorageDeletePublishedFileResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+
+ public static implicit operator RemoteStorageDeletePublishedFileResult_t(RemoteStorageDeletePublishedFileResult_t_LargePack value) {
+ RemoteStorageDeletePublishedFileResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageDeletePublishedFileResult_t_LargePack(RemoteStorageDeletePublishedFileResult_t value) {
+ RemoteStorageDeletePublishedFileResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to EnumerateUserPublishedFiles()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 12)]
- public struct RemoteStorageEnumerateUserPublishedFilesResult_t {
+ public struct RemoteStorageEnumerateUserPublishedFilesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 12;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 12;
+ public EResult m_eResult; // The result of the operation.
+ public int m_nResultsReturned;
+ public int m_nTotalResultCount;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public PublishedFileId_t[] m_rgPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to EnumerateUserPublishedFiles()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 12)]
+ internal struct RemoteStorageEnumerateUserPublishedFilesResult_t_LargePack {
public EResult m_eResult; // The result of the operation.
public int m_nResultsReturned;
public int m_nTotalResultCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
public PublishedFileId_t[] m_rgPublishedFileId;
+
+ public static implicit operator RemoteStorageEnumerateUserPublishedFilesResult_t(RemoteStorageEnumerateUserPublishedFilesResult_t_LargePack value) {
+ RemoteStorageEnumerateUserPublishedFilesResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageEnumerateUserPublishedFilesResult_t_LargePack(RemoteStorageEnumerateUserPublishedFilesResult_t value) {
+ RemoteStorageEnumerateUserPublishedFilesResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to SubscribePublishedFile()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 13)]
- public struct RemoteStorageSubscribePublishedFileResult_t {
+ public struct RemoteStorageSubscribePublishedFileResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 13;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 13;
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to SubscribePublishedFile()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 13)]
+ internal struct RemoteStorageSubscribePublishedFileResult_t_LargePack {
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
+
+ public static implicit operator RemoteStorageSubscribePublishedFileResult_t(RemoteStorageSubscribePublishedFileResult_t_LargePack value) {
+ RemoteStorageSubscribePublishedFileResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageSubscribePublishedFileResult_t_LargePack(RemoteStorageSubscribePublishedFileResult_t value) {
+ RemoteStorageSubscribePublishedFileResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to EnumerateSubscribePublishedFiles()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 14)]
- public struct RemoteStorageEnumerateUserSubscribedFilesResult_t {
+ public struct RemoteStorageEnumerateUserSubscribedFilesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 14;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 14;
+ public EResult m_eResult; // The result of the operation.
+ public int m_nResultsReturned;
+ public int m_nTotalResultCount;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public PublishedFileId_t[] m_rgPublishedFileId;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public uint[] m_rgRTimeSubscribed;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to EnumerateSubscribePublishedFiles()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 14)]
+ internal struct RemoteStorageEnumerateUserSubscribedFilesResult_t_LargePack {
public EResult m_eResult; // The result of the operation.
public int m_nResultsReturned;
public int m_nTotalResultCount;
@@ -1618,45 +3515,137 @@ public struct RemoteStorageEnumerateUserSubscribedFilesResult_t {
public PublishedFileId_t[] m_rgPublishedFileId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
public uint[] m_rgRTimeSubscribed;
+
+ public static implicit operator RemoteStorageEnumerateUserSubscribedFilesResult_t(RemoteStorageEnumerateUserSubscribedFilesResult_t_LargePack value) {
+ RemoteStorageEnumerateUserSubscribedFilesResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ result.m_rgRTimeSubscribed = value.m_rgRTimeSubscribed;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageEnumerateUserSubscribedFilesResult_t_LargePack(RemoteStorageEnumerateUserSubscribedFilesResult_t value) {
+ RemoteStorageEnumerateUserSubscribedFilesResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ result.m_rgRTimeSubscribed = value.m_rgRTimeSubscribed;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to UnsubscribePublishedFile()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 15)]
- public struct RemoteStorageUnsubscribePublishedFileResult_t {
+ public struct RemoteStorageUnsubscribePublishedFileResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 15;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 15;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to UnsubscribePublishedFile()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 15)]
+ internal struct RemoteStorageUnsubscribePublishedFileResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+
+ public static implicit operator RemoteStorageUnsubscribePublishedFileResult_t(RemoteStorageUnsubscribePublishedFileResult_t_LargePack value) {
+ RemoteStorageUnsubscribePublishedFileResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageUnsubscribePublishedFileResult_t_LargePack(RemoteStorageUnsubscribePublishedFileResult_t value) {
+ RemoteStorageUnsubscribePublishedFileResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to CommitPublishedFileUpdate()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 16)]
- public struct RemoteStorageUpdatePublishedFileResult_t {
+ public struct RemoteStorageUpdatePublishedFileResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 16;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 16;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
[MarshalAs(UnmanagedType.I1)]
public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to CommitPublishedFileUpdate()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 16)]
+ internal struct RemoteStorageUpdatePublishedFileResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
+
+ public static implicit operator RemoteStorageUpdatePublishedFileResult_t(RemoteStorageUpdatePublishedFileResult_t_LargePack value) {
+ RemoteStorageUpdatePublishedFileResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageUpdatePublishedFileResult_t_LargePack(RemoteStorageUpdatePublishedFileResult_t value) {
+ RemoteStorageUpdatePublishedFileResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to UGCDownload()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 17)]
- public struct RemoteStorageDownloadUGCResult_t {
+ public struct RemoteStorageDownloadUGCResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 17;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 17;
public EResult m_eResult; // The result of the operation.
public UGCHandle_t m_hFile; // The handle to the file that was attempted to be downloaded.
public AppId_t m_nAppID; // ID of the app that created this file.
public int m_nSizeInBytes; // The size of the file that was downloaded, in bytes.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
- private byte[] m_pchFileName_;
+ internal byte[] m_pchFileName_;
public string m_pchFileName // The name of the file that was downloaded.
{
get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
@@ -1665,26 +3654,75 @@ public string m_pchFileName // The name of the file that was downloaded.
public ulong m_ulSteamIDOwner; // Steam ID of the user who created this content.
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to UGCDownload()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 17)]
+ internal struct RemoteStorageDownloadUGCResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public UGCHandle_t m_hFile; // The handle to the file that was attempted to be downloaded.
+ public AppId_t m_nAppID; // ID of the app that created this file.
+ public int m_nSizeInBytes; // The size of the file that was downloaded, in bytes.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
+ internal byte[] m_pchFileName_;
+ public string m_pchFileName // The name of the file that was downloaded.
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_pchFileName_, Constants.k_cchFilenameMax); }
+ }
+ public ulong m_ulSteamIDOwner; // Steam ID of the user who created this content.
+
+ public static implicit operator RemoteStorageDownloadUGCResult_t(RemoteStorageDownloadUGCResult_t_LargePack value) {
+ RemoteStorageDownloadUGCResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hFile = value.m_hFile;
+ result.m_nAppID = value.m_nAppID;
+ result.m_nSizeInBytes = value.m_nSizeInBytes;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageDownloadUGCResult_t_LargePack(RemoteStorageDownloadUGCResult_t value) {
+ RemoteStorageDownloadUGCResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hFile = value.m_hFile;
+ result.m_nAppID = value.m_nAppID;
+ result.m_nSizeInBytes = value.m_nSizeInBytes;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to GetPublishedFileDetails()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 18)]
- public struct RemoteStorageGetPublishedFileDetailsResult_t {
+ public struct RemoteStorageGetPublishedFileDetailsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 18;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 18;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId;
public AppId_t m_nCreatorAppID; // ID of the app that created this file.
public AppId_t m_nConsumerAppID; // ID of the app that will consume this file.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentTitleMax)]
- private byte[] m_rgchTitle_;
+ internal byte[] m_rgchTitle_;
public string m_rgchTitle // title of document
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTitle_); }
set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTitle_, Constants.k_cchPublishedDocumentTitleMax); }
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentDescriptionMax)]
- private byte[] m_rgchDescription_;
+ internal byte[] m_rgchDescription_;
public string m_rgchDescription // description of document
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchDescription_); }
@@ -1699,7 +3737,7 @@ public string m_rgchDescription // description of document
[MarshalAs(UnmanagedType.I1)]
public bool m_bBanned;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchTagListMax)]
- private byte[] m_rgchTags_;
+ internal byte[] m_rgchTags_;
public string m_rgchTags // comma separated list of all tags associated with this file
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTags_); }
@@ -1708,7 +3746,7 @@ public string m_rgchTags // comma separated list of all tags associated with thi
[MarshalAs(UnmanagedType.I1)]
public bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
- private byte[] m_pchFileName_;
+ internal byte[] m_pchFileName_;
public string m_pchFileName // The name of the primary file
{
get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
@@ -1717,7 +3755,7 @@ public string m_pchFileName // The name of the primary file
public int m_nFileSize; // Size of the primary file
public int m_nPreviewFileSize; // Size of the preview file
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedFileURLMax)]
- private byte[] m_rgchURL_;
+ internal byte[] m_rgchURL_;
public string m_rgchURL // URL (for a video or a website)
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchURL_); }
@@ -1728,10 +3766,146 @@ public string m_pchFileName // The name of the primary file
public bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to GetPublishedFileDetails()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 18)]
+ internal struct RemoteStorageGetPublishedFileDetailsResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId;
+ public AppId_t m_nCreatorAppID; // ID of the app that created this file.
+ public AppId_t m_nConsumerAppID; // ID of the app that will consume this file.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentTitleMax)]
+ internal byte[] m_rgchTitle_;
+ public string m_rgchTitle // title of document
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTitle_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTitle_, Constants.k_cchPublishedDocumentTitleMax); }
+ }
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentDescriptionMax)]
+ internal byte[] m_rgchDescription_;
+ public string m_rgchDescription // description of document
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchDescription_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchDescription_, Constants.k_cchPublishedDocumentDescriptionMax); }
+ }
+ public UGCHandle_t m_hFile; // The handle of the primary file
+ public UGCHandle_t m_hPreviewFile; // The handle of the preview file
+ public ulong m_ulSteamIDOwner; // Steam ID of the user who created this content.
+ public uint m_rtimeCreated; // time when the published file was created
+ public uint m_rtimeUpdated; // time when the published file was last updated
+ public ERemoteStoragePublishedFileVisibility m_eVisibility;
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bBanned;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchTagListMax)]
+ internal byte[] m_rgchTags_;
+ public string m_rgchTags // comma separated list of all tags associated with this file
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTags_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTags_, Constants.k_cchTagListMax); }
+ }
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
+ internal byte[] m_pchFileName_;
+ public string m_pchFileName // The name of the primary file
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_pchFileName_, Constants.k_cchFilenameMax); }
+ }
+ public int m_nFileSize; // Size of the primary file
+ public int m_nPreviewFileSize; // Size of the preview file
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedFileURLMax)]
+ internal byte[] m_rgchURL_;
+ public string m_rgchURL // URL (for a video or a website)
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchURL_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchURL_, Constants.k_cchPublishedFileURLMax); }
+ }
+ public EWorkshopFileType m_eFileType; // Type of the file
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop
+
+ public static implicit operator RemoteStorageGetPublishedFileDetailsResult_t(RemoteStorageGetPublishedFileDetailsResult_t_LargePack value) {
+ RemoteStorageGetPublishedFileDetailsResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nCreatorAppID = value.m_nCreatorAppID;
+ result.m_nConsumerAppID = value.m_nConsumerAppID;
+ result.m_rgchTitle_ = value.m_rgchTitle_;
+ result.m_rgchDescription_ = value.m_rgchDescription_;
+ result.m_hFile = value.m_hFile;
+ result.m_hPreviewFile = value.m_hPreviewFile;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ result.m_rtimeCreated = value.m_rtimeCreated;
+ result.m_rtimeUpdated = value.m_rtimeUpdated;
+ result.m_eVisibility = value.m_eVisibility;
+ result.m_bBanned = value.m_bBanned;
+ result.m_rgchTags_ = value.m_rgchTags_;
+ result.m_bTagsTruncated = value.m_bTagsTruncated;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_nFileSize = value.m_nFileSize;
+ result.m_nPreviewFileSize = value.m_nPreviewFileSize;
+ result.m_rgchURL_ = value.m_rgchURL_;
+ result.m_eFileType = value.m_eFileType;
+ result.m_bAcceptedForUse = value.m_bAcceptedForUse;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageGetPublishedFileDetailsResult_t_LargePack(RemoteStorageGetPublishedFileDetailsResult_t value) {
+ RemoteStorageGetPublishedFileDetailsResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nCreatorAppID = value.m_nCreatorAppID;
+ result.m_nConsumerAppID = value.m_nConsumerAppID;
+ result.m_rgchTitle_ = value.m_rgchTitle_;
+ result.m_rgchDescription_ = value.m_rgchDescription_;
+ result.m_hFile = value.m_hFile;
+ result.m_hPreviewFile = value.m_hPreviewFile;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ result.m_rtimeCreated = value.m_rtimeCreated;
+ result.m_rtimeUpdated = value.m_rtimeUpdated;
+ result.m_eVisibility = value.m_eVisibility;
+ result.m_bBanned = value.m_bBanned;
+ result.m_rgchTags_ = value.m_rgchTags_;
+ result.m_bTagsTruncated = value.m_bTagsTruncated;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_nFileSize = value.m_nFileSize;
+ result.m_nPreviewFileSize = value.m_nPreviewFileSize;
+ result.m_rgchURL_ = value.m_rgchURL_;
+ result.m_eFileType = value.m_eFileType;
+ result.m_bAcceptedForUse = value.m_bAcceptedForUse;
+ return result;
+ }
+ }
+
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 19)]
- public struct RemoteStorageEnumerateWorkshopFilesResult_t {
+ public struct RemoteStorageEnumerateWorkshopFilesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 19;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 19;
+ public EResult m_eResult;
+ public int m_nResultsReturned;
+ public int m_nTotalResultCount;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public PublishedFileId_t[] m_rgPublishedFileId;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public float[] m_rgScore;
+ public AppId_t m_nAppId;
+ public uint m_unStartIndex;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 19)]
+ internal struct RemoteStorageEnumerateWorkshopFilesResult_t_LargePack {
public EResult m_eResult;
public int m_nResultsReturned;
public int m_nTotalResultCount;
@@ -1741,15 +3915,45 @@ public struct RemoteStorageEnumerateWorkshopFilesResult_t {
public float[] m_rgScore;
public AppId_t m_nAppId;
public uint m_unStartIndex;
+
+ public static implicit operator RemoteStorageEnumerateWorkshopFilesResult_t(RemoteStorageEnumerateWorkshopFilesResult_t_LargePack value) {
+ RemoteStorageEnumerateWorkshopFilesResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ result.m_rgScore = value.m_rgScore;
+ result.m_nAppId = value.m_nAppId;
+ result.m_unStartIndex = value.m_unStartIndex;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageEnumerateWorkshopFilesResult_t_LargePack(RemoteStorageEnumerateWorkshopFilesResult_t value) {
+ RemoteStorageEnumerateWorkshopFilesResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ result.m_rgScore = value.m_rgScore;
+ result.m_nAppId = value.m_nAppId;
+ result.m_unStartIndex = value.m_unStartIndex;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of GetPublishedItemVoteDetails
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 20)]
- public struct RemoteStorageGetPublishedItemVoteDetailsResult_t {
+ public struct RemoteStorageGetPublishedItemVoteDetailsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 20;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 20;
public EResult m_eResult;
public PublishedFileId_t m_unPublishedFileId;
public int m_nVotesFor;
@@ -1758,13 +3962,56 @@ public struct RemoteStorageGetPublishedItemVoteDetailsResult_t {
public float m_fScore;
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of GetPublishedItemVoteDetails
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 20)]
+ internal struct RemoteStorageGetPublishedItemVoteDetailsResult_t_LargePack {
+ public EResult m_eResult;
+ public PublishedFileId_t m_unPublishedFileId;
+ public int m_nVotesFor;
+ public int m_nVotesAgainst;
+ public int m_nReports;
+ public float m_fScore;
+
+ public static implicit operator RemoteStorageGetPublishedItemVoteDetailsResult_t(RemoteStorageGetPublishedItemVoteDetailsResult_t_LargePack value) {
+ RemoteStorageGetPublishedItemVoteDetailsResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_unPublishedFileId = value.m_unPublishedFileId;
+ result.m_nVotesFor = value.m_nVotesFor;
+ result.m_nVotesAgainst = value.m_nVotesAgainst;
+ result.m_nReports = value.m_nReports;
+ result.m_fScore = value.m_fScore;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageGetPublishedItemVoteDetailsResult_t_LargePack(RemoteStorageGetPublishedItemVoteDetailsResult_t value) {
+ RemoteStorageGetPublishedItemVoteDetailsResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_unPublishedFileId = value.m_unPublishedFileId;
+ result.m_nVotesFor = value.m_nVotesFor;
+ result.m_nVotesAgainst = value.m_nVotesAgainst;
+ result.m_nReports = value.m_nReports;
+ result.m_fScore = value.m_fScore;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: User subscribed to a file for the app (from within the app or on the web)
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 21)]
- public struct RemoteStoragePublishedFileSubscribed_t {
+ public struct RemoteStoragePublishedFileSubscribed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 21;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 21;
public PublishedFileId_t m_nPublishedFileId; // The published file id
public AppId_t m_nAppID; // ID of the app that will consume this file.
}
@@ -1774,8 +4021,13 @@ public struct RemoteStoragePublishedFileSubscribed_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 22)]
- public struct RemoteStoragePublishedFileUnsubscribed_t {
+ public struct RemoteStoragePublishedFileUnsubscribed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 22;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 22;
public PublishedFileId_t m_nPublishedFileId; // The published file id
public AppId_t m_nAppID; // ID of the app that will consume this file.
}
@@ -1785,8 +4037,13 @@ public struct RemoteStoragePublishedFileUnsubscribed_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 23)]
- public struct RemoteStoragePublishedFileDeleted_t {
+ public struct RemoteStoragePublishedFileDeleted_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 23;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 23;
public PublishedFileId_t m_nPublishedFileId; // The published file id
public AppId_t m_nAppID; // ID of the app that will consume this file.
}
@@ -1796,48 +4053,184 @@ public struct RemoteStoragePublishedFileDeleted_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 24)]
- public struct RemoteStorageUpdateUserPublishedItemVoteResult_t {
+ public struct RemoteStorageUpdateUserPublishedItemVoteResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 24;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 24;
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId; // The published file id
}
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to UpdateUserPublishedItemVote()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 24)]
+ internal struct RemoteStorageUpdateUserPublishedItemVoteResult_t_LargePack {
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId; // The published file id
+
+ public static implicit operator RemoteStorageUpdateUserPublishedItemVoteResult_t(RemoteStorageUpdateUserPublishedItemVoteResult_t_LargePack value) {
+ RemoteStorageUpdateUserPublishedItemVoteResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageUpdateUserPublishedItemVoteResult_t_LargePack(RemoteStorageUpdateUserPublishedItemVoteResult_t value) {
+ RemoteStorageUpdateUserPublishedItemVoteResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+ }
+
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to GetUserPublishedItemVoteDetails()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 25)]
- public struct RemoteStorageUserVoteDetails_t {
+ public struct RemoteStorageUserVoteDetails_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 25;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 25;
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId; // The published file id
+ public EWorkshopVote m_eVote; // what the user voted
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to GetUserPublishedItemVoteDetails()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 25)]
+ internal struct RemoteStorageUserVoteDetails_t_LargePack {
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId; // The published file id
public EWorkshopVote m_eVote; // what the user voted
+
+ public static implicit operator RemoteStorageUserVoteDetails_t(RemoteStorageUserVoteDetails_t_LargePack value) {
+ RemoteStorageUserVoteDetails_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eVote = value.m_eVote;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageUserVoteDetails_t_LargePack(RemoteStorageUserVoteDetails_t value) {
+ RemoteStorageUserVoteDetails_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eVote = value.m_eVote;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 26)]
- public struct RemoteStorageEnumerateUserSharedWorkshopFilesResult_t {
+ public struct RemoteStorageEnumerateUserSharedWorkshopFilesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 26;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 26;
+ public EResult m_eResult; // The result of the operation.
+ public int m_nResultsReturned;
+ public int m_nTotalResultCount;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
+ public PublishedFileId_t[] m_rgPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 26)]
+ internal struct RemoteStorageEnumerateUserSharedWorkshopFilesResult_t_LargePack {
public EResult m_eResult; // The result of the operation.
public int m_nResultsReturned;
public int m_nTotalResultCount;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_unEnumeratePublishedFilesMaxResults)]
public PublishedFileId_t[] m_rgPublishedFileId;
+
+ public static implicit operator RemoteStorageEnumerateUserSharedWorkshopFilesResult_t(RemoteStorageEnumerateUserSharedWorkshopFilesResult_t_LargePack value) {
+ RemoteStorageEnumerateUserSharedWorkshopFilesResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageEnumerateUserSharedWorkshopFilesResult_t_LargePack(RemoteStorageEnumerateUserSharedWorkshopFilesResult_t value) {
+ RemoteStorageEnumerateUserSharedWorkshopFilesResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nResultsReturned = value.m_nResultsReturned;
+ result.m_nTotalResultCount = value.m_nTotalResultCount;
+ result.m_rgPublishedFileId = value.m_rgPublishedFileId;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 27)]
- public struct RemoteStorageSetUserPublishedFileActionResult_t {
+ public struct RemoteStorageSetUserPublishedFileActionResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 27;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 27;
+ public EResult m_eResult; // The result of the operation.
+ public PublishedFileId_t m_nPublishedFileId; // The published file id
+ public EWorkshopFileAction m_eAction; // the action that was attempted
+ }
+
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 27)]
+ internal struct RemoteStorageSetUserPublishedFileActionResult_t_LargePack {
public EResult m_eResult; // The result of the operation.
public PublishedFileId_t m_nPublishedFileId; // The published file id
public EWorkshopFileAction m_eAction; // the action that was attempted
+
+ public static implicit operator RemoteStorageSetUserPublishedFileActionResult_t(RemoteStorageSetUserPublishedFileActionResult_t_LargePack value) {
+ RemoteStorageSetUserPublishedFileActionResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eAction = value.m_eAction;
+ return result;
+ }
+
+ public static implicit operator RemoteStorageSetUserPublishedFileActionResult_t_LargePack(RemoteStorageSetUserPublishedFileActionResult_t value) {
+ RemoteStorageSetUserPublishedFileActionResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eAction = value.m_eAction;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 28)]
- public struct RemoteStorageEnumeratePublishedFilesByUserActionResult_t {
+ public struct RemoteStorageEnumeratePublishedFilesByUserActionResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 28;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 28;
public EResult m_eResult; // The result of the operation.
public EWorkshopFileAction m_eAction; // the action that was filtered on
public int m_nResultsReturned;
@@ -1853,8 +4246,13 @@ public struct RemoteStorageEnumeratePublishedFilesByUserActionResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 29)]
- public struct RemoteStoragePublishFileProgress_t {
+ public struct RemoteStoragePublishFileProgress_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 29;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 29;
public double m_dPercentFile;
[MarshalAs(UnmanagedType.I1)]
public bool m_bPreview;
@@ -1865,20 +4263,59 @@ public struct RemoteStoragePublishFileProgress_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 30)]
- public struct RemoteStoragePublishedFileUpdated_t {
+ public struct RemoteStoragePublishedFileUpdated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 30;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 30;
+ public PublishedFileId_t m_nPublishedFileId; // The published file id
+ public AppId_t m_nAppID; // ID of the app that will consume this file.
+ public ulong m_ulUnused; // not used anymore
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: Called when the content for a published file is updated
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 30)]
+ internal struct RemoteStoragePublishedFileUpdated_t_LargePack {
public PublishedFileId_t m_nPublishedFileId; // The published file id
public AppId_t m_nAppID; // ID of the app that will consume this file.
public ulong m_ulUnused; // not used anymore
+
+ public static implicit operator RemoteStoragePublishedFileUpdated_t(RemoteStoragePublishedFileUpdated_t_LargePack value) {
+ RemoteStoragePublishedFileUpdated_t result = default;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ result.m_ulUnused = value.m_ulUnused;
+ return result;
+ }
+
+ public static implicit operator RemoteStoragePublishedFileUpdated_t_LargePack(RemoteStoragePublishedFileUpdated_t value) {
+ RemoteStoragePublishedFileUpdated_t_LargePack result = default;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ result.m_ulUnused = value.m_ulUnused;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: Called when a FileWriteAsync completes
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 31)]
- public struct RemoteStorageFileWriteAsyncComplete_t {
+ public struct RemoteStorageFileWriteAsyncComplete_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 31;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 31;
public EResult m_eResult; // result
}
@@ -1887,8 +4324,13 @@ public struct RemoteStorageFileWriteAsyncComplete_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 32)]
- public struct RemoteStorageFileReadAsyncComplete_t {
+ public struct RemoteStorageFileReadAsyncComplete_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 32;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 32;
public SteamAPICall_t m_hFileReadAsync; // call handle of the async read which was made
public EResult m_eResult; // result
public uint m_nOffset; // offset in the file this read was at
@@ -1902,8 +4344,13 @@ public struct RemoteStorageFileReadAsyncComplete_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamRemoteStorageCallbacks + 33)]
- public struct RemoteStorageLocalFileChange_t {
+ public struct RemoteStorageLocalFileChange_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamRemoteStorageCallbacks + 33;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamRemoteStorageCallbacks + 33;
}
// callbacks
@@ -1913,8 +4360,13 @@ public struct RemoteStorageLocalFileChange_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamScreenshotsCallbacks + 1)]
- public struct ScreenshotReady_t {
+ public struct ScreenshotReady_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamScreenshotsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamScreenshotsCallbacks + 1;
public ScreenshotHandle m_hLocal;
public EResult m_eResult;
}
@@ -1926,8 +4378,13 @@ public struct ScreenshotReady_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamScreenshotsCallbacks + 2)]
- public struct ScreenshotRequested_t {
+ public struct ScreenshotRequested_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamScreenshotsCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamScreenshotsCallbacks + 2;
}
//-----------------------------------------------------------------------------
@@ -1935,10 +4392,15 @@ public struct ScreenshotRequested_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamTimelineCallbacks + 1)]
- public struct SteamTimelineGamePhaseRecordingExists_t {
+ public struct SteamTimelineGamePhaseRecordingExists_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamTimelineCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamTimelineCallbacks + 1;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchMaxPhaseIDLength)]
- private byte[] m_rgchPhaseID_;
+ internal byte[] m_rgchPhaseID_;
public string m_rgchPhaseID
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchPhaseID_); }
@@ -1955,8 +4417,13 @@ public string m_rgchPhaseID
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamTimelineCallbacks + 2)]
- public struct SteamTimelineEventRecordingExists_t {
+ public struct SteamTimelineEventRecordingExists_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamTimelineCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamTimelineCallbacks + 2;
public ulong m_ulEventID;
[MarshalAs(UnmanagedType.I1)]
public bool m_bRecordingExists;
@@ -1967,8 +4434,13 @@ public struct SteamTimelineEventRecordingExists_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 1)]
- public struct SteamUGCQueryCompleted_t {
+ public struct SteamUGCQueryCompleted_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 1;
public UGCQueryHandle_t m_handle;
public EResult m_eResult;
public uint m_unNumResultsReturned;
@@ -1976,7 +4448,7 @@ public struct SteamUGCQueryCompleted_t {
[MarshalAs(UnmanagedType.I1)]
public bool m_bCachedData; // indicates whether this data was retrieved from the local on-disk cache
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedFileURLMax)]
- private byte[] m_rgchNextCursor_;
+ internal byte[] m_rgchNextCursor_;
public string m_rgchNextCursor // If a paging cursor was used, then this will be the next cursor to get the next result set.
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchNextCursor_); }
@@ -1989,8 +4461,13 @@ public struct SteamUGCQueryCompleted_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 2)]
- public struct SteamUGCRequestUGCDetailsResult_t {
+ public struct SteamUGCRequestUGCDetailsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 2;
public SteamUGCDetails_t m_details;
[MarshalAs(UnmanagedType.I1)]
public bool m_bCachedData; // indicates whether this data was retrieved from the local on-disk cache
@@ -2001,21 +4478,61 @@ public struct SteamUGCRequestUGCDetailsResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 3)]
- public struct CreateItemResult_t {
+ public struct CreateItemResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 3;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId; // new item got this UGC PublishFileID
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: result for ISteamUGC::CreateItem()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 3)]
+ internal struct CreateItemResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId; // new item got this UGC PublishFileID
[MarshalAs(UnmanagedType.I1)]
public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
+
+ public static implicit operator CreateItemResult_t(CreateItemResult_t_LargePack value) {
+ CreateItemResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
+
+ public static implicit operator CreateItemResult_t_LargePack(CreateItemResult_t value) {
+ CreateItemResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_bUserNeedsToAcceptWorkshopLegalAgreement = value.m_bUserNeedsToAcceptWorkshopLegalAgreement;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: result for ISteamUGC::SubmitItemUpdate()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 4)]
- public struct SubmitItemUpdateResult_t {
+ public struct SubmitItemUpdateResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 4;
public EResult m_eResult;
[MarshalAs(UnmanagedType.I1)]
public bool m_bUserNeedsToAcceptWorkshopLegalAgreement;
@@ -2027,33 +4544,109 @@ public struct SubmitItemUpdateResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 5)]
- public struct ItemInstalled_t {
+ public struct ItemInstalled_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 5;
+ public AppId_t m_unAppID;
+ public PublishedFileId_t m_nPublishedFileId;
+ public UGCHandle_t m_hLegacyContent;
+ public ulong m_unManifestID;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: a Workshop item has been installed or updated
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 5)]
+ internal struct ItemInstalled_t_LargePack {
public AppId_t m_unAppID;
public PublishedFileId_t m_nPublishedFileId;
public UGCHandle_t m_hLegacyContent;
public ulong m_unManifestID;
+
+ public static implicit operator ItemInstalled_t(ItemInstalled_t_LargePack value) {
+ ItemInstalled_t result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_hLegacyContent = value.m_hLegacyContent;
+ result.m_unManifestID = value.m_unManifestID;
+ return result;
+ }
+
+ public static implicit operator ItemInstalled_t_LargePack(ItemInstalled_t value) {
+ ItemInstalled_t_LargePack result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_hLegacyContent = value.m_hLegacyContent;
+ result.m_unManifestID = value.m_unManifestID;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: result of DownloadItem(), existing item files can be accessed again
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 6)]
- public struct DownloadItemResult_t {
+ public struct DownloadItemResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 6;
+ public AppId_t m_unAppID;
+ public PublishedFileId_t m_nPublishedFileId;
+ public EResult m_eResult;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: result of DownloadItem(), existing item files can be accessed again
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 6)]
+ internal struct DownloadItemResult_t_LargePack {
public AppId_t m_unAppID;
public PublishedFileId_t m_nPublishedFileId;
public EResult m_eResult;
+
+ public static implicit operator DownloadItemResult_t(DownloadItemResult_t_LargePack value) {
+ DownloadItemResult_t result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eResult = value.m_eResult;
+ return result;
+ }
+
+ public static implicit operator DownloadItemResult_t_LargePack(DownloadItemResult_t value) {
+ DownloadItemResult_t_LargePack result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eResult = value.m_eResult;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: result of AddItemToFavorites() or RemoveItemFromFavorites()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 7)]
- public struct UserFavoriteItemsListChanged_t {
+ public struct UserFavoriteItemsListChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 7;
public PublishedFileId_t m_nPublishedFileId;
public EResult m_eResult;
[MarshalAs(UnmanagedType.I1)]
@@ -2065,8 +4658,13 @@ public struct UserFavoriteItemsListChanged_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 8)]
- public struct SetUserItemVoteResult_t {
+ public struct SetUserItemVoteResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 8;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 8;
public PublishedFileId_t m_nPublishedFileId;
public EResult m_eResult;
[MarshalAs(UnmanagedType.I1)]
@@ -2078,8 +4676,13 @@ public struct SetUserItemVoteResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 9)]
- public struct GetUserItemVoteResult_t {
+ public struct GetUserItemVoteResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 9;
public PublishedFileId_t m_nPublishedFileId;
public EResult m_eResult;
[MarshalAs(UnmanagedType.I1)]
@@ -2095,8 +4698,13 @@ public struct GetUserItemVoteResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 10)]
- public struct StartPlaytimeTrackingResult_t {
+ public struct StartPlaytimeTrackingResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 10;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 10;
public EResult m_eResult;
}
@@ -2105,8 +4713,13 @@ public struct StartPlaytimeTrackingResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 11)]
- public struct StopPlaytimeTrackingResult_t {
+ public struct StopPlaytimeTrackingResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 11;
public EResult m_eResult;
}
@@ -2115,83 +4728,297 @@ public struct StopPlaytimeTrackingResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 12)]
- public struct AddUGCDependencyResult_t {
+ public struct AddUGCDependencyResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 12;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 12;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ public PublishedFileId_t m_nChildPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to AddDependency
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 12)]
+ internal struct AddUGCDependencyResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
public PublishedFileId_t m_nChildPublishedFileId;
+
+ public static implicit operator AddUGCDependencyResult_t(AddUGCDependencyResult_t_LargePack value) {
+ AddUGCDependencyResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nChildPublishedFileId = value.m_nChildPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator AddUGCDependencyResult_t_LargePack(AddUGCDependencyResult_t value) {
+ AddUGCDependencyResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nChildPublishedFileId = value.m_nChildPublishedFileId;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to RemoveDependency
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 13)]
- public struct RemoveUGCDependencyResult_t {
+ public struct RemoveUGCDependencyResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 13;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 13;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ public PublishedFileId_t m_nChildPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to RemoveDependency
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 13)]
+ internal struct RemoveUGCDependencyResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
public PublishedFileId_t m_nChildPublishedFileId;
+
+ public static implicit operator RemoveUGCDependencyResult_t(RemoveUGCDependencyResult_t_LargePack value) {
+ RemoveUGCDependencyResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nChildPublishedFileId = value.m_nChildPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator RemoveUGCDependencyResult_t_LargePack(RemoveUGCDependencyResult_t value) {
+ RemoveUGCDependencyResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nChildPublishedFileId = value.m_nChildPublishedFileId;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to AddAppDependency
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 14)]
- public struct AddAppDependencyResult_t {
+ public struct AddAppDependencyResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 14;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 14;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ public AppId_t m_nAppID;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to AddAppDependency
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 14)]
+ internal struct AddAppDependencyResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
public AppId_t m_nAppID;
+
+ public static implicit operator AddAppDependencyResult_t(AddAppDependencyResult_t_LargePack value) {
+ AddAppDependencyResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ return result;
+ }
+
+ public static implicit operator AddAppDependencyResult_t_LargePack(AddAppDependencyResult_t value) {
+ AddAppDependencyResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to RemoveAppDependency
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 15)]
- public struct RemoveAppDependencyResult_t {
+ public struct RemoveAppDependencyResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 15;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 15;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ public AppId_t m_nAppID;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to RemoveAppDependency
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 15)]
+ internal struct RemoveAppDependencyResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
public AppId_t m_nAppID;
+
+ public static implicit operator RemoveAppDependencyResult_t(RemoveAppDependencyResult_t_LargePack value) {
+ RemoveAppDependencyResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ return result;
+ }
+
+ public static implicit operator RemoveAppDependencyResult_t_LargePack(RemoveAppDependencyResult_t value) {
+ RemoveAppDependencyResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_nAppID = value.m_nAppID;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to GetAppDependencies. Callback may be called
// multiple times until all app dependencies have been returned.
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 16)]
- public struct GetAppDependenciesResult_t {
+ public struct GetAppDependenciesResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 16;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 16;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
+ public AppId_t[] m_rgAppIDs;
+ public uint m_nNumAppDependencies; // number returned in this struct
+ public uint m_nTotalNumAppDependencies; // total found
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to GetAppDependencies. Callback may be called
+ // multiple times until all app dependencies have been returned.
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 16)]
+ internal struct GetAppDependenciesResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public AppId_t[] m_rgAppIDs;
public uint m_nNumAppDependencies; // number returned in this struct
public uint m_nTotalNumAppDependencies; // total found
+
+ public static implicit operator GetAppDependenciesResult_t(GetAppDependenciesResult_t_LargePack value) {
+ GetAppDependenciesResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_rgAppIDs = value.m_rgAppIDs;
+ result.m_nNumAppDependencies = value.m_nNumAppDependencies;
+ result.m_nTotalNumAppDependencies = value.m_nTotalNumAppDependencies;
+ return result;
+ }
+
+ public static implicit operator GetAppDependenciesResult_t_LargePack(GetAppDependenciesResult_t value) {
+ GetAppDependenciesResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_rgAppIDs = value.m_rgAppIDs;
+ result.m_nNumAppDependencies = value.m_nNumAppDependencies;
+ result.m_nTotalNumAppDependencies = value.m_nTotalNumAppDependencies;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: The result of a call to DeleteItem
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 17)]
- public struct DeleteItemResult_t {
+ public struct DeleteItemResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 17;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 17;
+ public EResult m_eResult;
+ public PublishedFileId_t m_nPublishedFileId;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: The result of a call to DeleteItem
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUGCCallbacks + 17)]
+ internal struct DeleteItemResult_t_LargePack {
public EResult m_eResult;
public PublishedFileId_t m_nPublishedFileId;
+
+ public static implicit operator DeleteItemResult_t(DeleteItemResult_t_LargePack value) {
+ DeleteItemResult_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
+
+ public static implicit operator DeleteItemResult_t_LargePack(DeleteItemResult_t value) {
+ DeleteItemResult_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: signal that the list of subscribed items changed
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 18)]
- public struct UserSubscribedItemsListChanged_t {
+ public struct UserSubscribedItemsListChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 18;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 18;
public AppId_t m_nAppID;
}
@@ -2200,8 +5027,13 @@ public struct UserSubscribedItemsListChanged_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUGCCallbacks + 20)]
- public struct WorkshopEULAStatus_t {
+ public struct WorkshopEULAStatus_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUGCCallbacks + 20;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUGCCallbacks + 20;
public EResult m_eResult;
public AppId_t m_nAppID;
public uint m_unVersion;
@@ -2222,8 +5054,13 @@ public struct WorkshopEULAStatus_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 1)]
- public struct SteamServersConnected_t {
+ public struct SteamServersConnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 1;
}
//-----------------------------------------------------------------------------
@@ -2233,8 +5070,13 @@ public struct SteamServersConnected_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 2)]
- public struct SteamServerConnectFailure_t {
+ public struct SteamServerConnectFailure_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 2;
public EResult m_eResult;
[MarshalAs(UnmanagedType.I1)]
public bool m_bStillRetrying;
@@ -2246,8 +5088,13 @@ public struct SteamServerConnectFailure_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 3)]
- public struct SteamServersDisconnected_t {
+ public struct SteamServersDisconnected_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 3;
public EResult m_eResult;
}
@@ -2259,8 +5106,13 @@ public struct SteamServersDisconnected_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 13)]
- public struct ClientGameServerDeny_t {
+ public struct ClientGameServerDeny_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 13;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 13;
public uint m_uAppID;
public uint m_unGameServerIP;
@@ -2274,11 +5126,15 @@ public struct ClientGameServerDeny_t {
// When getting this message the client should disconnect from Steam, reset any stored Steam state and reconnect.
// This usually occurs in the rare event the Steam client has some kind of fatal error.
//-----------------------------------------------------------------------------
- [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
+ [StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 17)]
- public struct IPCFailure_t {
+ public struct IPCFailure_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 17;
- public byte m_eFailureType;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 17;
}
//-----------------------------------------------------------------------------
@@ -2286,8 +5142,13 @@ public struct IPCFailure_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 25)]
- public struct LicensesUpdated_t {
+ public struct LicensesUpdated_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 25;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 25;
}
//-----------------------------------------------------------------------------
@@ -2295,33 +5156,107 @@ public struct LicensesUpdated_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = 4)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 43)]
- public struct ValidateAuthTicketResponse_t {
+ public struct ValidateAuthTicketResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 43;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 43;
+ public CSteamID m_SteamID;
+ public EAuthSessionResponse m_eAuthSessionResponse;
+ public CSteamID m_OwnerSteamID; // different from m_SteamID if borrowed
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // callback for BeginAuthSession
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUserCallbacks + 43)]
+ internal struct ValidateAuthTicketResponse_t_LargePack {
public CSteamID m_SteamID;
public EAuthSessionResponse m_eAuthSessionResponse;
public CSteamID m_OwnerSteamID; // different from m_SteamID if borrowed
+
+ public static implicit operator ValidateAuthTicketResponse_t(ValidateAuthTicketResponse_t_LargePack value) {
+ ValidateAuthTicketResponse_t result = default;
+ result.m_SteamID = value.m_SteamID;
+ result.m_eAuthSessionResponse = value.m_eAuthSessionResponse;
+ result.m_OwnerSteamID = value.m_OwnerSteamID;
+ return result;
+ }
+
+ public static implicit operator ValidateAuthTicketResponse_t_LargePack(ValidateAuthTicketResponse_t value) {
+ ValidateAuthTicketResponse_t_LargePack result = default;
+ result.m_SteamID = value.m_SteamID;
+ result.m_eAuthSessionResponse = value.m_eAuthSessionResponse;
+ result.m_OwnerSteamID = value.m_OwnerSteamID;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: called when a user has responded to a microtransaction authorization request
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 52)]
- public struct MicroTxnAuthorizationResponse_t {
+ public struct MicroTxnAuthorizationResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 52;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 52;
+
+ public uint m_unAppID; // AppID for this microtransaction
+ public ulong m_ulOrderID; // OrderID provided for the microtransaction
+ public byte m_bAuthorized; // if user authorized transaction
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: called when a user has responded to a microtransaction authorization request
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUserCallbacks + 52)]
+ internal struct MicroTxnAuthorizationResponse_t_LargePack {
public uint m_unAppID; // AppID for this microtransaction
public ulong m_ulOrderID; // OrderID provided for the microtransaction
public byte m_bAuthorized; // if user authorized transaction
+
+ public static implicit operator MicroTxnAuthorizationResponse_t(MicroTxnAuthorizationResponse_t_LargePack value) {
+ MicroTxnAuthorizationResponse_t result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulOrderID = value.m_ulOrderID;
+ result.m_bAuthorized = value.m_bAuthorized;
+ return result;
+ }
+
+ public static implicit operator MicroTxnAuthorizationResponse_t_LargePack(MicroTxnAuthorizationResponse_t value) {
+ MicroTxnAuthorizationResponse_t_LargePack result = default;
+ result.m_unAppID = value.m_unAppID;
+ result.m_ulOrderID = value.m_ulOrderID;
+ result.m_bAuthorized = value.m_bAuthorized;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: Result from RequestEncryptedAppTicket
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 54)]
- public struct EncryptedAppTicketResponse_t {
+ public struct EncryptedAppTicketResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 54;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 54;
public EResult m_eResult;
}
@@ -2331,8 +5266,13 @@ public struct EncryptedAppTicketResponse_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 63)]
- public struct GetAuthSessionTicketResponse_t {
+ public struct GetAuthSessionTicketResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 63;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 63;
public HAuthTicket m_hAuthTicket;
public EResult m_eResult;
}
@@ -2342,10 +5282,15 @@ public struct GetAuthSessionTicketResponse_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 64)]
- public struct GameWebCallback_t {
+ public struct GameWebCallback_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 64;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 64;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- private byte[] m_szURL_;
+ internal byte[] m_szURL_;
public string m_szURL
{
get { return InteropHelp.ByteArrayToStringUTF8(m_szURL_); }
@@ -2358,10 +5303,15 @@ public string m_szURL
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 65)]
- public struct StoreAuthURLResponse_t {
+ public struct StoreAuthURLResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 65;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 65;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
- private byte[] m_szURL_;
+ internal byte[] m_szURL_;
public string m_szURL
{
get { return InteropHelp.ByteArrayToStringUTF8(m_szURL_); }
@@ -2374,8 +5324,13 @@ public string m_szURL
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 66)]
- public struct MarketEligibilityResponse_t {
+ public struct MarketEligibilityResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 66;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 66;
[MarshalAs(UnmanagedType.I1)]
public bool m_bAllowed;
public EMarketNotAllowedReasonFlags m_eNotAllowedReason;
@@ -2395,8 +5350,13 @@ public struct MarketEligibilityResponse_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 67)]
- public struct DurationControl_t {
+ public struct DurationControl_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 67;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 67;
public EResult m_eResult; // result of call (always k_EResultOK for asynchronous timer-based notifications)
public AppId_t m_appid; // appid generating playtime
@@ -2417,8 +5377,13 @@ public struct DurationControl_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserCallbacks + 68)]
- public struct GetTicketForWebApiResponse_t {
+ public struct GetTicketForWebApiResponse_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserCallbacks + 68;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserCallbacks + 68;
public HAuthTicket m_hAuthTicket;
public EResult m_eResult;
public int m_cubTicket;
@@ -2433,8 +5398,13 @@ public struct GetTicketForWebApiResponse_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Explicit, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 1)]
- public struct UserStatsReceived_t {
+ public struct UserStatsReceived_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 1;
[FieldOffset(0)]
public ulong m_nGameID; // Game these stats are for
[FieldOffset(8)]
@@ -2448,8 +5418,13 @@ public struct UserStatsReceived_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 2)]
- public struct UserStatsStored_t {
+ public struct UserStatsStored_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 2;
public ulong m_nGameID; // Game these stats are for
public EResult m_eResult; // success / error
}
@@ -2461,14 +5436,19 @@ public struct UserStatsStored_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 3)]
- public struct UserAchievementStored_t {
+ public struct UserAchievementStored_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 3;
public ulong m_nGameID; // Game this is for
[MarshalAs(UnmanagedType.I1)]
public bool m_bGroupAchievement; // unused. if this is a "group" achievement
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchStatNameMax)]
- private byte[] m_rgchAchievementName_;
+ internal byte[] m_rgchAchievementName_;
public string m_rgchAchievementName // name of the achievement
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchAchievementName_); }
@@ -2484,8 +5464,13 @@ public string m_rgchAchievementName // name of the achievement
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 4)]
- public struct LeaderboardFindResult_t {
+ public struct LeaderboardFindResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 4;
public SteamLeaderboard_t m_hSteamLeaderboard; // handle to the leaderboard serarched for, 0 if no leaderboard found
public byte m_bLeaderboardFound; // 0 if no leaderboard found
}
@@ -2496,8 +5481,13 @@ public struct LeaderboardFindResult_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 5)]
- public struct LeaderboardScoresDownloaded_t {
+ public struct LeaderboardScoresDownloaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 5;
public SteamLeaderboard_t m_hSteamLeaderboard;
public SteamLeaderboardEntries_t m_hSteamLeaderboardEntries; // the handle to pass into GetDownloadedLeaderboardEntries()
public int m_cEntryCount; // the number of entries downloaded
@@ -2509,20 +5499,69 @@ public struct LeaderboardScoresDownloaded_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 6)]
- public struct LeaderboardScoreUploaded_t {
+ public struct LeaderboardScoreUploaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 6;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 6;
+ public byte m_bSuccess; // 1 if the call was successful
+ public SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was
+ public int m_nScore; // the score that was attempted to set
+ public byte m_bScoreChanged; // true if the score in the leaderboard change, false if the existing score was better
+ public int m_nGlobalRankNew; // the new global rank of the user in this leaderboard
+ public int m_nGlobalRankPrevious; // the previous global rank of the user in this leaderboard; 0 if the user had no existing entry in the leaderboard
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: call result indicating scores has been uploaded, returned as a result of UploadLeaderboardScore()
+ // use CCallResult<> to map this async result to a member function
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 6)]
+ internal struct LeaderboardScoreUploaded_t_LargePack {
public byte m_bSuccess; // 1 if the call was successful
public SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was
public int m_nScore; // the score that was attempted to set
public byte m_bScoreChanged; // true if the score in the leaderboard change, false if the existing score was better
public int m_nGlobalRankNew; // the new global rank of the user in this leaderboard
public int m_nGlobalRankPrevious; // the previous global rank of the user in this leaderboard; 0 if the user had no existing entry in the leaderboard
+
+ public static implicit operator LeaderboardScoreUploaded_t(LeaderboardScoreUploaded_t_LargePack value) {
+ LeaderboardScoreUploaded_t result = default;
+ result.m_bSuccess = value.m_bSuccess;
+ result.m_hSteamLeaderboard = value.m_hSteamLeaderboard;
+ result.m_nScore = value.m_nScore;
+ result.m_bScoreChanged = value.m_bScoreChanged;
+ result.m_nGlobalRankNew = value.m_nGlobalRankNew;
+ result.m_nGlobalRankPrevious = value.m_nGlobalRankPrevious;
+ return result;
+ }
+
+ public static implicit operator LeaderboardScoreUploaded_t_LargePack(LeaderboardScoreUploaded_t value) {
+ LeaderboardScoreUploaded_t_LargePack result = default;
+ result.m_bSuccess = value.m_bSuccess;
+ result.m_hSteamLeaderboard = value.m_hSteamLeaderboard;
+ result.m_nScore = value.m_nScore;
+ result.m_bScoreChanged = value.m_bScoreChanged;
+ result.m_nGlobalRankNew = value.m_nGlobalRankNew;
+ result.m_nGlobalRankPrevious = value.m_nGlobalRankPrevious;
+ return result;
+ }
}
+ #endif
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 7)]
- public struct NumberOfCurrentPlayers_t {
+ public struct NumberOfCurrentPlayers_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 7;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 7;
public byte m_bSuccess; // 1 if the call was successful
public int m_cPlayers; // Number of players currently playing
}
@@ -2533,8 +5572,13 @@ public struct NumberOfCurrentPlayers_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 8)]
- public struct UserStatsUnloaded_t {
+ public struct UserStatsUnloaded_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 8;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 8;
public CSteamID m_steamIDUser; // User whose stats have been unloaded
}
@@ -2543,12 +5587,17 @@ public struct UserStatsUnloaded_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 9)]
- public struct UserAchievementIconFetched_t {
+ public struct UserAchievementIconFetched_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 9;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 9;
public CGameID m_nGameID; // Game this is for
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchStatNameMax)]
- private byte[] m_rgchAchievementName_;
+ internal byte[] m_rgchAchievementName_;
public string m_rgchAchievementName // name of the achievement
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchAchievementName_); }
@@ -2564,8 +5613,13 @@ public string m_rgchAchievementName // name of the achievement
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 10)]
- public struct GlobalAchievementPercentagesReady_t {
+ public struct GlobalAchievementPercentagesReady_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 10;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 10;
public ulong m_nGameID; // Game this is for
public EResult m_eResult; // Result of the operation
@@ -2576,20 +5630,56 @@ public struct GlobalAchievementPercentagesReady_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 11)]
- public struct LeaderboardUGCSet_t {
+ public struct LeaderboardUGCSet_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 11;
+ public EResult m_eResult; // The result of the operation
+ public SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was
+ }
+
+ #if STEAMWORKS_ANYCPU
+ //-----------------------------------------------------------------------------
+ // Purpose: call result indicating UGC has been uploaded, returned as a result of SetLeaderboardUGC()
+ //-----------------------------------------------------------------------------
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ [CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 11)]
+ internal struct LeaderboardUGCSet_t_LargePack {
public EResult m_eResult; // The result of the operation
public SteamLeaderboard_t m_hSteamLeaderboard; // the leaderboard handle that was
+
+ public static implicit operator LeaderboardUGCSet_t(LeaderboardUGCSet_t_LargePack value) {
+ LeaderboardUGCSet_t result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hSteamLeaderboard = value.m_hSteamLeaderboard;
+ return result;
+ }
+
+ public static implicit operator LeaderboardUGCSet_t_LargePack(LeaderboardUGCSet_t value) {
+ LeaderboardUGCSet_t_LargePack result = default;
+ result.m_eResult = value.m_eResult;
+ result.m_hSteamLeaderboard = value.m_hSteamLeaderboard;
+ return result;
+ }
}
+ #endif
//-----------------------------------------------------------------------------
// Purpose: callback indicating global stats have been received.
// Returned as a result of RequestGlobalStats()
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUserStatsCallbacks + 12)]
- public struct GlobalStatsReceived_t {
+ public struct GlobalStatsReceived_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUserStatsCallbacks + 12;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUserStatsCallbacks + 12;
public ulong m_nGameID; // Game global stats were requested for
public EResult m_eResult; // The result of the request
}
@@ -2600,8 +5690,13 @@ public struct GlobalStatsReceived_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 1)]
- public struct IPCountry_t {
+ public struct IPCountry_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 1;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 1;
}
//-----------------------------------------------------------------------------
@@ -2609,8 +5704,13 @@ public struct IPCountry_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 2)]
- public struct LowBatteryPower_t {
+ public struct LowBatteryPower_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 2;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 2;
public byte m_nMinutesBatteryLeft;
}
@@ -2619,8 +5719,13 @@ public struct LowBatteryPower_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 3)]
- public struct SteamAPICallCompleted_t {
+ public struct SteamAPICallCompleted_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 3;
public SteamAPICall_t m_hAsyncCall;
public int m_iCallback;
public uint m_cubParam;
@@ -2631,8 +5736,13 @@ public struct SteamAPICallCompleted_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 4)]
- public struct SteamShutdown_t {
+ public struct SteamShutdown_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 4;
}
//-----------------------------------------------------------------------------
@@ -2640,8 +5750,13 @@ public struct SteamShutdown_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 5)]
- public struct CheckFileSignature_t {
+ public struct CheckFileSignature_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 5;
public ECheckFileSignature m_eCheckFileSignature;
}
@@ -2651,8 +5766,13 @@ public struct CheckFileSignature_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 14)]
- public struct GamepadTextInputDismissed_t {
+ public struct GamepadTextInputDismissed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 14;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 14;
[MarshalAs(UnmanagedType.I1)]
public bool m_bSubmitted; // true if user entered & accepted text (Call ISteamUtils::GetEnteredGamepadTextInput() for text), false if canceled input
public uint m_unSubmittedText;
@@ -2662,8 +5782,13 @@ public struct GamepadTextInputDismissed_t {
// k_iSteamUtilsCallbacks + 15 through 35 are taken
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 36)]
- public struct AppResumingFromSuspend_t {
+ public struct AppResumingFromSuspend_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 36;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 36;
}
// k_iSteamUtilsCallbacks + 37 is taken
@@ -2672,8 +5797,13 @@ public struct AppResumingFromSuspend_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value, Size = 1)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 38)]
- public struct FloatingGamepadTextInputDismissed_t {
+ public struct FloatingGamepadTextInputDismissed_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 38;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 38;
}
//-----------------------------------------------------------------------------
@@ -2681,19 +5811,29 @@ public struct FloatingGamepadTextInputDismissed_t {
//-----------------------------------------------------------------------------
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamUtilsCallbacks + 39)]
- public struct FilterTextDictionaryChanged_t {
+ public struct FilterTextDictionaryChanged_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamUtilsCallbacks + 39;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamUtilsCallbacks + 39;
public int m_eLanguage; // One of ELanguage, or k_LegallyRequiredFiltering
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamVideoCallbacks + 11)]
- public struct GetVideoURLResult_t {
+ public struct GetVideoURLResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamVideoCallbacks + 11;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamVideoCallbacks + 11;
public EResult m_eResult;
public AppId_t m_unVideoAppID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
- private byte[] m_rgchURL_;
+ internal byte[] m_rgchURL_;
public string m_rgchURL
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchURL_); }
@@ -2703,24 +5843,39 @@ public string m_rgchURL
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamVideoCallbacks + 24)]
- public struct GetOPFSettingsResult_t {
+ public struct GetOPFSettingsResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamVideoCallbacks + 24;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamVideoCallbacks + 24;
public EResult m_eResult;
public AppId_t m_unVideoAppID;
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamVideoCallbacks + 4)]
- public struct BroadcastUploadStart_t {
+ public struct BroadcastUploadStart_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamVideoCallbacks + 4;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamVideoCallbacks + 4;
[MarshalAs(UnmanagedType.I1)]
public bool m_bIsRTMP;
}
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamVideoCallbacks + 5)]
- public struct BroadcastUploadStop_t {
+ public struct BroadcastUploadStop_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamVideoCallbacks + 5;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamVideoCallbacks + 5;
public EBroadcastUploadResult m_eResult;
}
@@ -2731,8 +5886,13 @@ public struct BroadcastUploadStop_t {
/// See also ISteamNetworkingSockets::GetFakeIP
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
[CallbackIdentity(Constants.k_iSteamNetworkingSocketsCallbacks + 3)]
- public struct SteamNetworkingFakeIPResult_t {
+ public struct SteamNetworkingFakeIPResult_t
+ #if STEAMWORKS_ANYCPU
+ : ISteamCallbackIdentity
+ #endif
+ {
public const int k_iCallback = Constants.k_iSteamNetworkingSocketsCallbacks + 3;
+ public static int CallbackIdentity { get; } = Constants.k_iSteamNetworkingSocketsCallbacks + 3;
/// Status/result of the allocation request. Possible failure values are:
/// - k_EResultBusy - you called GetFakeIP but the request has not completed.
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamConstants.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamConstants.cs
index 4a47968b..f62eec3e 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamConstants.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamConstants.cs
@@ -178,6 +178,23 @@ public static class Constants {
public const int k_nMaxReturnPorts = 8;
/// Max length of diagnostic error message
public const int k_cchMaxSteamNetworkingErrMsg = 1024;
+ /// See if two identities are identical
+ /// Print to a human-readable string. This is suitable for debug messages
+ /// or any other time you need to encode the identity as a string. It has a
+ /// URL-like format (type:). Your buffer should be at least
+ /// k_cchMaxString bytes big to avoid truncation.
+ ///
+ /// See also SteamNetworkingIPAddrRender
+ /// Parse back a string that was generated using ToString. If we don't understand the
+ /// string, but it looks "reasonable" (it matches the pattern type: and doesn't
+ /// have any funky characters, etc), then we will return true, and the type is set to
+ /// k_ESteamNetworkingIdentityType_UnknownType. false will only be returned if the string
+ /// looks invalid.
+ // Max sizes
+ public const int k_cchMaxString = 128; // Max length of the buffer needed to hold any identity, formatted in string format by ToString
+ public const int k_cchMaxGenericString = 32; // Max length of the string for generic string identities. Including terminating '\0'
+ public const int k_cchMaxXboxPairwiseID = 33; // Including terminating '\0'
+ public const int k_cbMaxGenericBytes = 32;
/// Max length, in bytes (including null terminator) of the reason string
/// when a connection is closed.
public const int k_cchSteamNetworkingMaxConnectionCloseReason = 128;
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamStructs.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamStructs.cs
index c3b53d64..315cfadf 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/SteamStructs.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/SteamStructs.cs
@@ -31,7 +31,10 @@ public struct InputAnalogActionData_t {
public EInputSourceMode eMode;
// The current state of this action; will be delta updates for mouse actions
- public float x, y;
+ public float x;
+
+ // The current state of this action; will be delta updates for mouse actions
+ public float y;
// Whether or not this action is currently available to be bound in the active action set
public byte bActive;
@@ -96,6 +99,28 @@ public struct SteamPartyBeaconLocation_t {
public ulong m_ulLocationID;
}
+ #if STEAMWORKS_ANYCPU
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ internal struct SteamPartyBeaconLocation_t_LargePack {
+ public ESteamPartyBeaconLocationType m_eType;
+ public ulong m_ulLocationID;
+
+ public static implicit operator SteamPartyBeaconLocation_t(SteamPartyBeaconLocation_t_LargePack value) {
+ SteamPartyBeaconLocation_t result = default;
+ result.m_eType = value.m_eType;
+ result.m_ulLocationID = value.m_ulLocationID;
+ return result;
+ }
+
+ public static implicit operator SteamPartyBeaconLocation_t_LargePack(SteamPartyBeaconLocation_t value) {
+ SteamPartyBeaconLocation_t_LargePack result = default;
+ result.m_eType = value.m_eType;
+ result.m_ulLocationID = value.m_ulLocationID;
+ return result;
+ }
+ }
+
+ #endif
// connection state to a specified user, returned by GetP2PSessionState()
// this is under-the-hood info about what's going on with a SendP2PPacket(), shouldn't be needed except for debuggin
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
@@ -154,14 +179,14 @@ public struct SteamUGCDetails_t {
public AppId_t m_nCreatorAppID; // ID of the app that created this file.
public AppId_t m_nConsumerAppID; // ID of the app that will consume this file.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentTitleMax)]
- private byte[] m_rgchTitle_;
+ internal byte[] m_rgchTitle_;
public string m_rgchTitle // title of document
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTitle_); }
set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTitle_, Constants.k_cchPublishedDocumentTitleMax); }
}
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentDescriptionMax)]
- private byte[] m_rgchDescription_;
+ internal byte[] m_rgchDescription_;
public string m_rgchDescription // description of document
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchDescription_); }
@@ -179,7 +204,7 @@ public string m_rgchDescription // description of document
[MarshalAs(UnmanagedType.I1)]
public bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchTagListMax)]
- private byte[] m_rgchTags_;
+ internal byte[] m_rgchTags_;
public string m_rgchTags // comma separated list of all tags associated with this file
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTags_); }
@@ -189,7 +214,7 @@ public string m_rgchTags // comma separated list of all tags associated w
public UGCHandle_t m_hFile; // The handle of the primary file
public UGCHandle_t m_hPreviewFile; // The handle of the preview file
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
- private byte[] m_pchFileName_;
+ internal byte[] m_pchFileName_;
public string m_pchFileName // The cloud filename of the primary file
{
get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
@@ -198,7 +223,7 @@ public string m_pchFileName // The cloud filename of the primary file
public int m_nFileSize; // Size of the primary file (for legacy items which only support one file). This may not be accurate for non-legacy items which can be greater than 4gb in size.
public int m_nPreviewFileSize; // Size of the preview file
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedFileURLMax)]
- private byte[] m_rgchURL_;
+ internal byte[] m_rgchURL_;
public string m_rgchURL // URL (for a video or a website)
{
get { return InteropHelp.ByteArrayToStringUTF8(m_rgchURL_); }
@@ -213,6 +238,140 @@ public string m_pchFileName // The cloud filename of the primary file
public ulong m_ulTotalFilesSize; // Total size of all files (non-legacy), excluding the preview file
}
+ #if STEAMWORKS_ANYCPU
+ // Details for a single published file/UGC
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ internal struct SteamUGCDetails_t_LargePack {
+ public PublishedFileId_t m_nPublishedFileId;
+ public EResult m_eResult; // The result of the operation.
+ public EWorkshopFileType m_eFileType; // Type of the file
+ public AppId_t m_nCreatorAppID; // ID of the app that created this file.
+ public AppId_t m_nConsumerAppID; // ID of the app that will consume this file.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentTitleMax)]
+ internal byte[] m_rgchTitle_;
+ public string m_rgchTitle // title of document
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTitle_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTitle_, Constants.k_cchPublishedDocumentTitleMax); }
+ }
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedDocumentDescriptionMax)]
+ internal byte[] m_rgchDescription_;
+ public string m_rgchDescription // description of document
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchDescription_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchDescription_, Constants.k_cchPublishedDocumentDescriptionMax); }
+ }
+ public ulong m_ulSteamIDOwner; // Steam ID of the user who created this content.
+ public uint m_rtimeCreated; // time when the published file was created
+ public uint m_rtimeUpdated; // time when the published file was last updated
+ public uint m_rtimeAddedToUserList; // time when the user added the published file to their list (not always applicable)
+ public ERemoteStoragePublishedFileVisibility m_eVisibility; // visibility
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bBanned; // whether the file was banned
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bAcceptedForUse; // developer has specifically flagged this item as accepted in the Workshop
+ [MarshalAs(UnmanagedType.I1)]
+ public bool m_bTagsTruncated; // whether the list of tags was too long to be returned in the provided buffer
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchTagListMax)]
+ internal byte[] m_rgchTags_;
+ public string m_rgchTags // comma separated list of all tags associated with this file
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchTags_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchTags_, Constants.k_cchTagListMax); }
+ }
+ // file/url information
+ public UGCHandle_t m_hFile; // The handle of the primary file
+ public UGCHandle_t m_hPreviewFile; // The handle of the preview file
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchFilenameMax)]
+ internal byte[] m_pchFileName_;
+ public string m_pchFileName // The cloud filename of the primary file
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_pchFileName_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_pchFileName_, Constants.k_cchFilenameMax); }
+ }
+ public int m_nFileSize; // Size of the primary file (for legacy items which only support one file). This may not be accurate for non-legacy items which can be greater than 4gb in size.
+ public int m_nPreviewFileSize; // Size of the preview file
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchPublishedFileURLMax)]
+ internal byte[] m_rgchURL_;
+ public string m_rgchURL // URL (for a video or a website)
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_rgchURL_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_rgchURL_, Constants.k_cchPublishedFileURLMax); }
+ }
+ // voting information
+ public uint m_unVotesUp; // number of votes up
+ public uint m_unVotesDown; // number of votes down
+ public float m_flScore; // calculated score
+ // collection details
+ public uint m_unNumChildren;
+ public ulong m_ulTotalFilesSize; // Total size of all files (non-legacy), excluding the preview file
+
+ public static implicit operator SteamUGCDetails_t(SteamUGCDetails_t_LargePack value) {
+ SteamUGCDetails_t result = default;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eResult = value.m_eResult;
+ result.m_eFileType = value.m_eFileType;
+ result.m_nCreatorAppID = value.m_nCreatorAppID;
+ result.m_nConsumerAppID = value.m_nConsumerAppID;
+ result.m_rgchTitle_ = value.m_rgchTitle_;
+ result.m_rgchDescription_ = value.m_rgchDescription_;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ result.m_rtimeCreated = value.m_rtimeCreated;
+ result.m_rtimeUpdated = value.m_rtimeUpdated;
+ result.m_rtimeAddedToUserList = value.m_rtimeAddedToUserList;
+ result.m_eVisibility = value.m_eVisibility;
+ result.m_bBanned = value.m_bBanned;
+ result.m_bAcceptedForUse = value.m_bAcceptedForUse;
+ result.m_bTagsTruncated = value.m_bTagsTruncated;
+ result.m_rgchTags_ = value.m_rgchTags_;
+ result.m_hFile = value.m_hFile;
+ result.m_hPreviewFile = value.m_hPreviewFile;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_nFileSize = value.m_nFileSize;
+ result.m_nPreviewFileSize = value.m_nPreviewFileSize;
+ result.m_rgchURL_ = value.m_rgchURL_;
+ result.m_unVotesUp = value.m_unVotesUp;
+ result.m_unVotesDown = value.m_unVotesDown;
+ result.m_flScore = value.m_flScore;
+ result.m_unNumChildren = value.m_unNumChildren;
+ result.m_ulTotalFilesSize = value.m_ulTotalFilesSize;
+ return result;
+ }
+
+ public static implicit operator SteamUGCDetails_t_LargePack(SteamUGCDetails_t value) {
+ SteamUGCDetails_t_LargePack result = default;
+ result.m_nPublishedFileId = value.m_nPublishedFileId;
+ result.m_eResult = value.m_eResult;
+ result.m_eFileType = value.m_eFileType;
+ result.m_nCreatorAppID = value.m_nCreatorAppID;
+ result.m_nConsumerAppID = value.m_nConsumerAppID;
+ result.m_rgchTitle_ = value.m_rgchTitle_;
+ result.m_rgchDescription_ = value.m_rgchDescription_;
+ result.m_ulSteamIDOwner = value.m_ulSteamIDOwner;
+ result.m_rtimeCreated = value.m_rtimeCreated;
+ result.m_rtimeUpdated = value.m_rtimeUpdated;
+ result.m_rtimeAddedToUserList = value.m_rtimeAddedToUserList;
+ result.m_eVisibility = value.m_eVisibility;
+ result.m_bBanned = value.m_bBanned;
+ result.m_bAcceptedForUse = value.m_bAcceptedForUse;
+ result.m_bTagsTruncated = value.m_bTagsTruncated;
+ result.m_rgchTags_ = value.m_rgchTags_;
+ result.m_hFile = value.m_hFile;
+ result.m_hPreviewFile = value.m_hPreviewFile;
+ result.m_pchFileName_ = value.m_pchFileName_;
+ result.m_nFileSize = value.m_nFileSize;
+ result.m_nPreviewFileSize = value.m_nPreviewFileSize;
+ result.m_rgchURL_ = value.m_rgchURL_;
+ result.m_unVotesUp = value.m_unVotesUp;
+ result.m_unVotesDown = value.m_unVotesDown;
+ result.m_flScore = value.m_flScore;
+ result.m_unNumChildren = value.m_unNumChildren;
+ result.m_ulTotalFilesSize = value.m_ulTotalFilesSize;
+ return result;
+ }
+ }
+
+ #endif
// a single entry in a leaderboard, as returned by GetDownloadedLeaderboardEntry()
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
public struct LeaderboardEntry_t {
@@ -223,6 +382,38 @@ public struct LeaderboardEntry_t {
public UGCHandle_t m_hUGC; // handle for UGC attached to the entry
}
+ #if STEAMWORKS_ANYCPU
+ // a single entry in a leaderboard, as returned by GetDownloadedLeaderboardEntry()
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ internal struct LeaderboardEntry_t_LargePack {
+ public CSteamID m_steamIDUser; // user with the entry - use SteamFriends()->GetFriendPersonaName() & SteamFriends()->GetFriendAvatar() to get more info
+ public int m_nGlobalRank; // [1..N], where N is the number of users with an entry in the leaderboard
+ public int m_nScore; // score as set in the leaderboard
+ public int m_cDetails; // number of int32 details available for this entry
+ public UGCHandle_t m_hUGC; // handle for UGC attached to the entry
+
+ public static implicit operator LeaderboardEntry_t(LeaderboardEntry_t_LargePack value) {
+ LeaderboardEntry_t result = default;
+ result.m_steamIDUser = value.m_steamIDUser;
+ result.m_nGlobalRank = value.m_nGlobalRank;
+ result.m_nScore = value.m_nScore;
+ result.m_cDetails = value.m_cDetails;
+ result.m_hUGC = value.m_hUGC;
+ return result;
+ }
+
+ public static implicit operator LeaderboardEntry_t_LargePack(LeaderboardEntry_t value) {
+ LeaderboardEntry_t_LargePack result = default;
+ result.m_steamIDUser = value.m_steamIDUser;
+ result.m_nGlobalRank = value.m_nGlobalRank;
+ result.m_nScore = value.m_nScore;
+ result.m_cDetails = value.m_cDetails;
+ result.m_hUGC = value.m_hUGC;
+ return result;
+ }
+ }
+
+ #endif
/// Store key/value pair used in matchmaking queries.
///
/// Actually, the name Key/Value is a bit misleading. The "key" is better
@@ -252,8 +443,18 @@ public struct CallbackMsg_t {
public int m_cubParam; // Size of the data pointed to by m_pubParam
}
- /// Describe the state of a connection.
+ /// RFC4038, section 4.2
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
+ public struct IPv4MappedAddress {
+ public ulong m_8zeros;
+ public ushort m_0000;
+ public ushort m_ffff;
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
+ public byte[] m_ip; // NOTE: As bytes, i.e. network byte order
+ }
+
+ /// Describe the state of a connection.
+ [StructLayout(LayoutKind.Sequential)]
public struct SteamNetConnectionInfo_t {
/// Who is on the other end? Depending on the connection type and phase of the connection, we might not know
@@ -289,7 +490,75 @@ public struct SteamNetConnectionInfo_t {
/// diagnostic purposes only, not to display to users. It might
/// have some details specific to the issue.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchSteamNetworkingMaxConnectionCloseReason)]
- private byte[] m_szEndDebug_;
+ internal byte[] m_szEndDebug_;
+ public string m_szEndDebug
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_szEndDebug_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_szEndDebug_, Constants.k_cchSteamNetworkingMaxConnectionCloseReason); }
+ }
+
+ /// Debug description. This includes the internal connection ID,
+ /// connection type (and peer information), and any name
+ /// given to the connection by the app. This string is used in various
+ /// internal logging messages.
+ ///
+ /// Note that the connection ID *usually* matches the HSteamNetConnection
+ /// handle, but in certain cases with symmetric connections it might not.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchSteamNetworkingMaxConnectionDescription)]
+ internal byte[] m_szConnectionDescription_;
+ public string m_szConnectionDescription
+ {
+ get { return InteropHelp.ByteArrayToStringUTF8(m_szConnectionDescription_); }
+ set { InteropHelp.StringToByteArrayUTF8(value, m_szConnectionDescription_, Constants.k_cchSteamNetworkingMaxConnectionDescription); }
+ }
+
+ /// Misc flags. Bitmask of k_nSteamNetworkConnectionInfoFlags_Xxxx
+ public int m_nFlags;
+
+ /// Internal stuff, room to change API easily
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = 63)]
+ public uint[] reserved;
+ }
+
+ #if STEAMWORKS_ANYCPU
+ /// Describe the state of a connection.
+ [StructLayout(LayoutKind.Sequential, Pack = 8)]
+ internal struct SteamNetConnectionInfo_t_LargePack {
+
+ /// Who is on the other end? Depending on the connection type and phase of the connection, we might not know
+ public SteamNetworkingIdentity m_identityRemote;
+
+ /// Arbitrary user data set by the local application code
+ public long m_nUserData;
+
+ /// Handle to listen socket this was connected on, or k_HSteamListenSocket_Invalid if we initiated the connection
+ public HSteamListenSocket m_hListenSocket;
+
+ /// Remote address. Might be all 0's if we don't know it, or if this is N/A.
+ /// (E.g. Basically everything except direct UDP connection.)
+ public SteamNetworkingIPAddr m_addrRemote;
+ public ushort m__pad1;
+
+ /// What data center is the remote host in? (0 if we don't know.)
+ public SteamNetworkingPOPID m_idPOPRemote;
+
+ /// What relay are we using to communicate with the remote host?
+ /// (0 if not applicable.)
+ public SteamNetworkingPOPID m_idPOPRelay;
+
+ /// High level state of the connection
+ public ESteamNetworkingConnectionState m_eState;
+
+ /// Basic cause of the connection termination or problem.
+ /// See ESteamNetConnectionEnd for the values used
+ public int m_eEndReason;
+
+ /// Human-readable, but non-localized explanation for connection
+ /// termination or problem. This is intended for debugging /
+ /// diagnostic purposes only, not to display to users. It might
+ /// have some details specific to the issue.
+ [MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchSteamNetworkingMaxConnectionCloseReason)]
+ internal byte[] m_szEndDebug_;
public string m_szEndDebug
{
get { return InteropHelp.ByteArrayToStringUTF8(m_szEndDebug_); }
@@ -304,7 +573,7 @@ public string m_szEndDebug
/// Note that the connection ID *usually* matches the HSteamNetConnection
/// handle, but in certain cases with symmetric connections it might not.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Constants.k_cchSteamNetworkingMaxConnectionDescription)]
- private byte[] m_szConnectionDescription_;
+ internal byte[] m_szConnectionDescription_;
public string m_szConnectionDescription
{
get { return InteropHelp.ByteArrayToStringUTF8(m_szConnectionDescription_); }
@@ -317,8 +586,45 @@ public string m_szConnectionDescription
/// Internal stuff, room to change API easily
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 63)]
public uint[] reserved;
+
+ public static implicit operator SteamNetConnectionInfo_t(SteamNetConnectionInfo_t_LargePack value) {
+ SteamNetConnectionInfo_t result = default;
+ result.m_identityRemote = value.m_identityRemote;
+ result.m_nUserData = value.m_nUserData;
+ result.m_hListenSocket = value.m_hListenSocket;
+ result.m_addrRemote = value.m_addrRemote;
+ result.m__pad1 = value.m__pad1;
+ result.m_idPOPRemote = value.m_idPOPRemote;
+ result.m_idPOPRelay = value.m_idPOPRelay;
+ result.m_eState = value.m_eState;
+ result.m_eEndReason = value.m_eEndReason;
+ result.m_szEndDebug_ = value.m_szEndDebug_;
+ result.m_szConnectionDescription_ = value.m_szConnectionDescription_;
+ result.m_nFlags = value.m_nFlags;
+ result.reserved = value.reserved;
+ return result;
+ }
+
+ public static implicit operator SteamNetConnectionInfo_t_LargePack(SteamNetConnectionInfo_t value) {
+ SteamNetConnectionInfo_t_LargePack result = default;
+ result.m_identityRemote = value.m_identityRemote;
+ result.m_nUserData = value.m_nUserData;
+ result.m_hListenSocket = value.m_hListenSocket;
+ result.m_addrRemote = value.m_addrRemote;
+ result.m__pad1 = value.m__pad1;
+ result.m_idPOPRemote = value.m_idPOPRemote;
+ result.m_idPOPRelay = value.m_idPOPRelay;
+ result.m_eState = value.m_eState;
+ result.m_eEndReason = value.m_eEndReason;
+ result.m_szEndDebug_ = value.m_szEndDebug_;
+ result.m_szConnectionDescription_ = value.m_szConnectionDescription_;
+ result.m_nFlags = value.m_nFlags;
+ result.reserved = value.reserved;
+ return result;
+ }
}
+ #endif
/// Quick connection state, pared down to something you could call
/// more frequently without it being too big of a perf hit.
[StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
@@ -443,7 +749,7 @@ public struct SteamNetConnectionRealTimeLaneStatus_t {
/// 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().
- [StructLayout(LayoutKind.Sequential, Pack = Packsize.value)]
+ [StructLayout(LayoutKind.Sequential)]
public struct SteamNetworkPingLocation_t {
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
public byte[] m_data;
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingmessages.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingmessages.cs
index 296f252e..cf009f49 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingmessages.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingmessages.cs
@@ -134,7 +134,21 @@ public static bool CloseChannelWithUser(ref SteamNetworkingIdentity identityRemo
///
public static ESteamNetworkingConnectionState GetSessionConnectionInfo(ref SteamNetworkingIdentity identityRemote, out SteamNetConnectionInfo_t pConnectionInfo, out SteamNetConnectionRealTimeStatus_t pQuickStatus) {
InteropHelp.TestIfAvailableGameServer();
+ #if STEAMWORKS_ANYCPU
+ ESteamNetworkingConnectionState ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo, out pQuickStatus);
+ } else {
+ SteamNetConnectionInfo_t_LargePack pConnectionInfo_lp;
+ ret = NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo_lp, out pQuickStatus);
+ pConnectionInfo = pConnectionInfo_lp;
+ }
+ #else
return NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo, out pQuickStatus);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
}
}
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingsockets.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingsockets.cs
index 7e19cc46..e08c0cfc 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingsockets.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameservernetworkingsockets.cs
@@ -397,7 +397,21 @@ public static int ReceiveMessagesOnConnection(HSteamNetConnection hConn, IntPtr[
///
public static bool GetConnectionInfo(HSteamNetConnection hConn, out SteamNetConnectionInfo_t pInfo) {
InteropHelp.TestIfAvailableGameServer();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo);
+ } else {
+ SteamNetConnectionInfo_t_LargePack pInfo_lp;
+ ret = NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo_lp);
+ pInfo = pInfo_lp;
+ }
+ #else
return NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamGameServerAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
///
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameserverugc.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameserverugc.cs
index 15804511..7974cb48 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameserverugc.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamgameserverugc.cs
@@ -63,7 +63,21 @@ public static SteamAPICall_t SendQueryUGCRequest(UGCQueryHandle_t handle) {
///
public static bool GetQueryUGCResult(UGCQueryHandle_t handle, uint index, out SteamUGCDetails_t pDetails) {
InteropHelp.TestIfAvailableGameServer();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamGameServerAPIContext.GetSteamUGC(), handle, index, out pDetails);
+ } else {
+ SteamUGCDetails_t_LargePack pDetails_lp;
+ ret = NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamGameServerAPIContext.GetSteamUGC(), handle, index, out pDetails_lp);
+ pDetails = pDetails_lp;
+ }
+ #else
return NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamGameServerAPIContext.GetSteamUGC(), handle, index, out pDetails);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
public static uint GetQueryUGCNumTags(UGCQueryHandle_t handle, uint index) {
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteammatchmaking.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteammatchmaking.cs
index c5adde15..b25b71e4 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteammatchmaking.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteammatchmaking.cs
@@ -644,7 +644,18 @@ public static PartyBeaconID_t GetBeaconByIndex(uint unIndex) {
public static bool GetBeaconDetails(PartyBeaconID_t ulBeaconID, out CSteamID pSteamIDBeaconOwner, out SteamPartyBeaconLocation_t pLocation, out string pchMetadata, int cchMetadata) {
InteropHelp.TestIfAvailableClient();
IntPtr pchMetadata2 = Marshal.AllocHGlobal(cchMetadata);
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamParties_GetBeaconDetails(CSteamAPIContext.GetSteamParties(), ulBeaconID, out pSteamIDBeaconOwner, out pLocation, pchMetadata2, cchMetadata);
+ } else {
+ SteamPartyBeaconLocation_t_LargePack pLocation_lp;
+ ret = NativeMethods.ISteamParties_GetBeaconDetails(CSteamAPIContext.GetSteamParties(), ulBeaconID, out pSteamIDBeaconOwner, out pLocation_lp, pchMetadata2, cchMetadata);
+ pLocation = pLocation_lp;
+ }
+ #else
bool ret = NativeMethods.ISteamParties_GetBeaconDetails(CSteamAPIContext.GetSteamParties(), ulBeaconID, out pSteamIDBeaconOwner, out pLocation, pchMetadata2, cchMetadata);
+ #endif
pchMetadata = ret ? InteropHelp.PtrToStringUTF8(pchMetadata2) : null;
Marshal.FreeHGlobal(pchMetadata2);
return ret;
@@ -671,7 +682,24 @@ public static bool GetNumAvailableBeaconLocations(out uint puNumLocations) {
public static bool GetAvailableBeaconLocations(SteamPartyBeaconLocation_t[] pLocationList, uint uMaxNumLocations) {
InteropHelp.TestIfAvailableClient();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamParties_GetAvailableBeaconLocations(CSteamAPIContext.GetSteamParties(), pLocationList, uMaxNumLocations);
+ } else {
+ SteamPartyBeaconLocation_t_LargePack[] pLocationList_lp = new SteamPartyBeaconLocation_t_LargePack[pLocationList.Length];
+ for (int i = 0; i < pLocationList.Length; i++)
+ pLocationList_lp[i] = pLocationList[i];
+ ret = NativeMethods.ISteamParties_GetAvailableBeaconLocations(CSteamAPIContext.GetSteamParties(), pLocationList_lp, uMaxNumLocations);
+ for (int i = 0; i < pLocationList.Length; i++)
+ pLocationList[i] = pLocationList_lp[i];
+ }
+ #else
return NativeMethods.ISteamParties_GetAvailableBeaconLocations(CSteamAPIContext.GetSteamParties(), pLocationList, uMaxNumLocations);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
///
@@ -684,7 +712,21 @@ public static SteamAPICall_t CreateBeacon(uint unOpenSlots, ref SteamPartyBeacon
InteropHelp.TestIfAvailableClient();
using (var pchConnectString2 = new InteropHelp.UTF8StringHandle(pchConnectString))
using (var pchMetadata2 = new InteropHelp.UTF8StringHandle(pchMetadata)) {
- return (SteamAPICall_t)NativeMethods.ISteamParties_CreateBeacon(CSteamAPIContext.GetSteamParties(), unOpenSlots, ref pBeaconLocation, pchConnectString2, pchMetadata2);
+ #if STEAMWORKS_ANYCPU
+ SteamAPICall_t ret;
+ if (!Packsize.IsLargePack) {
+ ret = (SteamAPICall_t)NativeMethods.ISteamParties_CreateBeacon(CSteamAPIContext.GetSteamParties(), unOpenSlots, ref pBeaconLocation, pchConnectString2, pchMetadata2);
+ } else {
+ SteamPartyBeaconLocation_t_LargePack pBeaconLocation_lp = pBeaconLocation;
+ ret = (SteamAPICall_t)NativeMethods.ISteamParties_CreateBeacon(CSteamAPIContext.GetSteamParties(), unOpenSlots, ref pBeaconLocation_lp, pchConnectString2, pchMetadata2);
+ pBeaconLocation = pBeaconLocation_lp;
+ }
+ #else
+ return (SteamAPICall_t)NativeMethods.ISteamParties_CreateBeacon(CSteamAPIContext.GetSteamParties(), unOpenSlots, ref pBeaconLocation, pchConnectString2, pchMetadata2);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
}
@@ -731,7 +773,18 @@ public static bool DestroyBeacon(PartyBeaconID_t ulBeacon) {
public static bool GetBeaconLocationData(SteamPartyBeaconLocation_t BeaconLocation, ESteamPartyBeaconLocationData eData, out string pchDataStringOut, int cchDataStringOut) {
InteropHelp.TestIfAvailableClient();
IntPtr pchDataStringOut2 = Marshal.AllocHGlobal(cchDataStringOut);
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamParties_GetBeaconLocationData(CSteamAPIContext.GetSteamParties(), BeaconLocation, eData, pchDataStringOut2, cchDataStringOut);
+ } else {
+ SteamPartyBeaconLocation_t_LargePack BeaconLocation_lp = BeaconLocation;
+ ret = NativeMethods.ISteamParties_GetBeaconLocationData(CSteamAPIContext.GetSteamParties(), BeaconLocation_lp, eData, pchDataStringOut2, cchDataStringOut);
+ BeaconLocation = BeaconLocation_lp;
+ }
+ #else
bool ret = NativeMethods.ISteamParties_GetBeaconLocationData(CSteamAPIContext.GetSteamParties(), BeaconLocation, eData, pchDataStringOut2, cchDataStringOut);
+ #endif
pchDataStringOut = ret ? InteropHelp.PtrToStringUTF8(pchDataStringOut2) : null;
Marshal.FreeHGlobal(pchDataStringOut2);
return ret;
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingmessages.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingmessages.cs
index 78d78f5b..5d8982a4 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingmessages.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingmessages.cs
@@ -134,7 +134,21 @@ public static bool CloseChannelWithUser(ref SteamNetworkingIdentity identityRemo
///
public static ESteamNetworkingConnectionState GetSessionConnectionInfo(ref SteamNetworkingIdentity identityRemote, out SteamNetConnectionInfo_t pConnectionInfo, out SteamNetConnectionRealTimeStatus_t pQuickStatus) {
InteropHelp.TestIfAvailableClient();
+ #if STEAMWORKS_ANYCPU
+ ESteamNetworkingConnectionState ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo, out pQuickStatus);
+ } else {
+ SteamNetConnectionInfo_t_LargePack pConnectionInfo_lp;
+ ret = NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo_lp, out pQuickStatus);
+ pConnectionInfo = pConnectionInfo_lp;
+ }
+ #else
return NativeMethods.ISteamNetworkingMessages_GetSessionConnectionInfo(CSteamAPIContext.GetSteamNetworkingMessages(), ref identityRemote, out pConnectionInfo, out pQuickStatus);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
}
}
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingsockets.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingsockets.cs
index 6bfb7543..552bd1ad 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingsockets.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamnetworkingsockets.cs
@@ -397,7 +397,21 @@ public static int ReceiveMessagesOnConnection(HSteamNetConnection hConn, IntPtr[
///
public static bool GetConnectionInfo(HSteamNetConnection hConn, out SteamNetConnectionInfo_t pInfo) {
InteropHelp.TestIfAvailableClient();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo);
+ } else {
+ SteamNetConnectionInfo_t_LargePack pInfo_lp;
+ ret = NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo_lp);
+ pInfo = pInfo_lp;
+ }
+ #else
return NativeMethods.ISteamNetworkingSockets_GetConnectionInfo(CSteamAPIContext.GetSteamNetworkingSockets(), hConn, out pInfo);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
///
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamugc.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamugc.cs
index 0efb06c8..a32b01ae 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamugc.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamugc.cs
@@ -63,7 +63,21 @@ public static SteamAPICall_t SendQueryUGCRequest(UGCQueryHandle_t handle) {
///
public static bool GetQueryUGCResult(UGCQueryHandle_t handle, uint index, out SteamUGCDetails_t pDetails) {
InteropHelp.TestIfAvailableClient();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamAPIContext.GetSteamUGC(), handle, index, out pDetails);
+ } else {
+ SteamUGCDetails_t_LargePack pDetails_lp;
+ ret = NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamAPIContext.GetSteamUGC(), handle, index, out pDetails_lp);
+ pDetails = pDetails_lp;
+ }
+ #else
return NativeMethods.ISteamUGC_GetQueryUGCResult(CSteamAPIContext.GetSteamUGC(), handle, index, out pDetails);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
public static uint GetQueryUGCNumTags(UGCQueryHandle_t handle, uint index) {
diff --git a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamuserstats.cs b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamuserstats.cs
index 7091f8c8..1f5c4ce9 100644
--- a/com.rlabrecque.steamworks.net/Runtime/autogen/isteamuserstats.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/autogen/isteamuserstats.cs
@@ -317,7 +317,21 @@ public static SteamAPICall_t DownloadLeaderboardEntriesForUsers(SteamLeaderboard
///
public static bool GetDownloadedLeaderboardEntry(SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, out LeaderboardEntry_t pLeaderboardEntry, int[] pDetails, int cDetailsMax) {
InteropHelp.TestIfAvailableClient();
+ #if STEAMWORKS_ANYCPU
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.ISteamUserStats_GetDownloadedLeaderboardEntry(CSteamAPIContext.GetSteamUserStats(), hSteamLeaderboardEntries, index, out pLeaderboardEntry, pDetails, cDetailsMax);
+ } else {
+ LeaderboardEntry_t_LargePack pLeaderboardEntry_lp;
+ ret = NativeMethods.ISteamUserStats_GetDownloadedLeaderboardEntry(CSteamAPIContext.GetSteamUserStats(), hSteamLeaderboardEntries, index, out pLeaderboardEntry_lp, pDetails, cDetailsMax);
+ pLeaderboardEntry = pLeaderboardEntry_lp;
+ }
+ #else
return NativeMethods.ISteamUserStats_GetDownloadedLeaderboardEntry(CSteamAPIContext.GetSteamUserStats(), hSteamLeaderboardEntries, index, out pLeaderboardEntry, pDetails, cDetailsMax);
+ #endif
+ #if STEAMWORKS_ANYCPU
+ return ret;
+ #endif
}
///
diff --git a/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerActionSetHandle_t.cs b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerActionSetHandle_t.cs
new file mode 100644
index 00000000..42e5275a
--- /dev/null
+++ b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerActionSetHandle_t.cs
@@ -0,0 +1,64 @@
+// This file is provided under The MIT License as part of Steamworks.NET.
+// Copyright (c) 2013-2022 Riley Labrecque
+// Please see the included LICENSE.txt for additional information.
+
+// This file is automatically generated.
+// Changes to this file will be reverted when you update Steamworks.NET
+
+#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
+ #define DISABLESTEAMWORKS
+#endif
+
+#if !DISABLESTEAMWORKS
+
+using System.Runtime.InteropServices;
+using IntPtr = System.IntPtr;
+
+namespace Steamworks {
+ [System.Serializable]
+ public struct ControllerActionSetHandle_t : System.IEquatable, System.IComparable {
+ public ulong m_ControllerActionSetHandle;
+
+ public ControllerActionSetHandle_t(ulong value) {
+ m_ControllerActionSetHandle = value;
+ }
+
+ public override string ToString() {
+ return m_ControllerActionSetHandle.ToString();
+ }
+
+ public override bool Equals(object other) {
+ return other is ControllerActionSetHandle_t && this == (ControllerActionSetHandle_t)other;
+ }
+
+ public override int GetHashCode() {
+ return m_ControllerActionSetHandle.GetHashCode();
+ }
+
+ public static bool operator ==(ControllerActionSetHandle_t x, ControllerActionSetHandle_t y) {
+ return x.m_ControllerActionSetHandle == y.m_ControllerActionSetHandle;
+ }
+
+ public static bool operator !=(ControllerActionSetHandle_t x, ControllerActionSetHandle_t y) {
+ return !(x == y);
+ }
+
+ public static explicit operator ControllerActionSetHandle_t(ulong value) {
+ return new ControllerActionSetHandle_t(value);
+ }
+
+ public static explicit operator ulong(ControllerActionSetHandle_t that) {
+ return that.m_ControllerActionSetHandle;
+ }
+
+ public bool Equals(ControllerActionSetHandle_t other) {
+ return m_ControllerActionSetHandle == other.m_ControllerActionSetHandle;
+ }
+
+ public int CompareTo(ControllerActionSetHandle_t other) {
+ return m_ControllerActionSetHandle.CompareTo(other.m_ControllerActionSetHandle);
+ }
+ }
+}
+
+#endif // !DISABLESTEAMWORKS
diff --git a/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerAnalogActionHandle_t.cs b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerAnalogActionHandle_t.cs
new file mode 100644
index 00000000..cdcf7788
--- /dev/null
+++ b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerAnalogActionHandle_t.cs
@@ -0,0 +1,64 @@
+// This file is provided under The MIT License as part of Steamworks.NET.
+// Copyright (c) 2013-2022 Riley Labrecque
+// Please see the included LICENSE.txt for additional information.
+
+// This file is automatically generated.
+// Changes to this file will be reverted when you update Steamworks.NET
+
+#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
+ #define DISABLESTEAMWORKS
+#endif
+
+#if !DISABLESTEAMWORKS
+
+using System.Runtime.InteropServices;
+using IntPtr = System.IntPtr;
+
+namespace Steamworks {
+ [System.Serializable]
+ public struct ControllerAnalogActionHandle_t : System.IEquatable, System.IComparable {
+ public ulong m_ControllerAnalogActionHandle;
+
+ public ControllerAnalogActionHandle_t(ulong value) {
+ m_ControllerAnalogActionHandle = value;
+ }
+
+ public override string ToString() {
+ return m_ControllerAnalogActionHandle.ToString();
+ }
+
+ public override bool Equals(object other) {
+ return other is ControllerAnalogActionHandle_t && this == (ControllerAnalogActionHandle_t)other;
+ }
+
+ public override int GetHashCode() {
+ return m_ControllerAnalogActionHandle.GetHashCode();
+ }
+
+ public static bool operator ==(ControllerAnalogActionHandle_t x, ControllerAnalogActionHandle_t y) {
+ return x.m_ControllerAnalogActionHandle == y.m_ControllerAnalogActionHandle;
+ }
+
+ public static bool operator !=(ControllerAnalogActionHandle_t x, ControllerAnalogActionHandle_t y) {
+ return !(x == y);
+ }
+
+ public static explicit operator ControllerAnalogActionHandle_t(ulong value) {
+ return new ControllerAnalogActionHandle_t(value);
+ }
+
+ public static explicit operator ulong(ControllerAnalogActionHandle_t that) {
+ return that.m_ControllerAnalogActionHandle;
+ }
+
+ public bool Equals(ControllerAnalogActionHandle_t other) {
+ return m_ControllerAnalogActionHandle == other.m_ControllerAnalogActionHandle;
+ }
+
+ public int CompareTo(ControllerAnalogActionHandle_t other) {
+ return m_ControllerAnalogActionHandle.CompareTo(other.m_ControllerAnalogActionHandle);
+ }
+ }
+}
+
+#endif // !DISABLESTEAMWORKS
diff --git a/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerDigitalActionHandle_t.cs b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerDigitalActionHandle_t.cs
new file mode 100644
index 00000000..e7c44f01
--- /dev/null
+++ b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerDigitalActionHandle_t.cs
@@ -0,0 +1,64 @@
+// This file is provided under The MIT License as part of Steamworks.NET.
+// Copyright (c) 2013-2022 Riley Labrecque
+// Please see the included LICENSE.txt for additional information.
+
+// This file is automatically generated.
+// Changes to this file will be reverted when you update Steamworks.NET
+
+#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
+ #define DISABLESTEAMWORKS
+#endif
+
+#if !DISABLESTEAMWORKS
+
+using System.Runtime.InteropServices;
+using IntPtr = System.IntPtr;
+
+namespace Steamworks {
+ [System.Serializable]
+ public struct ControllerDigitalActionHandle_t : System.IEquatable, System.IComparable {
+ public ulong m_ControllerDigitalActionHandle;
+
+ public ControllerDigitalActionHandle_t(ulong value) {
+ m_ControllerDigitalActionHandle = value;
+ }
+
+ public override string ToString() {
+ return m_ControllerDigitalActionHandle.ToString();
+ }
+
+ public override bool Equals(object other) {
+ return other is ControllerDigitalActionHandle_t && this == (ControllerDigitalActionHandle_t)other;
+ }
+
+ public override int GetHashCode() {
+ return m_ControllerDigitalActionHandle.GetHashCode();
+ }
+
+ public static bool operator ==(ControllerDigitalActionHandle_t x, ControllerDigitalActionHandle_t y) {
+ return x.m_ControllerDigitalActionHandle == y.m_ControllerDigitalActionHandle;
+ }
+
+ public static bool operator !=(ControllerDigitalActionHandle_t x, ControllerDigitalActionHandle_t y) {
+ return !(x == y);
+ }
+
+ public static explicit operator ControllerDigitalActionHandle_t(ulong value) {
+ return new ControllerDigitalActionHandle_t(value);
+ }
+
+ public static explicit operator ulong(ControllerDigitalActionHandle_t that) {
+ return that.m_ControllerDigitalActionHandle;
+ }
+
+ public bool Equals(ControllerDigitalActionHandle_t other) {
+ return m_ControllerDigitalActionHandle == other.m_ControllerDigitalActionHandle;
+ }
+
+ public int CompareTo(ControllerDigitalActionHandle_t other) {
+ return m_ControllerDigitalActionHandle.CompareTo(other.m_ControllerDigitalActionHandle);
+ }
+ }
+}
+
+#endif // !DISABLESTEAMWORKS
diff --git a/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerHandle_t.cs b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerHandle_t.cs
new file mode 100644
index 00000000..7fda5ad7
--- /dev/null
+++ b/com.rlabrecque.steamworks.net/Runtime/types/SteamController/ControllerHandle_t.cs
@@ -0,0 +1,64 @@
+// This file is provided under The MIT License as part of Steamworks.NET.
+// Copyright (c) 2013-2022 Riley Labrecque
+// Please see the included LICENSE.txt for additional information.
+
+// This file is automatically generated.
+// Changes to this file will be reverted when you update Steamworks.NET
+
+#if !(UNITY_STANDALONE_WIN || UNITY_STANDALONE_LINUX || UNITY_STANDALONE_OSX || STEAMWORKS_WIN || STEAMWORKS_LIN_OSX)
+ #define DISABLESTEAMWORKS
+#endif
+
+#if !DISABLESTEAMWORKS
+
+using System.Runtime.InteropServices;
+using IntPtr = System.IntPtr;
+
+namespace Steamworks {
+ [System.Serializable]
+ public struct ControllerHandle_t : System.IEquatable, System.IComparable {
+ public ulong m_ControllerHandle;
+
+ public ControllerHandle_t(ulong value) {
+ m_ControllerHandle = value;
+ }
+
+ public override string ToString() {
+ return m_ControllerHandle.ToString();
+ }
+
+ public override bool Equals(object other) {
+ return other is ControllerHandle_t && this == (ControllerHandle_t)other;
+ }
+
+ public override int GetHashCode() {
+ return m_ControllerHandle.GetHashCode();
+ }
+
+ public static bool operator ==(ControllerHandle_t x, ControllerHandle_t y) {
+ return x.m_ControllerHandle == y.m_ControllerHandle;
+ }
+
+ public static bool operator !=(ControllerHandle_t x, ControllerHandle_t y) {
+ return !(x == y);
+ }
+
+ public static explicit operator ControllerHandle_t(ulong value) {
+ return new ControllerHandle_t(value);
+ }
+
+ public static explicit operator ulong(ControllerHandle_t that) {
+ return that.m_ControllerHandle;
+ }
+
+ public bool Equals(ControllerHandle_t other) {
+ return m_ControllerHandle == other.m_ControllerHandle;
+ }
+
+ public int CompareTo(ControllerHandle_t other) {
+ return m_ControllerHandle.CompareTo(other.m_ControllerHandle);
+ }
+ }
+}
+
+#endif // !DISABLESTEAMWORKS
diff --git a/com.rlabrecque.steamworks.net/Runtime/types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs b/com.rlabrecque.steamworks.net/Runtime/types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
index 0e8c0b67..bee57310 100644
--- a/com.rlabrecque.steamworks.net/Runtime/types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
+++ b/com.rlabrecque.steamworks.net/Runtime/types/SteamNetworkingSockets/ISteamNetworkingConnectionSignaling.cs
@@ -43,7 +43,15 @@ public struct ISteamNetworkingConnectionSignaling
/// You can assume that the same value of hConn will be used
/// every time.
public bool SendSignal(HSteamNetConnection hConn, ref SteamNetConnectionInfo_t info, IntPtr pMsg, int cbMsg) {
- return NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info, pMsg, cbMsg);
+ bool ret;
+ if (!Packsize.IsLargePack) {
+ ret = NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info, pMsg, cbMsg);
+ } else {
+ SteamNetConnectionInfo_t info_lp = info;
+ ret = NativeMethods.SteamAPI_ISteamNetworkingConnectionSignaling_SendSignal(ref this, hConn, ref info_lp, pMsg, cbMsg);
+ info = info_lp;
+ }
+ return ret;
}
/// Called when the connection no longer needs to send signals.