From e5e38073293c9cdda1c74e3686c1a98427acfb9e Mon Sep 17 00:00:00 2001 From: KyleSanderson Date: Sun, 12 Jan 2014 18:37:20 -0700 Subject: [PATCH] Add UserStats to project. --- Extension/Makefile | 2 +- Extension/extension.cpp | 2 + Extension/extension.h | 2 + Extension/ssnatives.cpp | 186 ++++++++++++++++++++++++++++++++++++++++ Extension/ssnatives.h | 30 +++++++ 5 files changed, 221 insertions(+), 1 deletion(-) create mode 100644 Extension/ssnatives.cpp create mode 100644 Extension/ssnatives.h diff --git a/Extension/Makefile b/Extension/Makefile index f64e965..bdcbd62 100644 --- a/Extension/Makefile +++ b/Extension/Makefile @@ -26,7 +26,7 @@ PROJECT = SteamWorks #USEMETA = true USESH = true -OBJECTS = sdk/smsdk_ext.cpp extension.cpp swgameserver.cpp swgamedata.cpp swforwards.cpp gsnatives.cpp swgshooks.cpp +OBJECTS = sdk/smsdk_ext.cpp extension.cpp swgameserver.cpp swgamedata.cpp swforwards.cpp gsnatives.cpp swgshooks.cpp ssnatives.cpp ############################################## ### CONFIGURE ANY OTHER FLAGS/OPTIONS HERE ### diff --git a/Extension/extension.cpp b/Extension/extension.cpp index 41b5e8c..e594e22 100644 --- a/Extension/extension.cpp +++ b/Extension/extension.cpp @@ -48,11 +48,13 @@ bool SteamWorks::SDK_OnLoad(char *error, size_t maxlength, bool late) this->pSWForward = new SteamWorksForwards; this->pGSNatives = new SteamWorksGSNatives; this->pGSHooks = new SteamWorksGSHooks; + this->pSSNatives = new SteamWorksSSNatives; return true; } void SteamWorks::SDK_OnUnload() { + delete this->pSSNatives; delete this->pGSHooks; delete this->pGSNatives; delete this->pSWForward; diff --git a/Extension/extension.h b/Extension/extension.h index 3f88fce..b2cb760 100644 --- a/Extension/extension.h +++ b/Extension/extension.h @@ -47,6 +47,7 @@ #include "swforwards.h" #include "gsnatives.h" #include "swgshooks.h" +#include "ssnatives.h" /** * @brief Sample implementation of the SDK Extension. @@ -134,6 +135,7 @@ public: SteamWorksGameServer *pSWGameServer; SteamWorksGSNatives *pGSNatives; SteamWorksGSHooks *pGSHooks; + SteamWorksSSNatives *pSSNatives; }; extern SteamWorks g_SteamWorks; diff --git a/Extension/ssnatives.cpp b/Extension/ssnatives.cpp new file mode 100644 index 0000000..598ae58 --- /dev/null +++ b/Extension/ssnatives.cpp @@ -0,0 +1,186 @@ +/* + This file is part of SourcePawn SteamWorks. + + SourcePawn SteamWorks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + SourcePawn SteamWorks 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 SourcePawn SteamWorks. If not, see . + + Author: Kyle Sanderson (KyleS). +*/ + +#include "ssnatives.h" + +static bool IsSteamWorksLoaded(void) +{ + return (g_SteamWorks.pSWGameServer->GetSteamClient() != NULL); +} + +static ISteamGameServerStats *GetServerStatsPointer(void) +{ + return g_SteamWorks.pSWGameServer->GetServerStats(); +} + +static CSteamID CreateCommonCSteamID(uint32_t authid, const cell_t *params, unsigned char universeplace = 2, unsigned char typeplace = 3) +{ + return g_SteamWorks.CreateCommonCSteamID(authid, params, universeplace, typeplace); +} + +static cell_t sm_RequestStatsAuthID(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + CSteamID checkid = CreateCommonCSteamID(params[1], params); + return pStats->RequestUserStats(checkid) != k_uAPICallInvalid ? 1 : 0; +} + +static cell_t sm_RequestUserStats(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + int client = gamehelpers->ReferenceToIndex(params[1]); + IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ + if (pPlayer == NULL || pPlayer->IsConnected() == false) + { + return pContext->ThrowNativeError("Client index %d is invalid", params[1]); + } + + CSteamID checkid = CreateCommonCSteamID(pPlayer->GetSteamAccountID(false), params); + return pStats->RequestUserStats(checkid) != k_uAPICallInvalid ? 1 : 0; +} + +static cell_t sm_GetStatCell(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + int client = gamehelpers->ReferenceToIndex(params[1]); + IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ + if (pPlayer == NULL || pPlayer->IsConnected() == false) + { + return pContext->ThrowNativeError("Client index %d is invalid", params[1]); + } + + char *pName; + pContext->LocalToString(params[2], &pName); + + cell_t *pValue; + pContext->LocalToPhysAddr(params[3], &pValue); + CSteamID checkid = CreateCommonCSteamID(pPlayer->GetSteamAccountID(false), params, 4, 5); + return pStats->GetUserStat(checkid, pName, pValue) ? 1 : 0; +} + +static cell_t sm_GetStatAuthIDCell(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + char *pName; + pContext->LocalToString(params[2], &pName); + + cell_t *pValue; + pContext->LocalToPhysAddr(params[3], &pValue); + CSteamID checkid = CreateCommonCSteamID(params[1], params, 4, 5); + return pStats->GetUserStat(checkid, pName, pValue) ? 1 : 0; +} + +static cell_t sm_GetStatFloat(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + int client = gamehelpers->ReferenceToIndex(params[1]); + IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(client); /* Man, including GameHelpers and PlayerHelpers for this native :(. */ + if (pPlayer == NULL || pPlayer->IsConnected() == false) + { + return pContext->ThrowNativeError("Client index %d is invalid", params[1]); + } + + char *pName; + pContext->LocalToString(params[2], &pName); + + cell_t *pValue; + pContext->LocalToPhysAddr(params[3], &pValue); + CSteamID checkid = CreateCommonCSteamID(pPlayer->GetSteamAccountID(false), params, 4, 5); + + float fValue; + bool bResult = pStats->GetUserStat(checkid, pName, &fValue); + + *pValue = sp_ftoc(fValue); + + return bResult ? 1 : 0; +} + +static cell_t sm_GetStatAuthIDFloat(IPluginContext *pContext, const cell_t *params) +{ + ISteamGameServerStats *pStats = GetServerStatsPointer(); + + if (pStats == NULL) + { + return 0; + } + + char *pName; + pContext->LocalToString(params[2], &pName); + + cell_t *pValue; + pContext->LocalToPhysAddr(params[3], &pValue); + CSteamID checkid = CreateCommonCSteamID(params[1], params, 4, 5); + + float fValue; + bool bResult = pStats->GetUserStat(checkid, pName, &fValue); + + *pValue = sp_ftoc(fValue); + + return bResult ? 1 : 0; +} + +static sp_nativeinfo_t ssnatives[] = { + {"SteamWorks_RequestStatsAuthID", sm_RequestStatsAuthID}, + {"SteamWorks_RequestStats", sm_RequestUserStats}, + {"SteamWorks_GetStatCell", sm_GetStatCell}, + {"SteamWorks_GetStatAuthIDCell", sm_GetStatAuthIDCell}, + {"SteamWorks_GetStatFloat", sm_GetStatFloat}, + {"SteamWorks_GetStatAuthIDFloat", sm_GetStatAuthIDFloat}, + {NULL, NULL} +}; + +SteamWorksSSNatives::SteamWorksSSNatives() +{ + sharesys->AddNatives(myself, ssnatives); +} + +SteamWorksSSNatives::~SteamWorksSSNatives() +{ + /* We tragically can't remove ourselves... hopefully no one uses this class, you know, like a class. */ +} diff --git a/Extension/ssnatives.h b/Extension/ssnatives.h new file mode 100644 index 0000000..d4aaa21 --- /dev/null +++ b/Extension/ssnatives.h @@ -0,0 +1,30 @@ +/* + This file is part of SourcePawn SteamWorks. + + SourcePawn SteamWorks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + SourcePawn SteamWorks 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 SourcePawn SteamWorks. If not, see . + + Author: Kyle Sanderson (KyleS). +*/ + +#pragma once +#include "smsdk_ext.h" + +class SteamWorksSSNatives +{ + public: + SteamWorksSSNatives(); + ~SteamWorksSSNatives(); +}; + +#include "extension.h" \ No newline at end of file