diff --git a/core/HalfLife2.cpp b/core/HalfLife2.cpp index 5fa16f4b..5ac08349 100644 --- a/core/HalfLife2.cpp +++ b/core/HalfLife2.cpp @@ -2,7 +2,7 @@ * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod - * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -1377,3 +1377,75 @@ string_t CHalfLife2::AllocPooledString(const char *pszValue) return newString; } #endif + +bool CHalfLife2::GetServerSteam3Id(char *pszOut, size_t len) const +{ + CSteamID sid(GetServerSteamId64()); + + switch (sid.GetEAccountType()) + { + case k_EAccountTypeAnonGameServer: + ke::SafeSprintf(pszOut, len, "[A:%u:%u:%u]", sid.GetEUniverse(), sid.GetAccountID(), sid.GetUnAccountInstance()); + break; + case k_EAccountTypeGameServer: + ke::SafeSprintf(pszOut, len, "[G:%u:%u]", sid.GetEUniverse(), sid.GetAccountID()); + break; + case k_EAccountTypeInvalid: + ke::SafeSprintf(pszOut, len, "[I:%u:%u]", sid.GetEUniverse(), sid.GetAccountID()); + break; + default: + return false; + } + + return true; +} + +#if defined( PLATFORM_WINDOWS ) +#define STEAM_LIB_PREFIX +#define STEAM_LIB_SUFFIX +#elif defined( PLATFORM_LINUX ) +#define STEAM_LIB_PREFIX "lib" +#define STEAM_LIB_SUFFIX ".so" +#elif defined( PLATFORM_APPLE ) +#define STEAM_LIB_PREFIX "lib" +#define STEAM_LIB_SUFFIX ".dylib" +#endif + +uint64_t CHalfLife2::GetServerSteamId64() const +{ +#if SOURCE_ENGINE == SE_BLADE \ + || SOURCE_ENGINE == SE_BMS \ + || SOURCE_ENGINE == SE_CSGO \ + || SOURCE_ENGINE == SE_CSS \ + || SOURCE_ENGINE == SE_DODS \ + || SOURCE_ENGINE == SE_EYE \ + || SOURCE_ENGINE == SE_HL2DM \ + || SOURCE_ENGINE == SE_INSURGENCY \ + || SOURCE_ENGINE == SE_SDK2013 \ + || SOURCE_ENGINE == SE_ALIENSWARM \ + || SOURCE_ENGINE == SE_TF2 + const CSteamID *sid = engine->GetGameServerSteamID(); + if (sid) + { + return sid->ConvertToUint64(); + } +#else + typedef uint64_t(* GetServerSteamIdFn)(void); + static GetServerSteamIdFn fn = nullptr; + if (!fn) + { + ke::SharedLib steam_api(STEAM_LIB_PREFIX "steam_api" STEAM_LIB_SUFFIX); + if (steam_api.valid()) + { + fn = (GetServerSteamIdFn)steam_api.lookup("SteamGameServer_GetSteamID"); + } + } + + if (fn) + { + return fn(); + } +#endif + + return 1ULL; +} diff --git a/core/HalfLife2.h b/core/HalfLife2.h index 0ddc5e1e..79b8d563 100644 --- a/core/HalfLife2.h +++ b/core/HalfLife2.h @@ -2,7 +2,7 @@ * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod - * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -194,6 +194,8 @@ public: //IGameHelpers #if SOURCE_ENGINE >= SE_ORANGEBOX string_t AllocPooledString(const char *pszValue); #endif + bool GetServerSteam3Id(char *pszOut, size_t len) const override; + uint64_t GetServerSteamId64() const override; public: void AddToFakeCliCmdQueue(int client, int userid, const char *cmd); void ProcessFakeCliCmdQueue(); diff --git a/core/logic/AMBuilder b/core/logic/AMBuilder index 3098675d..11e6a7f7 100644 --- a/core/logic/AMBuilder +++ b/core/logic/AMBuilder @@ -81,6 +81,7 @@ binary.sources += [ 'RootConsoleMenu.cpp', 'CDataPack.cpp', 'frame_tasks.cpp', + 'smn_halflife.cpp', ] if builder.target_platform == 'windows': binary.sources += ['thread/WinThreads.cpp'] diff --git a/core/logic/smn_halflife.cpp b/core/logic/smn_halflife.cpp new file mode 100644 index 00000000..79f97d52 --- /dev/null +++ b/core/logic/smn_halflife.cpp @@ -0,0 +1,69 @@ +/** +* vim: set ts=4 sw=4 tw=99 noet : +* ============================================================================= +* SourceMod +* Copyright (C) 2004-2016 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 . +* +* 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 . +* +* Version: $Id$ +*/ + +#include "common_logic.h" +#include +#include + +#include + +static cell_t GetServerAuthId(IPluginContext *pContext, const cell_t *params) +{ + cell_t *pOut; + pContext->LocalToPhysAddr(params[2], &pOut); + + switch ((AuthIdType)params[1]) + { + case AuthIdType::Steam3: + gamehelpers->GetServerSteam3Id((char *)pOut, params[3]); + break; + + case AuthIdType::SteamId64: + ke::SafeSprintf((char *)pOut, params[3], "%" PRIu64, gamehelpers->GetServerSteamId64()); + break; + default: + return pContext->ThrowNativeError("Unsupported AuthIdType (%d) for GetServerAuthId.", params[1]); + } + + return 1; +} + +static cell_t GetServerAccountId(IPluginContext *pContext, const cell_t *params) +{ + return (cell_t)(gamehelpers->GetServerSteamId64() & 0xFFFFFFFF); +} + +REGISTER_NATIVES(halflifeNatives) +{ + { "GetServerAuthId", GetServerAuthId }, + { "GetServerSteamAccountId", GetServerAccountId }, + { nullptr, nullptr } +}; diff --git a/core/logic/smn_players.cpp b/core/logic/smn_players.cpp index 1218959f..674eaca9 100644 --- a/core/logic/smn_players.cpp +++ b/core/logic/smn_players.cpp @@ -2,7 +2,7 @@ * vim: set ts=4 sw=4 tw=99 noet : * ============================================================================= * SourceMod - * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -336,15 +336,6 @@ static cell_t sm_GetClientIP(IPluginContext *pCtx, const cell_t *params) return 1; } -// Must match clients.inc -enum class AuthIdType -{ - Engine = 0, - Steam2, - Steam3, - SteamId64, -}; - static cell_t SteamIdToLocal(IPluginContext *pCtx, int index, AuthIdType authType, cell_t local_addr, size_t bytes, bool validate) { pCtx->StringToLocal(local_addr, bytes, "STEAM_ID_STOP_IGNORING_RETVALS"); diff --git a/core/sm_globals.h b/core/sm_globals.h index e462028b..7a008268 100644 --- a/core/sm_globals.h +++ b/core/sm_globals.h @@ -2,7 +2,7 @@ * vim: set ts=4 sw=4 : * ============================================================================= * SourceMod - * Copyright (C) 2004-2009 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -65,6 +65,15 @@ enum ConfigSource ConfigSource_Console = 1, /**< Config option was set from console command (sm config) */ }; +// Must match clients.inc +enum class AuthIdType +{ + Engine = 0, + Steam2, + Steam3, + SteamId64, +}; + /** * @brief Any class deriving from this will be automatically initiated/shutdown by SourceMod */ diff --git a/plugins/include/halflife.inc b/plugins/include/halflife.inc index d2899d3b..dfb906f9 100644 --- a/plugins/include/halflife.inc +++ b/plugins/include/halflife.inc @@ -1,7 +1,7 @@ /** * vim: set ts=4 : * ============================================================================= - * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved. + * SourceMod (C)2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This file is part of the SourceMod/SourcePawn SDK. @@ -692,3 +692,23 @@ enum ClientRangeType */ native int GetClientsInRange(float origin[3], ClientRangeType rangeType, int[] clients, int size); +/** + * Retrieves the server's authentication string (SteamID). + * + * Note: If called before server is connected to Steam, auth id + * will be invalid ([I:0:1], 1, etc.) + * + * @param authType Auth id type and format to use. + * (Only AuthId_Steam3 and AuthId_SteamID64 are supported) + * @param auth Buffer to store the server's auth id. + * @param maxlen Maximum length of string buffer (includes NULL terminator). + * @error Invalid AuthIdType given. + */ +native void GetServerAuthId(AuthIdType authType, char[] auth, int maxlen); + +/** + * Returns the server's Steam account ID. + * + * @return Steam account ID or 0 if not available. + */ +native int GetServerSteamAccountId(); diff --git a/public/IGameHelpers.h b/public/IGameHelpers.h index 443a0866..35b71475 100644 --- a/public/IGameHelpers.h +++ b/public/IGameHelpers.h @@ -2,7 +2,7 @@ * vim: set ts=4 : * ============================================================================= * SourceMod - * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. + * Copyright (C) 2004-2016 AlliedModders LLC. All rights reserved. * ============================================================================= * * This program is free software; you can redistribute it and/or modify it under @@ -40,7 +40,7 @@ */ #define SMINTERFACE_GAMEHELPERS_NAME "IGameHelpers" -#define SMINTERFACE_GAMEHELPERS_VERSION 10 +#define SMINTERFACE_GAMEHELPERS_VERSION 11 class CBaseEntity; class CBaseHandle; @@ -335,6 +335,23 @@ namespace SourceMod * on failure. */ virtual bool FindDataMapInfo(datamap_t *pMap, const char *offset, sm_datatable_info_t *pDataTable) =0; + + /** + * @brief Retrieves the server's rendered Steam3 id. + * + * @param pszOut Buffer to which id will be copied. + * @param len Max size of buffer in bytes. + * @return True on id successfully retrieved and buffer populated + * (even if id invalid/unset) false on failure (unknown id type). + */ + virtual bool GetServerSteam3Id(char *pszOut, size_t len) const =0; + + /** + * @brief Retrieves the server's SteamID64. + * + * @return 64-bit server Steam id. + */ + virtual uint64_t GetServerSteamId64() const =0; }; }