Author SHA1 Message Date
Eric Zhang 79871eac79 Statically link against libstdc++ on Linux (#6) 2026-08-14 06:24:52 -04:00
dependabot[bot] 25108a5296 Bump actions/setup-python from 6 to 7 (#4)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-26 12:47:56 +00:00
Nicholas Hastings 71ceb89241 Update auto versioning 2026-07-13 17:55:53 -04:00
Nicholas Hastings f1c9faba45 Fix build 2026-07-13 17:55:04 -04:00
A1m` a86fc4af91 Fix circular includes and include cleanup (#3)
* Fix circular includes and include cleanup

Fixed a bug where other *.h header files would include extension.h, which itself
was already included in those same headers, creating a circular dependency cycle.
This caused build errors and made compilation unpredictable.

To resolve this:
- Moved implementation-only includes to .cpp files where they are actually needed.
- Added forward declarations where possible to avoid pulling in unnecessary headers.
- Ensured extension.h only contains declarations that require full type definitions.

This improves build stability and compilation time.

* Clean up includes and fix build errors

- Replaced full includes with forward declarations where possible
- Moved implementation-only includes from .h to .cpp files
- Added missing includes for stdint.h and Steam interfaces
- This significantly reduces compilation time and prevents future dependency issues

* Switch to SourceMod SDK smsdk_ext instead of local copy
2026-07-13 21:43:05 +00:00
A1m` 07fc524d27 Fixed incorrect use of ReferenceToIndex, which caused some functions to be unstable during client connection. (#2)
While this function works well with the client indexes we pass in, as its name
suggests, we should essentially be passing player references, not client indexes.
The problem is that SourceMod looks for this player in the entity list, but they
might not be there when connecting, or they might be another client or a bot.

This makes the code unstable and confusing, and it works intermittently.
Steam doesn't care whether the player is in the entity list—it works with the
Steam ID. Using ReferenceToIndex here is fundamentally wrong and causes random
-1 errors, especially during OnClientConnect when the entity may not exist yet.

This commit replaces it with a direct client index lookup, which is correct and
reliable because params[1] is already a client index.
2026-07-13 21:39:04 +00:00
Nicholas Hastings 8fd7a1988c Update extension author and repository URL 2026-07-12 22:40:00 -04:00
Nicholas Hastings 65936e7d9c Fix size_t truncation warning in SetHTTPRequestRawPostBodyFromFile 2026-07-12 22:10:00 -04:00
Nicholas Hastings 645103735e Fix streaming HTTP response header and data callbacks 2026-07-12 21:20:00 -04:00
Nicholas Hastings a779d6d961 Expose SetAdvertiseServerActive 2026-07-12 15:17:29 -04:00
Nicholas Hastings c82feb1a4a Add methodmap for SteamWorksHTTPRequest 2026-07-12 13:59:38 -04:00
Nicholas Hastings ceeaf66b95 Add function docs to inc 2026-07-12 13:31:37 -04:00
Nicholas Hastings 8eaea7217c Update EResult and EHTTPStatusCode 2026-07-12 13:16:28 -04:00
34 changed files with 1273 additions and 1001 deletions
+24 -5
View File
@@ -7,8 +7,27 @@ on:
branches: [ master ] branches: [ master ]
jobs: jobs:
version:
name: Version
runs-on: ubuntu-latest
outputs:
version: ${{ steps.compute.outputs.version }}
steps:
- name: Checkout
uses: actions/checkout@v7
with:
fetch-depth: 0
- name: Compute version
id: compute
run: |
base_version=$(grep -oP 'SMEXT_CONF_VERSION\s+"\K[^"]+' Extension/sdk/smsdk_config.h)
build_number=$(git rev-list --count HEAD)
echo "version=${base_version}.${build_number}" >> "$GITHUB_OUTPUT"
build: build:
name: sm${{ matrix.sm.label }}-${{ matrix.target.os_name }}-${{ matrix.target.arch }} name: sm${{ matrix.sm.label }}-${{ matrix.target.os_name }}-${{ matrix.target.arch }}
needs: version
runs-on: ${{ matrix.target.os }} runs-on: ${{ matrix.target.os }}
container: ${{ matrix.target.container }} container: ${{ matrix.target.container }}
strategy: strategy:
@@ -43,7 +62,7 @@ jobs:
- name: Setup Python (Windows) - name: Setup Python (Windows)
if: matrix.target.os_name == 'windows' if: matrix.target.os_name == 'windows'
uses: actions/setup-python@v6 uses: actions/setup-python@v7
with: with:
python-version: '3.12' python-version: '3.12'
@@ -78,6 +97,7 @@ jobs:
--mms-path ../mmsource \ --mms-path ../mmsource \
--steamworks-path ../SteamworksSDK \ --steamworks-path ../SteamworksSDK \
--target ${{ matrix.target.arch }} \ --target ${{ matrix.target.arch }} \
--version "${{ needs.version.outputs.version }}" \
--enable-optimize --enable-optimize
ambuild ambuild
@@ -91,6 +111,7 @@ jobs:
--mms-path ../mmsource \ --mms-path ../mmsource \
--steamworks-path ../SteamworksSDK \ --steamworks-path ../SteamworksSDK \
--target ${{ matrix.target.arch }} \ --target ${{ matrix.target.arch }} \
--version "${{ needs.version.outputs.version }}" \
--enable-optimize --enable-optimize
ambuild ambuild
@@ -138,7 +159,7 @@ jobs:
release: release:
name: Release name: Release
needs: build needs: [version, build]
if: github.event_name == 'push' && github.ref == 'refs/heads/master' if: github.event_name == 'push' && github.ref == 'refs/heads/master'
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
@@ -157,9 +178,7 @@ jobs:
- name: Assemble packages - name: Assemble packages
id: package id: package
run: | run: |
base_version=$(grep -oP 'SMEXT_CONF_VERSION\s+"\K[^"]+' Extension/sdk/smsdk_config.h) version="${{ needs.version.outputs.version }}"
build_number=$(git rev-list --count HEAD)
version="${base_version}-git${build_number}"
echo "version=${version}" >> "$GITHUB_OUTPUT" echo "version=${version}" >> "$GITHUB_OUTPUT"
# One package per SourceMod version per OS: Windows as .zip, Linux as # One package per SourceMod version per OS: Windows as .zip, Linux as
+1
View File
@@ -217,6 +217,7 @@ class SteamWorksConfig(object):
cxx.linkflags += ['-static-libgcc'] cxx.linkflags += ['-static-libgcc']
elif cxx.family == 'clang': elif cxx.family == 'clang':
cxx.linkflags += ['-lgcc_eh'] cxx.linkflags += ['-lgcc_eh']
cxx.linkflags += ['-static-libstdc++']
elif cxx.target.platform == 'windows': elif cxx.target.platform == 'windows':
cxx.defines += ['WIN32', '_WINDOWS'] cxx.defines += ['WIN32', '_WINDOWS']
+7 -1
View File
@@ -60,8 +60,8 @@ project.sources += [
'swhttp.cpp', 'swhttp.cpp',
'swhttprequest.cpp', 'swhttprequest.cpp',
'swgchooks.cpp', 'swgchooks.cpp',
'sdk/smsdk_ext.cpp',
os.path.join(SteamWorks.sm_root, 'public', 'CDetour', 'detours.cpp'), os.path.join(SteamWorks.sm_root, 'public', 'CDetour', 'detours.cpp'),
os.path.join(SteamWorks.sm_root, 'public', 'smsdk_ext.cpp'),
] ]
binary = SteamWorks.HL2Config(project, builder.cxx, 'SteamWorks.ext') binary = SteamWorks.HL2Config(project, builder.cxx, 'SteamWorks.ext')
@@ -69,6 +69,12 @@ binary = SteamWorks.HL2Config(project, builder.cxx, 'SteamWorks.ext')
# The Steam API headers all come from the SteamWorks SDK; the extension is built # The Steam API headers all come from the SteamWorks SDK; the extension is built
# with META_NO_HL2SDK, so no HL2SDK is required. # with META_NO_HL2SDK, so no HL2SDK is required.
binary.compiler.defines += ['META_NO_HL2SDK', 'SOURCEMOD_BUILD', 'VERSION_SAFE_STEAM_API_INTERFACES'] binary.compiler.defines += ['META_NO_HL2SDK', 'SOURCEMOD_BUILD', 'VERSION_SAFE_STEAM_API_INTERFACES']
# Let CI bake the generated release version into the binary. The value is passed
# as an unquoted token and stringized in smsdk_config.h, avoiding shell-quoting
# differences between MSVC and gcc/clang.
if builder.options.version:
binary.compiler.defines += ['SMEXT_CONF_VERSION_OVERRIDE={0}'.format(builder.options.version)]
binary.compiler.cxxincludes += [os.path.join(SteamWorks.steamworks_root, 'public', 'steam')] binary.compiler.cxxincludes += [os.path.join(SteamWorks.steamworks_root, 'public', 'steam')]
binary.compiler.cxxincludes += [os.path.join(SteamWorks.sm_root, 'public', 'safetyhook', 'include')] binary.compiler.cxxincludes += [os.path.join(SteamWorks.sm_root, 'public', 'safetyhook', 'include')]
+13 -1
View File
@@ -30,7 +30,18 @@
*/ */
#include "extension.h" #include "extension.h"
#include <stdlib.h>
#include "swgamedata.h"
#include "swgameserver.h"
#include "swhttp.h"
#include "swhttprequest.h"
#include "swforwards.h"
#include "gsnatives.h"
#include "swgshooks.h"
#include "swgsdetours.h"
#include "ssnatives.h"
#include "swgchooks.h"
#include "gcnatives.h"
/** /**
* @file extension.cpp * @file extension.cpp
@@ -72,6 +83,7 @@ void SteamWorks::SDK_OnUnload()
delete this->pSWHTTPNatives; delete this->pSWHTTPNatives;
delete this->pSWHTTP; delete this->pSWHTTP;
this->pSWHTTP = NULL; /* Requests freed via frame actions may outlive us; let their dtor detect this. */
delete this->pSWGameServer; delete this->pSWGameServer;
delete this->pSWGameData; delete this->pSWGameData;
} }
+15 -14
View File
@@ -37,21 +37,21 @@
* @brief Sample extension code header. * @brief Sample extension code header.
*/ */
#include "smsdk_ext.h" #include <smsdk_ext.h>
#include "isteamgameserver.h" #include <isteamgameserver.h>
#include "steam_gameserver.h" #include <steamclientpublic.h>
#include "swgameserver.h" class SteamWorksForwards;
#include "swgamedata.h" class SteamWorksGameData;
class SteamWorksGameServer;
#include "swforwards.h" class SteamWorksGSNatives;
#include "gsnatives.h" class SteamWorksGSHooks;
#include "swgshooks.h" class SteamWorksSSNatives;
#include "swgchooks.h" class SteamWorksGSDetours;
#include "ssnatives.h" class SteamWorksHTTP;
#include "gcnatives.h" class SteamWorksHTTPNatives;
#include "swgsdetours.h" class SteamWorksGCHooks;
#include "swhttp.h" class SteamWorksGCNatives;
/** /**
* @brief Sample implementation of the SDK Extension. * @brief Sample implementation of the SDK Extension.
@@ -149,4 +149,5 @@ public:
}; };
extern SteamWorks g_SteamWorks; extern SteamWorks g_SteamWorks;
#endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_ #endif // _INCLUDE_SOURCEMOD_EXTENSION_PROPER_H_
+3
View File
@@ -17,6 +17,9 @@
*/ */
#include "gcnatives.h" #include "gcnatives.h"
#include "extension.h"
#include "swgameserver.h"
#include <isteamgamecoordinator.h>
static ISteamGameCoordinator *GetSteamGCPointer(void) static ISteamGameCoordinator *GetSteamGCPointer(void)
{ {
-10
View File
@@ -17,14 +17,6 @@
*/ */
#pragma once #pragma once
#include "steam_gameserver.h"
#include "isteamgamecoordinator.h"
#include "smsdk_ext.h"
#ifdef _WIN32
#undef SendMessage
#endif
class SteamWorksGCNatives class SteamWorksGCNatives
{ {
@@ -32,5 +24,3 @@ class SteamWorksGCNatives
SteamWorksGCNatives(); SteamWorksGCNatives();
~SteamWorksGCNatives(); ~SteamWorksGCNatives();
}; };
#include "extension.h"
+45 -15
View File
@@ -17,6 +17,8 @@
*/ */
#include "gsnatives.h" #include "gsnatives.h"
#include "extension.h"
#include "swgameserver.h"
static bool IsSteamWorksLoaded(void) static bool IsSteamWorksLoaded(void)
{ {
@@ -190,6 +192,19 @@ static cell_t sm_ClearRules(IPluginContext *pContext, const cell_t *params)
return 1; return 1;
} }
static cell_t sm_SetAdvertiseServerActive(IPluginContext *pContext, const cell_t *params)
{
ISteamGameServer *pServer = GetGSPointer();
if (pServer == NULL)
{
return 0;
}
pServer->SetAdvertiseServerActive(!!params[1]);
return 1;
}
static cell_t sm_ForceHeartbeat(IPluginContext *pContext, const cell_t *params) static cell_t sm_ForceHeartbeat(IPluginContext *pContext, const cell_t *params)
{ {
/* Deprecated no-op: newer Steamworks SDKs removed ISteamGameServer::ForceHeartbeat(); /* Deprecated no-op: newer Steamworks SDKs removed ISteamGameServer::ForceHeartbeat();
@@ -205,12 +220,17 @@ static cell_t sm_UserHasLicenseForApp(IPluginContext *pContext, const cell_t *pa
{ {
return k_EUserHasLicenseResultNoAuth; return k_EUserHasLicenseResultNoAuth;
} }
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
CSteamID checkid = CreateCommonCSteamID(pPlayer, params, 3, 4); CSteamID checkid = CreateCommonCSteamID(pPlayer, params, 3, 4);
@@ -232,12 +252,16 @@ static cell_t sm_UserHasLicenseForAppId(IPluginContext *pContext, const cell_t *
static cell_t sm_GetClientSteamID(IPluginContext *pContext, const cell_t *params) static cell_t sm_GetClientSteamID(IPluginContext *pContext, const cell_t *params)
{ {
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
CSteamID steamId = CreateCommonCSteamID(pPlayer, params, 4, 5); CSteamID steamId = CreateCommonCSteamID(pPlayer, params, 4, 5);
@@ -257,14 +281,19 @@ static cell_t sm_GetUserGroupStatus(IPluginContext *pContext, const cell_t *para
if (pServer == NULL) if (pServer == NULL)
{ {
return false; return 0;
} }
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
CSteamID checkid = CreateCommonCSteamID(pPlayer, params, 3, 4); CSteamID checkid = CreateCommonCSteamID(pPlayer, params, 3, 4);
@@ -295,6 +324,7 @@ static sp_nativeinfo_t gsnatives[] = {
{"SteamWorks_IsConnected", sm_IsConnected}, {"SteamWorks_IsConnected", sm_IsConnected},
{"SteamWorks_SetRule", sm_SetRule}, {"SteamWorks_SetRule", sm_SetRule},
{"SteamWorks_ClearRules", sm_ClearRules}, {"SteamWorks_ClearRules", sm_ClearRules},
{"SteamWorks_SetAdvertiseServerActive", sm_SetAdvertiseServerActive},
{"SteamWorks_ForceHeartbeat", sm_ForceHeartbeat}, {"SteamWorks_ForceHeartbeat", sm_ForceHeartbeat},
{"SteamWorks_HasLicenseForApp", sm_UserHasLicenseForApp}, {"SteamWorks_HasLicenseForApp", sm_UserHasLicenseForApp},
{"SteamWorks_HasLicenseForAppId", sm_UserHasLicenseForAppId}, {"SteamWorks_HasLicenseForAppId", sm_UserHasLicenseForAppId},
-3
View File
@@ -17,7 +17,6 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
class SteamWorksGSNatives class SteamWorksGSNatives
{ {
@@ -25,5 +24,3 @@ class SteamWorksGSNatives
SteamWorksGSNatives(); SteamWorksGSNatives();
~SteamWorksGSNatives(); ~SteamWorksGSNatives();
}; };
#include "extension.h"
+14 -3
View File
@@ -40,9 +40,20 @@
/* Basic information exposed publicly */ /* Basic information exposed publicly */
#define SMEXT_CONF_NAME "SteamWorks Extension" #define SMEXT_CONF_NAME "SteamWorks Extension"
#define SMEXT_CONF_DESCRIPTION "Exposes SteamWorks functions to Developers" #define SMEXT_CONF_DESCRIPTION "Exposes SteamWorks functions to Developers"
#define SMEXT_CONF_VERSION "1.2.3" /* The literal below is the MAJOR.MINOR base and the version used by local builds.
#define SMEXT_CONF_AUTHOR "Kyle Sanderson" CI turns it into a full MAJOR.MINOR.PATCH release version by defining
#define SMEXT_CONF_URL "http://AlliedMods.net" SMEXT_CONF_VERSION_OVERRIDE at build time as an unquoted token (e.g. 1.2.158,
where the patch is the commit count); it is stringized here so no cross-platform
shell quoting is required. Bump the MAJOR/MINOR here by hand. */
#if defined(SMEXT_CONF_VERSION_OVERRIDE)
#define SMEXT_CONF_VERSION_STR_(x) #x
#define SMEXT_CONF_VERSION_STR(x) SMEXT_CONF_VERSION_STR_(x)
#define SMEXT_CONF_VERSION SMEXT_CONF_VERSION_STR(SMEXT_CONF_VERSION_OVERRIDE)
#else
#define SMEXT_CONF_VERSION "1.2"
#endif
#define SMEXT_CONF_AUTHOR "Kyle Sanderson, AlliedModders"
#define SMEXT_CONF_URL "https://github.com/alliedmodders/SM-SteamWorks"
#define SMEXT_CONF_LOGTAG "STEAMWORKS" #define SMEXT_CONF_LOGTAG "STEAMWORKS"
#define SMEXT_CONF_LICENSE "GPLv3" #define SMEXT_CONF_LICENSE "GPLv3"
#define SMEXT_CONF_DATESTRING __DATE__ #define SMEXT_CONF_DATESTRING __DATE__
-485
View File
@@ -1,485 +0,0 @@
/**
* vim: set ts=4 sw=4 tw=99 noet:
* =============================================================================
* SourceMod Base Extension Code
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <stdio.h>
#include <stdlib.h>
#include "smsdk_ext.h"
/**
* @file smsdk_ext.cpp
* @brief Contains wrappers for making Extensions easier to write.
*/
IExtension *myself = NULL; /**< Ourself */
IShareSys *g_pShareSys = NULL; /**< Share system */
IShareSys *sharesys = NULL; /**< Share system */
ISourceMod *g_pSM = NULL; /**< SourceMod helpers */
ISourceMod *smutils = NULL; /**< SourceMod helpers */
#if defined SMEXT_ENABLE_FORWARDSYS
IForwardManager *g_pForwards = NULL; /**< Forward system */
IForwardManager *forwards = NULL; /**< Forward system */
#endif
#if defined SMEXT_ENABLE_HANDLESYS
IHandleSys *g_pHandleSys = NULL; /**< Handle system */
IHandleSys *handlesys = NULL; /**< Handle system */
#endif
#if defined SMEXT_ENABLE_PLAYERHELPERS
IPlayerManager *playerhelpers = NULL; /**< Player helpers */
#endif //SMEXT_ENABLE_PLAYERHELPERS
#if defined SMEXT_ENABLE_DBMANAGER
IDBManager *dbi = NULL; /**< DB Manager */
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_GAMECONF
IGameConfigManager *gameconfs = NULL; /**< Game config manager */
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_MEMUTILS
IMemoryUtils *memutils = NULL;
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_GAMEHELPERS
IGameHelpers *gamehelpers = NULL;
#endif
#if defined SMEXT_ENABLE_TIMERSYS
ITimerSystem *timersys = NULL;
#endif
#if defined SMEXT_ENABLE_ADTFACTORY
IADTFactory *adtfactory = NULL;
#endif
#if defined SMEXT_ENABLE_THREADER
IThreader *threader = NULL;
#endif
#if defined SMEXT_ENABLE_LIBSYS
ILibrarySys *libsys = NULL;
#endif
#if defined SMEXT_ENABLE_PLUGINSYS
SourceMod::IPluginManager *plsys;
#endif
#if defined SMEXT_ENABLE_MENUS
IMenuManager *menus = NULL;
#endif
#if defined SMEXT_ENABLE_ADMINSYS
IAdminSystem *adminsys = NULL;
#endif
#if defined SMEXT_ENABLE_TEXTPARSERS
ITextParsers *textparsers = NULL;
#endif
#if defined SMEXT_ENABLE_USERMSGS
IUserMessages *usermsgs = NULL;
#endif
#if defined SMEXT_ENABLE_TRANSLATOR
ITranslator *translator = NULL;
#endif
#if defined SMEXT_ENABLE_NINVOKE
INativeInterface *ninvoke = NULL;
#endif
#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
IRootConsole *rootconsole = NULL;
#endif
/** Exports the main interface */
PLATFORM_EXTERN_C IExtensionInterface *GetSMExtAPI()
{
return g_pExtensionIface;
}
SDKExtension::SDKExtension()
{
#if defined SMEXT_CONF_METAMOD
m_SourceMMLoaded = false;
m_WeAreUnloaded = false;
m_WeGotPauseChange = false;
#endif
}
bool SDKExtension::OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late)
{
g_pShareSys = sharesys = sys;
myself = me;
#if defined SMEXT_CONF_METAMOD
m_WeAreUnloaded = true;
if (!m_SourceMMLoaded)
{
if (error)
{
snprintf(error, maxlength, "Metamod attach failed");
}
return false;
}
#endif
SM_GET_IFACE(SOURCEMOD, g_pSM);
smutils = g_pSM;
#if defined SMEXT_ENABLE_HANDLESYS
SM_GET_IFACE(HANDLESYSTEM, g_pHandleSys);
handlesys = g_pHandleSys;
#endif
#if defined SMEXT_ENABLE_FORWARDSYS
SM_GET_IFACE(FORWARDMANAGER, g_pForwards);
forwards = g_pForwards;
#endif
#if defined SMEXT_ENABLE_PLAYERHELPERS
SM_GET_IFACE(PLAYERMANAGER, playerhelpers);
#endif
#if defined SMEXT_ENABLE_DBMANAGER
SM_GET_IFACE(DBI, dbi);
#endif
#if defined SMEXT_ENABLE_GAMECONF
SM_GET_IFACE(GAMECONFIG, gameconfs);
#endif
#if defined SMEXT_ENABLE_MEMUTILS
SM_GET_IFACE(MEMORYUTILS, memutils);
#endif
#if defined SMEXT_ENABLE_GAMEHELPERS
SM_GET_IFACE(GAMEHELPERS, gamehelpers);
#endif
#if defined SMEXT_ENABLE_TIMERSYS
SM_GET_IFACE(TIMERSYS, timersys);
#endif
#if defined SMEXT_ENABLE_ADTFACTORY
SM_GET_IFACE(ADTFACTORY, adtfactory);
#endif
#if defined SMEXT_ENABLE_THREADER
SM_GET_IFACE(THREADER, threader);
#endif
#if defined SMEXT_ENABLE_LIBSYS
SM_GET_IFACE(LIBRARYSYS, libsys);
#endif
#if defined SMEXT_ENABLE_PLUGINSYS
SM_GET_IFACE(PLUGINSYSTEM, plsys);
#endif
#if defined SMEXT_ENABLE_MENUS
SM_GET_IFACE(MENUMANAGER, menus);
#endif
#if defined SMEXT_ENABLE_ADMINSYS
SM_GET_IFACE(ADMINSYS, adminsys);
#endif
#if defined SMEXT_ENABLE_TEXTPARSERS
SM_GET_IFACE(TEXTPARSERS, textparsers);
#endif
#if defined SMEXT_ENABLE_USERMSGS
SM_GET_IFACE(USERMSGS, usermsgs);
#endif
#if defined SMEXT_ENABLE_TRANSLATOR
SM_GET_IFACE(TRANSLATOR, translator);
#endif
#if defined SMEXT_ENABLE_NINVOKE
SM_GET_IFACE(NINVOKE, ninvoke);
#endif
#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
SM_GET_IFACE(ROOTCONSOLE, rootconsole);
#endif
if (SDK_OnLoad(error, maxlength, late))
{
#if defined SMEXT_CONF_METAMOD
m_WeAreUnloaded = true;
#endif
return true;
}
return false;
}
bool SDKExtension::IsMetamodExtension()
{
#if defined SMEXT_CONF_METAMOD
return true;
#else
return false;
#endif
}
void SDKExtension::OnExtensionPauseChange(bool state)
{
#if defined SMEXT_CONF_METAMOD
m_WeGotPauseChange = true;
#endif
SDK_OnPauseChange(state);
}
void SDKExtension::OnExtensionsAllLoaded()
{
SDK_OnAllLoaded();
}
void SDKExtension::OnExtensionUnload()
{
#if defined SMEXT_CONF_METAMOD
m_WeAreUnloaded = true;
#endif
SDK_OnUnload();
}
void SDKExtension::OnDependenciesDropped()
{
SDK_OnDependenciesDropped();
}
const char *SDKExtension::GetExtensionAuthor()
{
return SMEXT_CONF_AUTHOR;
}
const char *SDKExtension::GetExtensionDateString()
{
return SMEXT_CONF_DATESTRING;
}
const char *SDKExtension::GetExtensionDescription()
{
return SMEXT_CONF_DESCRIPTION;
}
const char *SDKExtension::GetExtensionVerString()
{
return SMEXT_CONF_VERSION;
}
const char *SDKExtension::GetExtensionName()
{
return SMEXT_CONF_NAME;
}
const char *SDKExtension::GetExtensionTag()
{
return SMEXT_CONF_LOGTAG;
}
const char *SDKExtension::GetExtensionURL()
{
return SMEXT_CONF_URL;
}
bool SDKExtension::SDK_OnLoad(char *error, size_t maxlength, bool late)
{
return true;
}
void SDKExtension::SDK_OnUnload()
{
}
void SDKExtension::SDK_OnPauseChange(bool paused)
{
}
void SDKExtension::SDK_OnAllLoaded()
{
}
void SDKExtension::SDK_OnDependenciesDropped()
{
}
#if defined SMEXT_CONF_METAMOD
PluginId g_PLID = 0; /**< Metamod plugin ID */
ISmmPlugin *g_PLAPI = NULL; /**< Metamod plugin API */
SourceHook::ISourceHook *g_SHPtr = NULL; /**< SourceHook pointer */
ISmmAPI *g_SMAPI = NULL; /**< SourceMM API pointer */
#ifndef META_NO_HL2SDK
IVEngineServer *engine = NULL; /**< IVEngineServer pointer */
IServerGameDLL *gamedll = NULL; /**< IServerGameDLL pointer */
#endif
/** Exposes the extension to Metamod */
SMM_API void *PL_EXPOSURE(const char *name, int *code)
{
#if defined METAMOD_PLAPI_VERSION
if (name && !strcmp(name, METAMOD_PLAPI_NAME))
#else
if (name && !strcmp(name, PLAPI_NAME))
#endif
{
if (code)
{
*code = META_IFACE_OK;
}
return static_cast<void *>(g_pExtensionIface);
}
if (code)
{
*code = META_IFACE_FAILED;
}
return NULL;
}
bool SDKExtension::Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlen, bool late)
{
PLUGIN_SAVEVARS();
#ifndef META_NO_HL2SDK
#if !defined METAMOD_PLAPI_VERSION
GET_V_IFACE_ANY(serverFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
GET_V_IFACE_CURRENT(engineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
#else
GET_V_IFACE_ANY(GetServerFactory, gamedll, IServerGameDLL, INTERFACEVERSION_SERVERGAMEDLL);
GET_V_IFACE_CURRENT(GetEngineFactory, engine, IVEngineServer, INTERFACEVERSION_VENGINESERVER);
#endif
#endif //META_NO_HL2SDK
m_SourceMMLoaded = true;
return SDK_OnMetamodLoad(ismm, error, maxlen, late);
}
bool SDKExtension::Unload(char *error, size_t maxlen)
{
if (!m_WeAreUnloaded)
{
if (error)
{
snprintf(error, maxlen, "This extension must be unloaded by SourceMod.");
}
return false;
}
return SDK_OnMetamodUnload(error, maxlen);
}
bool SDKExtension::Pause(char *error, size_t maxlen)
{
if (!m_WeGotPauseChange)
{
if (error)
{
snprintf(error, maxlen, "This extension must be paused by SourceMod.");
}
return false;
}
m_WeGotPauseChange = false;
return SDK_OnMetamodPauseChange(true, error, maxlen);
}
bool SDKExtension::Unpause(char *error, size_t maxlen)
{
if (!m_WeGotPauseChange)
{
if (error)
{
snprintf(error, maxlen, "This extension must be unpaused by SourceMod.");
}
return false;
}
m_WeGotPauseChange = false;
return SDK_OnMetamodPauseChange(false, error, maxlen);
}
const char *SDKExtension::GetAuthor()
{
return GetExtensionAuthor();
}
const char *SDKExtension::GetDate()
{
return GetExtensionDateString();
}
const char *SDKExtension::GetDescription()
{
return GetExtensionDescription();
}
const char *SDKExtension::GetLicense()
{
return SMEXT_CONF_LICENSE;
}
const char *SDKExtension::GetLogTag()
{
return GetExtensionTag();
}
const char *SDKExtension::GetName()
{
return GetExtensionName();
}
const char *SDKExtension::GetURL()
{
return GetExtensionURL();
}
const char *SDKExtension::GetVersion()
{
return GetExtensionVerString();
}
bool SDKExtension::SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late)
{
return true;
}
bool SDKExtension::SDK_OnMetamodUnload(char *error, size_t maxlength)
{
return true;
}
bool SDKExtension::SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength)
{
return true;
}
#endif
/* Overload a few things to prevent libstdc++ linking */
#if defined __linux__ || defined __APPLE__
extern "C" void __cxa_pure_virtual(void)
{
}
void *operator new(size_t size)
{
return malloc(size);
}
void *operator new[](size_t size)
{
return malloc(size);
}
void operator delete(void *ptr)
{
free(ptr);
}
void operator delete[](void * ptr)
{
free(ptr);
}
#endif
-358
View File
@@ -1,358 +0,0 @@
/**
* vim: set ts=4 sw=4 tw=99 noet:
* =============================================================================
* SourceMod Base Extension Code
* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
* As a special exception, AlliedModders LLC gives you permission to link the
* code of this program (as well as its derivative works) to "Half-Life 2," the
* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
* by the Valve Corporation. You must obey the GNU General Public License in
* all respects for all other code used. Additionally, AlliedModders LLC grants
* this exception to all derivative works. AlliedModders LLC defines further
* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
* or <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#ifndef _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_
#define _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_
/**
* @file smsdk_ext.h
* @brief Contains wrappers for making Extensions easier to write.
*/
#include "smsdk_config.h"
#include <IExtensionSys.h>
#include <IHandleSys.h>
#include <sp_vm_api.h>
#include <sm_platform.h>
#include <ISourceMod.h>
#if defined SMEXT_ENABLE_FORWARDSYS
#include <IForwardSys.h>
#endif //SMEXT_ENABLE_FORWARDSYS
#if defined SMEXT_ENABLE_PLAYERHELPERS
#include <IPlayerHelpers.h>
#endif //SMEXT_ENABLE_PlAYERHELPERS
#if defined SMEXT_ENABLE_DBMANAGER
#include <IDBDriver.h>
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_GAMECONF
#include <IGameConfigs.h>
#endif
#if defined SMEXT_ENABLE_MEMUTILS
#include <IMemoryUtils.h>
#endif
#if defined SMEXT_ENABLE_GAMEHELPERS
#include <IGameHelpers.h>
#endif
#if defined SMEXT_ENABLE_TIMERSYS
#include <ITimerSystem.h>
#endif
#if defined SMEXT_ENABLE_ADTFACTORY
#include <IADTFactory.h>
#endif
#if defined SMEXT_ENABLE_THREADER
#include <IThreader.h>
#endif
#if defined SMEXT_ENABLE_LIBSYS
#include <ILibrarySys.h>
#endif
#if defined SMEXT_ENABLE_PLUGINSYS
#include <IPluginSys.h>
#endif
#if defined SMEXT_ENABLE_MENUS
#include <IMenuManager.h>
#endif
#if defined SMEXT_ENABLE_ADMINSYS
#include <IAdminSystem.h>
#endif
#if defined SMEXT_ENABLE_TEXTPARSERS
#include <ITextParsers.h>
#endif
#if defined SMEXT_ENABLE_USERMSGS
#include <IUserMessages.h>
#endif
#if defined SMEXT_ENABLE_TRANSLATOR
#include <ITranslator.h>
#endif
#if defined SMEXT_ENABLE_NINVOKE
#include <INativeInvoker.h>
#endif
#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
#include <IRootConsoleMenu.h>
#endif
#if defined SMEXT_CONF_METAMOD
#include <ISmmPlugin.h>
#ifndef META_NO_HL2SDK
#include <eiface.h>
#endif // META_NO_HL2SDK
#endif
using namespace SourceMod;
using namespace SourcePawn;
class SDKExtension :
#if defined SMEXT_CONF_METAMOD
public ISmmPlugin,
#endif
public IExtensionInterface
{
public:
/** Constructor */
SDKExtension();
public:
/**
* @brief This is called after the initial loading sequence has been processed.
*
* @param error Error message buffer.
* @param maxlength Size of error message buffer.
* @param late Whether or not the module was loaded after map load.
* @return True to succeed loading, false to fail.
*/
virtual bool SDK_OnLoad(char *error, size_t maxlength, bool late);
/**
* @brief This is called once the extension unloading process begins.
*/
virtual void SDK_OnUnload();
/**
* @brief This is called once all known extensions have been loaded.
*/
virtual void SDK_OnAllLoaded();
/**
* @brief Called when the pause state is changed.
*/
virtual void SDK_OnPauseChange(bool paused);
/**
* @brief Called after SDK_OnUnload, once all dependencies have been
* removed, and the extension is about to be removed from memory.
*/
virtual void SDK_OnDependenciesDropped();
#if defined SMEXT_CONF_METAMOD
/**
* @brief Called when Metamod is attached, before the extension version is called.
*
* @param error Error buffer.
* @param maxlength Maximum size of error buffer.
* @param late Whether or not Metamod considers this a late load.
* @return True to succeed, false to fail.
*/
virtual bool SDK_OnMetamodLoad(ISmmAPI *ismm, char *error, size_t maxlength, bool late);
/**
* @brief Called when Metamod is detaching, after the extension version is called.
* NOTE: By default this is blocked unless sent from SourceMod.
*
* @param error Error buffer.
* @param maxlength Maximum size of error buffer.
* @return True to succeed, false to fail.
*/
virtual bool SDK_OnMetamodUnload(char *error, size_t maxlength);
/**
* @brief Called when Metamod's pause state is changing.
* NOTE: By default this is blocked unless sent from SourceMod.
*
* @param paused Pause state being set.
* @param error Error buffer.
* @param maxlength Maximum size of error buffer.
* @return True to succeed, false to fail.
*/
virtual bool SDK_OnMetamodPauseChange(bool paused, char *error, size_t maxlength);
#endif
public: //IExtensionInterface
virtual bool OnExtensionLoad(IExtension *me, IShareSys *sys, char *error, size_t maxlength, bool late);
virtual void OnExtensionUnload();
virtual void OnExtensionsAllLoaded();
/** Returns whether or not this is a Metamod-based extension */
virtual bool IsMetamodExtension();
/**
* @brief Called when the pause state changes.
*
* @param state True if being paused, false if being unpaused.
*/
virtual void OnExtensionPauseChange(bool state);
/** Returns name */
virtual const char *GetExtensionName();
/** Returns URL */
virtual const char *GetExtensionURL();
/** Returns log tag */
virtual const char *GetExtensionTag();
/** Returns author */
virtual const char *GetExtensionAuthor();
/** Returns version string */
virtual const char *GetExtensionVerString();
/** Returns description string */
virtual const char *GetExtensionDescription();
/** Returns date string */
virtual const char *GetExtensionDateString();
/** Called after OnExtensionUnload, once dependencies have been dropped. */
virtual void OnDependenciesDropped();
#if defined SMEXT_CONF_METAMOD
public: //ISmmPlugin
/** Called when the extension is attached to Metamod. */
virtual bool Load(PluginId id, ISmmAPI *ismm, char *error, size_t maxlength, bool late);
/** Returns the author to MM */
virtual const char *GetAuthor();
/** Returns the name to MM */
virtual const char *GetName();
/** Returns the description to MM */
virtual const char *GetDescription();
/** Returns the URL to MM */
virtual const char *GetURL();
/** Returns the license to MM */
virtual const char *GetLicense();
/** Returns the version string to MM */
virtual const char *GetVersion();
/** Returns the date string to MM */
virtual const char *GetDate();
/** Returns the logtag to MM */
virtual const char *GetLogTag();
/** Called on unload */
virtual bool Unload(char *error, size_t maxlength);
/** Called on pause */
virtual bool Pause(char *error, size_t maxlength);
/** Called on unpause */
virtual bool Unpause(char *error, size_t maxlength);
private:
bool m_SourceMMLoaded;
bool m_WeAreUnloaded;
bool m_WeGotPauseChange;
#endif
};
extern SDKExtension *g_pExtensionIface;
extern IExtension *myself;
extern IShareSys *g_pShareSys;
extern IShareSys *sharesys; /* Note: Newer name */
extern ISourceMod *g_pSM;
extern ISourceMod *smutils; /* Note: Newer name */
/* Optional interfaces are below */
#if defined SMEXT_ENABLE_FORWARDSYS
extern IForwardManager *g_pForwards;
extern IForwardManager *forwards; /* Note: Newer name */
#endif //SMEXT_ENABLE_FORWARDSYS
#if defined SMEXT_ENABLE_HANDLESYS
extern IHandleSys *g_pHandleSys;
extern IHandleSys *handlesys; /* Note: Newer name */
#endif //SMEXT_ENABLE_HANDLESYS
#if defined SMEXT_ENABLE_PLAYERHELPERS
extern IPlayerManager *playerhelpers;
#endif //SMEXT_ENABLE_PLAYERHELPERS
#if defined SMEXT_ENABLE_DBMANAGER
extern IDBManager *dbi;
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_GAMECONF
extern IGameConfigManager *gameconfs;
#endif //SMEXT_ENABLE_DBMANAGER
#if defined SMEXT_ENABLE_MEMUTILS
extern IMemoryUtils *memutils;
#endif
#if defined SMEXT_ENABLE_GAMEHELPERS
extern IGameHelpers *gamehelpers;
#endif
#if defined SMEXT_ENABLE_TIMERSYS
extern ITimerSystem *timersys;
#endif
#if defined SMEXT_ENABLE_ADTFACTORY
extern IADTFactory *adtfactory;
#endif
#if defined SMEXT_ENABLE_THREADER
extern IThreader *threader;
#endif
#if defined SMEXT_ENABLE_LIBSYS
extern ILibrarySys *libsys;
#endif
#if defined SMEXT_ENABLE_PLUGINSYS
extern SourceMod::IPluginManager *plsys;
#endif
#if defined SMEXT_ENABLE_MENUS
extern IMenuManager *menus;
#endif
#if defined SMEXT_ENABLE_ADMINSYS
extern IAdminSystem *adminsys;
#endif
#if defined SMEXT_ENABLE_USERMSGS
extern IUserMessages *usermsgs;
#endif
#if defined SMEXT_ENABLE_TRANSLATOR
extern ITranslator *translator;
#endif
#if defined SMEXT_ENABLE_NINVOKE
extern INativeInterface *ninvoke;
#endif
#if defined SMEXT_ENABLE_ROOTCONSOLEMENU
extern IRootConsole *rootconsole;
#endif
#if defined SMEXT_CONF_METAMOD
PLUGIN_GLOBALVARS();
#ifndef META_NO_HL2SDK
extern IVEngineServer *engine;
extern IServerGameDLL *gamedll;
#endif //META_NO_HL2SDK
#endif
/** Creates a SourceMod interface macro pair */
#define SM_MKIFACE(name) SMINTERFACE_##name##_NAME, SMINTERFACE_##name##_VERSION
/** Automates retrieving SourceMod interfaces */
#define SM_GET_IFACE(prefix, addr) \
if (!g_pShareSys->RequestInterface(SM_MKIFACE(prefix), myself, (SMInterface **)&addr)) \
{ \
if (error != NULL && maxlength) \
{ \
size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \
if (len >= maxlength) \
{ \
error[maxlength - 1] = '\0'; \
} \
} \
return false; \
}
/** Automates retrieving SourceMod interfaces when needed outside of SDK_OnLoad() */
#define SM_GET_LATE_IFACE(prefix, addr) \
g_pShareSys->RequestInterface(SM_MKIFACE(prefix), myself, (SMInterface **)&addr)
/** Validates a SourceMod interface pointer */
#define SM_CHECK_IFACE(prefix, addr) \
if (!addr) \
{ \
if (error != NULL && maxlength) \
{ \
size_t len = snprintf(error, maxlength, "Could not find interface: %s", SMINTERFACE_##prefix##_NAME); \
if (len >= maxlength) \
{ \
error[maxlength - 1] = '\0'; \
} \
} \
return false; \
}
#endif // _INCLUDE_SOURCEMOD_EXTENSION_BASESDK_H_
+30 -12
View File
@@ -17,6 +17,9 @@
*/ */
#include "ssnatives.h" #include "ssnatives.h"
#include "extension.h"
#include <steam_gameserver.h>
#include "swgameserver.h"
static bool IsSteamWorksLoaded(void) static bool IsSteamWorksLoaded(void)
{ {
@@ -60,11 +63,16 @@ static cell_t sm_RequestUserStats(IPluginContext *pContext, const cell_t *params
return 0; return 0;
} }
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
CSteamID checkid = CreateCommonCSteamID(pPlayer, params); CSteamID checkid = CreateCommonCSteamID(pPlayer, params);
@@ -80,11 +88,16 @@ static cell_t sm_GetStatCell(IPluginContext *pContext, const cell_t *params)
return 0; return 0;
} }
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
char *pName; char *pName;
@@ -123,11 +136,16 @@ static cell_t sm_GetStatFloat(IPluginContext *pContext, const cell_t *params)
return 0; return 0;
} }
int client = gamehelpers->ReferenceToIndex(params[1]); int client = params[1];
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ if (client < 1 || client > playerhelpers->GetMaxClients())
if (pPlayer == NULL || pPlayer->IsConnected() == false)
{ {
return pContext->ThrowNativeError("Client index %d is invalid", params[1]); return pContext->ThrowNativeError("Client index %d is invalid", client);
}
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client);
if (pPlayer == NULL || !pPlayer->IsConnected())
{
return pContext->ThrowNativeError("Client index %d is not connected", client);
} }
char *pName; char *pName;
-3
View File
@@ -17,7 +17,6 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
class SteamWorksSSNatives class SteamWorksSSNatives
{ {
@@ -25,5 +24,3 @@ class SteamWorksSSNatives
SteamWorksSSNatives(); SteamWorksSSNatives();
~SteamWorksSSNatives(); ~SteamWorksSSNatives();
}; };
#include "extension.h"
+2
View File
@@ -17,6 +17,8 @@
*/ */
#include "swforwards.h" #include "swforwards.h"
#include <smsdk_ext.h>
#include <steam_gameserver.h>
SteamWorksForwards::SteamWorksForwards() : SteamWorksForwards::SteamWorksForwards() :
m_CallbackGSClientApprove(this, &SteamWorksForwards::OnGSClientApprove), m_CallbackGSClientApprove(this, &SteamWorksForwards::OnGSClientApprove),
+13 -9
View File
@@ -17,9 +17,13 @@
*/ */
#pragma once #pragma once
#include "isteamgameserver.h"
#include "steam_gameserver.h" #include <steam_gameserver.h>
#include "smsdk_ext.h"
namespace SourceMod
{
class IForward;
}
typedef uint32_t Account_t; typedef uint32_t Account_t;
@@ -41,10 +45,10 @@ class SteamWorksForwards
STEAM_GAMESERVER_CALLBACK(SteamWorksForwards, OnGroupStatusResult, GSClientGroupStatus_t, m_CallbackGroupStatus); STEAM_GAMESERVER_CALLBACK(SteamWorksForwards, OnGroupStatusResult, GSClientGroupStatus_t, m_CallbackGroupStatus);
private: private:
IForward *pFOVC; /* Forward On Validate Client */ SourceMod::IForward *pFOVC; /* Forward On Validate Client */
IForward *pFOVC_Old; /* OLD Forward On Validate Client */ SourceMod::IForward *pFOVC_Old; /* OLD Forward On Validate Client */
IForward *pFOSSC; /* Forward On Steam Servers Connected */ SourceMod::IForward *pFOSSC; /* Forward On Steam Servers Connected */
IForward *pFOSSCF; /* Forward On Steam Servers Connect Failure */ SourceMod::IForward *pFOSSCF; /* Forward On Steam Servers Connect Failure */
IForward *pFOSSD; /* Forward On Steam Servers Disconnected */ SourceMod::IForward *pFOSSD; /* Forward On Steam Servers Disconnected */
IForward *pFOCGS; /* Forward On Client Group Status */ SourceMod::IForward *pFOCGS; /* Forward On Client Group Status */
}; };
+2
View File
@@ -15,7 +15,9 @@
Author: Kyle Sanderson (KyleS). Author: Kyle Sanderson (KyleS).
*/ */
#include "swgamedata.h" #include "swgamedata.h"
#include <smsdk_ext.h>
SteamWorksGameData::SteamWorksGameData() SteamWorksGameData::SteamWorksGameData()
{ {
+7 -5
View File
@@ -17,7 +17,11 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
namespace SourceMod
{
class IGameConfig;
}
class SteamWorksGameData class SteamWorksGameData
{ {
@@ -27,10 +31,8 @@ class SteamWorksGameData
public: public:
bool HasGameData(void) const; bool HasGameData(void) const;
IGameConfig *GetGameData(void) const; SourceMod::IGameConfig *GetGameData(void) const;
private: private:
IGameConfig *pGameConf; SourceMod::IGameConfig *pGameConf;
}; };
#include "extension.h"
+13
View File
@@ -17,6 +17,19 @@
*/ */
#include "swgameserver.h" #include "swgameserver.h"
#include "extension.h"
#include "swgamedata.h"
#include <smsdk_ext.h>
#include <isteamclient.h>
#include <isteamgameserver.h>
#include <isteamutils.h>
#include <isteamnetworking.h>
#include <isteamgameserverstats.h>
#include <isteamhttp.h>
#include <isteammatchmaking.h>
#include <isteamgamecoordinator.h>
static void GetGameSpecificConfigInterface(const char *pName, const char *&pVersion) static void GetGameSpecificConfigInterface(const char *pName, const char *&pVersion)
{ {
+4 -5
View File
@@ -17,9 +17,10 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
#include "steam_gameserver.h" #include <steam_api_common.h>
#include "isteamgamecoordinator.h"
class ISteamGameCoordinator;
#if defined(STEAM_API_INTERNAL_H) || !defined(STEAM_API_EXPORTS) #if defined(STEAM_API_INTERNAL_H) || !defined(STEAM_API_EXPORTS)
S_API ISteamClient *g_pSteamClientGameServer; /* This is awful. */ S_API ISteamClient *g_pSteamClientGameServer; /* This is awful. */
@@ -57,5 +58,3 @@ class SteamWorksGameServer
ISteamGameCoordinator *m_pGC; ISteamGameCoordinator *m_pGC;
bool loaded; bool loaded;
}; };
#include "extension.h"
+7
View File
@@ -17,6 +17,13 @@
*/ */
#include "swgchooks.h" #include "swgchooks.h"
#include "extension.h"
#include "swgameserver.h"
#include <isteamgamecoordinator.h>
#ifdef _WIN32
#undef SendMessage
#endif
enum enum
{ {
+9 -12
View File
@@ -17,15 +17,14 @@
*/ */
#pragma once #pragma once
#include "steam_gameserver.h"
#include "isteamgamecoordinator.h"
#include "smsdk_ext.h" #include <isteamgamecoordinator.h>
#include "sourcehook.h" #include <cstdint>
#ifdef _WIN32 namespace SourceMod
#undef SendMessage {
#endif class IForward;
}
class SteamWorksGCHooks class SteamWorksGCHooks
{ {
@@ -43,12 +42,10 @@ class SteamWorksGCHooks
EGCResults RetrieveMessage(uint32 *punMsgType, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize); EGCResults RetrieveMessage(uint32 *punMsgType, void *pubDest, uint32 cubDest, uint32 *pcubMsgSize);
private: private:
IForward *pGCSendMsg; SourceMod::IForward *pGCSendMsg;
IForward *pGCMsgAvail; SourceMod::IForward *pGCMsgAvail;
IForward *pGCRetMsg; SourceMod::IForward *pGCRetMsg;
unsigned char uHooked; unsigned char uHooked;
}; };
void OurGCGameFrameHook(bool simulating); void OurGCGameFrameHook(bool simulating);
#include "extension.h"
+5
View File
@@ -17,6 +17,11 @@
*/ */
#include "swgsdetours.h" #include "swgsdetours.h"
#include "extension.h"
#include "swgameserver.h"
#include "swgshooks.h"
#include "swgamedata.h"
#include <steam_gameserver.h>
DETOUR_DECL_STATIC0(SteamAPIShutdown, void) DETOUR_DECL_STATIC0(SteamAPIShutdown, void)
{ {
+4 -5
View File
@@ -17,9 +17,10 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
#include "steam_gameserver.h" #include <CDetour/detours.h>
#include "CDetour/detours.h"
class CDetour;
/* SourceMod's safetyhook-based CDetour doesn't ship the "fixed address" helper the /* SourceMod's safetyhook-based CDetour doesn't ship the "fixed address" helper the
old vendored copy had, so define it in terms of the address overload it does expose. */ old vendored copy had, so define it in terms of the address overload it does expose. */
@@ -37,5 +38,3 @@ class SteamWorksGSDetours
CDetour *m_pSafeInitDetour; CDetour *m_pSafeInitDetour;
CDetour *m_pShutdownDetour; CDetour *m_pShutdownDetour;
}; };
#include "extension.h"
+5 -1
View File
@@ -17,7 +17,11 @@
*/ */
#include "swgshooks.h" #include "swgshooks.h"
#include "steamtools/ticket.h" #include "extension.h"
//#include <steamtools/ticket.h> // ????
#include <isteamgameserver.h>
#include <smsdk_ext.h>
#include "swgameserver.h"
enum enum
{ {
+10 -9
View File
@@ -17,10 +17,13 @@
*/ */
#pragma once #pragma once
#include "isteamgameserver.h"
#include "steam_gameserver.h" #include <isteamgameserver.h>
#include "smsdk_ext.h"
#include "sourcehook.h" namespace SourceMod
{
class IForward;
}
class SteamWorksGSHooks class SteamWorksGSHooks
{ {
@@ -38,12 +41,10 @@ class SteamWorksGSHooks
EBeginAuthSessionResult BeginAuthSession(const void*, int, CSteamID); EBeginAuthSessionResult BeginAuthSession(const void*, int, CSteamID);
private: private:
IForward *pFORR; /* On Restart Requested. */ SourceMod::IForward *pFORR; /* On Restart Requested. */
IForward *pFOTR; /* On Token Requested. */ SourceMod::IForward *pFOTR; /* On Token Requested. */
IForward *pOBAS; /* On Begin Auth Session. */ SourceMod::IForward *pOBAS; /* On Begin Auth Session. */
unsigned char uHooked; unsigned char uHooked;
}; };
void OurGameFrameHook(bool simulating); void OurGameFrameHook(bool simulating);
#include "extension.h"
+46 -1
View File
@@ -17,13 +17,18 @@
*/ */
#include "swhttp.h" #include "swhttp.h"
#include "extension.h"
#include "swgameserver.h"
#include "swhttprequest.h"
static ISteamHTTP *GetHTTPPointer() static ISteamHTTP *GetHTTPPointer()
{ {
return g_SteamWorks.pSWGameServer->GetHTTP(); return g_SteamWorks.pSWGameServer->GetHTTP();
} }
SteamWorksHTTP::SteamWorksHTTP() SteamWorksHTTP::SteamWorksHTTP() :
m_CallbackHeadersReceived(this, &SteamWorksHTTP::OnHTTPHeadersReceived),
m_CallbackDataReceived(this, &SteamWorksHTTP::OnHTTPDataReceived)
{ {
this->typeHTTP = handlesys->CreateType("HTTPHandle", this, 0, NULL, NULL, myself->GetIdentity(), NULL); this->typeHTTP = handlesys->CreateType("HTTPHandle", this, 0, NULL, NULL, myself->GetIdentity(), NULL);
} }
@@ -38,6 +43,46 @@ HandleType_t SteamWorksHTTP::GetHTTPHandle(void)
return this->typeHTTP; return this->typeHTTP;
} }
void SteamWorksHTTP::RegisterRequest(SteamWorksHTTPRequest *pRequest)
{
if (pRequest->request != INVALID_HTTPREQUEST_HANDLE)
{
this->m_Requests[pRequest->request] = pRequest;
}
}
void SteamWorksHTTP::UnregisterRequest(SteamWorksHTTPRequest *pRequest)
{
if (pRequest->request != INVALID_HTTPREQUEST_HANDLE)
{
this->m_Requests.erase(pRequest->request);
}
}
SteamWorksHTTPRequest *SteamWorksHTTP::FindRequest(HTTPRequestHandle request)
{
auto it = this->m_Requests.find(request);
return (it == this->m_Requests.end()) ? NULL : it->second;
}
void SteamWorksHTTP::OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *pParam)
{
SteamWorksHTTPRequest *pRequest = this->FindRequest(pParam->m_hRequest);
if (pRequest != NULL)
{
pRequest->OnHTTPHeadersReceived(pParam);
}
}
void SteamWorksHTTP::OnHTTPDataReceived(HTTPRequestDataReceived_t *pParam)
{
SteamWorksHTTPRequest *pRequest = this->FindRequest(pParam->m_hRequest);
if (pRequest != NULL)
{
pRequest->OnHTTPDataReceived(pParam);
}
}
static void DelayedDeleteSteamWorksHTTPRequest(void *object) static void DelayedDeleteSteamWorksHTTPRequest(void *object)
{ {
SteamWorksHTTPRequest *pRequest = reinterpret_cast<SteamWorksHTTPRequest *>(object); SteamWorksHTTPRequest *pRequest = reinterpret_cast<SteamWorksHTTPRequest *>(object);
+24 -7
View File
@@ -17,9 +17,14 @@
*/ */
#pragma once #pragma once
#include "isteamgameserver.h"
#include "steam_gameserver.h" #include <steam_gameserver.h>
#include "smsdk_ext.h" #include <isteamhttp.h>
#include <smsdk_ext.h>
#include <unordered_map>
class SteamWorksHTTPRequest;
class SteamWorksHTTP : class SteamWorksHTTP :
public IHandleTypeDispatch public IHandleTypeDispatch
@@ -31,13 +36,25 @@ class SteamWorksHTTP :
public: public:
void OnHandleDestroy(HandleType_t type, void *object); void OnHandleDestroy(HandleType_t type, void *object);
bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize); bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize);
public: public:
HandleType_t GetHTTPHandle(void); HandleType_t GetHTTPHandle(void);
/* Streaming responses report progress through HTTPRequestHeadersReceived_t /
HTTPRequestDataReceived_t. Steam delivers those as broadcast gameserver
callbacks (not as call results of the streaming API call), so a single
dispatcher here receives them and routes each one to the owning request by
its handle. Requests add/remove themselves as they are created/destroyed. */
void RegisterRequest(SteamWorksHTTPRequest *pRequest);
void UnregisterRequest(SteamWorksHTTPRequest *pRequest);
private:
SteamWorksHTTPRequest *FindRequest(HTTPRequestHandle request);
STEAM_GAMESERVER_CALLBACK(SteamWorksHTTP, OnHTTPHeadersReceived, HTTPRequestHeadersReceived_t, m_CallbackHeadersReceived);
STEAM_GAMESERVER_CALLBACK(SteamWorksHTTP, OnHTTPDataReceived, HTTPRequestDataReceived_t, m_CallbackDataReceived);
private: private:
HandleType_t typeHTTP; HandleType_t typeHTTP;
std::unordered_map<HTTPRequestHandle, SteamWorksHTTPRequest *> m_Requests;
}; };
#include "swhttprequest.h"
#include "extension.h"
+54 -20
View File
@@ -17,8 +17,9 @@
*/ */
#include "swhttprequest.h" #include "swhttprequest.h"
#include "extension.h"
#include <cstdio> #include "swgameserver.h"
#include "swhttp.h"
/* SourceMod 1.13 (extension API 9) changed IPluginManager::FindPluginByContext() /* SourceMod 1.13 (extension API 9) changed IPluginManager::FindPluginByContext()
to take an IPluginContext* directly; older SM (API 8) takes the low-level to take an IPluginContext* directly; older SM (API 8) takes the low-level
@@ -67,6 +68,14 @@ SteamWorksHTTPRequest::SteamWorksHTTPRequest() : request(INVALID_HTTPREQUEST_HAN
SteamWorksHTTPRequest::~SteamWorksHTTPRequest() SteamWorksHTTPRequest::~SteamWorksHTTPRequest()
{ {
/* Requests are freed via a frame action, so on extension unload this can run
after the dispatcher itself has been torn down; pSWHTTP is nulled in that
case (see SDK_OnUnload), so guard against it. */
if (g_SteamWorks.pSWHTTP != NULL)
{
g_SteamWorks.pSWHTTP->UnregisterRequest(this);
}
ISteamHTTP *pHTTP = GetHTTPPointer(); ISteamHTTP *pHTTP = GetHTTPPointer();
if (pHTTP != NULL) if (pHTTP != NULL)
{ {
@@ -101,7 +110,10 @@ void SteamWorksHTTPRequest::OnHTTPRequestCompleted(HTTPRequestCompleted_t *pRequ
this->pCompletedForward->Execute(NULL); this->pCompletedForward->Execute(NULL);
} }
void SteamWorksHTTPRequest::OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *pRequest, bool bFailed) /* Streaming header/data notifications are success-only callbacks (unlike the
completion call result, they carry no IO-failure flag), so bFailure is always
false here. Failures still surface through the completion callback. */
void SteamWorksHTTPRequest::OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *pRequest)
{ {
if (this->pHeadersReceivedForward == NULL || this->pHeadersReceivedForward->GetFunctionCount() == 0) if (this->pHeadersReceivedForward == NULL || this->pHeadersReceivedForward->GetFunctionCount() == 0)
{ {
@@ -109,13 +121,13 @@ void SteamWorksHTTPRequest::OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *
} }
this->pHeadersReceivedForward->PushCell(this->handle); this->pHeadersReceivedForward->PushCell(this->handle);
this->pHeadersReceivedForward->PushCell(bFailed); this->pHeadersReceivedForward->PushCell(false);
this->pHeadersReceivedForward->PushCell(pRequest->m_ulContextValue >> 32); this->pHeadersReceivedForward->PushCell(pRequest->m_ulContextValue >> 32);
this->pHeadersReceivedForward->PushCell((pRequest->m_ulContextValue & 0x00000000FFFFFFFF)); this->pHeadersReceivedForward->PushCell((pRequest->m_ulContextValue & 0x00000000FFFFFFFF));
this->pHeadersReceivedForward->Execute(NULL); this->pHeadersReceivedForward->Execute(NULL);
} }
void SteamWorksHTTPRequest::OnHTTPDataReceived(HTTPRequestDataReceived_t *pRequest, bool bFailed) void SteamWorksHTTPRequest::OnHTTPDataReceived(HTTPRequestDataReceived_t *pRequest)
{ {
if (this->pDataReceivedForward == NULL || this->pDataReceivedForward->GetFunctionCount() == 0) if (this->pDataReceivedForward == NULL || this->pDataReceivedForward->GetFunctionCount() == 0)
{ {
@@ -123,7 +135,7 @@ void SteamWorksHTTPRequest::OnHTTPDataReceived(HTTPRequestDataReceived_t *pReque
} }
this->pDataReceivedForward->PushCell(this->handle); this->pDataReceivedForward->PushCell(this->handle);
this->pDataReceivedForward->PushCell(bFailed); this->pDataReceivedForward->PushCell(false);
this->pDataReceivedForward->PushCell(pRequest->m_cOffset); this->pDataReceivedForward->PushCell(pRequest->m_cOffset);
this->pDataReceivedForward->PushCell(pRequest->m_cBytesReceived); this->pDataReceivedForward->PushCell(pRequest->m_cBytesReceived);
this->pDataReceivedForward->PushCell(pRequest->m_ulContextValue >> 32); this->pDataReceivedForward->PushCell(pRequest->m_ulContextValue >> 32);
@@ -159,7 +171,9 @@ static cell_t sm_CreateHTTPRequest(IPluginContext *pContext, const cell_t *param
pRequest->request = request; pRequest->request = request;
pRequest->handle = handle; pRequest->handle = handle;
g_SteamWorks.pSWHTTP->RegisterRequest(pRequest);
return handle; return handle;
} }
@@ -296,23 +310,14 @@ static cell_t sm_SetCallbacks(IPluginContext *pContext, const cell_t *params)
static void SetCallbacks(SteamAPICall_t &hCall, SteamWorksHTTPRequest *pRequest) static void SetCallbacks(SteamAPICall_t &hCall, SteamWorksHTTPRequest *pRequest)
{ {
/* Only completion is a call result of this send. Header/data streaming
notifications are delivered as broadcast callbacks and routed to the request
by SteamWorksHTTP's dispatcher, so there is nothing to bind to hCall here. */
if (pRequest->pCompletedForward != NULL) if (pRequest->pCompletedForward != NULL)
{ {
pRequest->CompletedCallResult.SetGameserverFlag(); pRequest->CompletedCallResult.SetGameserverFlag();
pRequest->CompletedCallResult.Set(hCall, pRequest, &SteamWorksHTTPRequest::OnHTTPRequestCompleted); pRequest->CompletedCallResult.Set(hCall, pRequest, &SteamWorksHTTPRequest::OnHTTPRequestCompleted);
} }
if (pRequest->pHeadersReceivedForward != NULL)
{
pRequest->HeadersCallResult.SetGameserverFlag();
pRequest->HeadersCallResult.Set(hCall, pRequest, &SteamWorksHTTPRequest::OnHTTPHeadersReceived);
}
if (pRequest->pDataReceivedForward != NULL)
{
pRequest->DataCallResult.SetGameserverFlag();
pRequest->DataCallResult.Set(hCall, pRequest, &SteamWorksHTTPRequest::OnHTTPDataReceived);
}
} }
static cell_t sm_SendHTTPRequestAndStreamResponse(IPluginContext *pContext, const cell_t *params) static cell_t sm_SendHTTPRequestAndStreamResponse(IPluginContext *pContext, const cell_t *params)
@@ -500,7 +505,7 @@ static cell_t sm_SetHTTPRequestRawPostBodyFromFile(IPluginContext *pContext, con
} }
char *pBuffer = new char[size + 1]; char *pBuffer = new char[size + 1];
uint32_t itemsRead = fread(pBuffer, sizeof(char), size, pInputFile); size_t itemsRead = fread(pBuffer, sizeof(char), size, pInputFile);
fclose(pInputFile); fclose(pInputFile);
if (itemsRead != size) if (itemsRead != size)
@@ -706,6 +711,35 @@ static sp_nativeinfo_t httpnatives[] = {
{"SteamWorks_WriteHTTPResponseBodyToFile", sm_WriteHTTPResponseBodyToFile}, {"SteamWorks_WriteHTTPResponseBodyToFile", sm_WriteHTTPResponseBodyToFile},
{"SteamWorks_SendHTTPRequestAndStreamResponse", sm_SendHTTPRequestAndStreamResponse}, {"SteamWorks_SendHTTPRequestAndStreamResponse", sm_SendHTTPRequestAndStreamResponse},
{"SteamWorks_GetHTTPStreamingResponseBodyData", sm_GetHTTPStreamingResponseBodyData}, {"SteamWorks_GetHTTPStreamingResponseBodyData", sm_GetHTTPStreamingResponseBodyData},
/* SteamWorksHTTPRequest methodmap. These reuse the functions above; the implicit
`this` handle arrives as params[1], exactly like the hHandle/hRequest first
parameter of the free-function natives (and the constructor maps to the create
native, whose first argument is likewise params[1]). */
{"SteamWorksHTTPRequest.SteamWorksHTTPRequest", sm_CreateHTTPRequest},
{"SteamWorksHTTPRequest.SetContextValue", sm_SetHTTPRequestContextValue},
{"SteamWorksHTTPRequest.SetNetworkActivityTimeout", sm_SetHTTPRequestNetworkActivityTimeout},
{"SteamWorksHTTPRequest.SetHeaderValue", sm_SetHTTPRequestHeaderValue},
{"SteamWorksHTTPRequest.SetGetOrPostParameter", sm_SetHTTPRequestGetOrPostParameter},
{"SteamWorksHTTPRequest.SetUserAgentInfo", sm_SetHTTPRequestUserAgentInfo},
{"SteamWorksHTTPRequest.SetRequiresVerifiedCertificate", sm_SetHTTPRequestRequiresVerifiedCertificate},
{"SteamWorksHTTPRequest.SetAbsoluteTimeoutMS", sm_SetHTTPRequestAbsoluteTimeoutMS},
{"SteamWorksHTTPRequest.SetCallbacks", sm_SetCallbacks},
{"SteamWorksHTTPRequest.Send", sm_SendHTTPRequest},
{"SteamWorksHTTPRequest.SendAndStreamResponse", sm_SendHTTPRequestAndStreamResponse},
{"SteamWorksHTTPRequest.Defer", sm_DeferHTTPRequest},
{"SteamWorksHTTPRequest.Prioritize", sm_PrioritizeHTTPRequest},
{"SteamWorksHTTPRequest.GetResponseHeaderSize", sm_GetHTTPResponseHeaderSize},
{"SteamWorksHTTPRequest.GetResponseHeaderValue", sm_GetHTTPResponseHeaderValue},
{"SteamWorksHTTPRequest.GetResponseBodySize", sm_GetHTTPResponseBodySize},
{"SteamWorksHTTPRequest.GetResponseBodyData", sm_GetHTTPResponseBodyData},
{"SteamWorksHTTPRequest.GetStreamingResponseBodyData", sm_GetHTTPStreamingResponseBodyData},
{"SteamWorksHTTPRequest.GetDownloadProgressPct", sm_GetHTTPDownloadProgressPct},
{"SteamWorksHTTPRequest.GetWasTimedOut", sm_GetHTTPRequestWasTimedOut},
{"SteamWorksHTTPRequest.SetRawPostBody", sm_SetHTTPRequestRawPostBody},
{"SteamWorksHTTPRequest.SetRawPostBodyFromFile", sm_SetHTTPRequestRawPostBodyFromFile},
{"SteamWorksHTTPRequest.GetResponseBodyCallback", sm_GetHTTPResponseBodyCallback},
{"SteamWorksHTTPRequest.WriteResponseBodyToFile", sm_WriteHTTPResponseBodyToFile},
{NULL, NULL} {NULL, NULL}
}; };
+11 -12
View File
@@ -17,9 +17,9 @@
*/ */
#pragma once #pragma once
#include "isteamgameserver.h"
#include "steam_gameserver.h" #include <isteamhttp.h>
#include "smsdk_ext.h" #include <smsdk_ext.h> // HTTPRequestHandle, Handle_t, IChangeableForward
class SteamWorksHTTPRequest class SteamWorksHTTPRequest
{ {
@@ -32,19 +32,20 @@ class SteamWorksHTTPRequest
Handle_t handle; Handle_t handle;
public: public:
/* Completion is a genuine call result of the send API call, so it stays a
CCallResult. Headers/data arrive as broadcast callbacks and are routed here
by SteamWorksHTTP's dispatcher, hence no per-request CCallResult for them. */
void OnHTTPRequestCompleted(HTTPRequestCompleted_t *pRequest, bool bFailed); void OnHTTPRequestCompleted(HTTPRequestCompleted_t *pRequest, bool bFailed);
void OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *pRequest, bool bFailed); void OnHTTPHeadersReceived(HTTPRequestHeadersReceived_t *pRequest);
void OnHTTPDataReceived(HTTPRequestDataReceived_t *pRequest, bool bFailed); void OnHTTPDataReceived(HTTPRequestDataReceived_t *pRequest);
public: public:
CCallResult<SteamWorksHTTPRequest, HTTPRequestCompleted_t> CompletedCallResult; CCallResult<SteamWorksHTTPRequest, HTTPRequestCompleted_t> CompletedCallResult;
CCallResult<SteamWorksHTTPRequest, HTTPRequestHeadersReceived_t> HeadersCallResult;
CCallResult<SteamWorksHTTPRequest, HTTPRequestDataReceived_t> DataCallResult;
public: public:
IChangeableForward *pCompletedForward; SourceMod::IChangeableForward *pCompletedForward;
IChangeableForward *pHeadersReceivedForward; SourceMod::IChangeableForward *pHeadersReceivedForward;
IChangeableForward *pDataReceivedForward; SourceMod::IChangeableForward *pDataReceivedForward;
}; };
class SteamWorksHTTPNatives class SteamWorksHTTPNatives
@@ -53,5 +54,3 @@ class SteamWorksHTTPNatives
SteamWorksHTTPNatives(); SteamWorksHTTPNatives();
~SteamWorksHTTPNatives(); ~SteamWorksHTTPNatives();
}; };
#include "extension.h"
+1 -1
View File
@@ -16,7 +16,7 @@
Author: Kyle Sanderson (KyleS). Author: Kyle Sanderson (KyleS).
*/ */
#include "swmemutils.h" #include "swmemutils.h"
#include "am-utility.h" #include <am-utility.h>
void *SteamWorksMemUtils::ResolveSymbolInt(void *pBase, const char *pSymbol) void *SteamWorksMemUtils::ResolveSymbolInt(void *pBase, const char *pSymbol)
{ {
+2 -3
View File
@@ -17,7 +17,8 @@
*/ */
#pragma once #pragma once
#include "smsdk_ext.h"
//#include <cstddef>
class SteamWorksMemUtils class SteamWorksMemUtils
{ {
@@ -25,5 +26,3 @@ class SteamWorksMemUtils
void *ResolveSymbolInt(void *pBase, const char *pSymbol); void *ResolveSymbolInt(void *pBase, const char *pSymbol);
size_t GetOffsetFromVTable(void *pInterface, void *pToFindFunc, const char *pClassSig = NULL, size_t version = 0); size_t GetOffsetFromVTable(void *pInterface, void *pToFindFunc, const char *pClassSig = NULL, size_t version = 0);
}; };
#include "extension.h"
File diff suppressed because it is too large Load Diff
+2
View File
@@ -30,4 +30,6 @@ run.options.add_argument('--enable-debug', action='store_const', const='1', dest
run.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt', run.options.add_argument('--enable-optimize', action='store_const', const='1', dest='opt',
help='Enable optimization') help='Enable optimization')
run.options.add_argument('--target', default=None, help='Override the default build target') run.options.add_argument('--target', default=None, help='Override the default build target')
run.options.add_argument('--version', type=str, dest='version', default=None,
help='Override the version string baked into the binary (defaults to the literal in smsdk_config.h)')
run.Configure() run.Configure()