From fda5ac1738810905c65d5e7a9b0e050e6022b2c8 Mon Sep 17 00:00:00 2001
From: David Anderson <dvander@alliedmods.net>
Date: Wed, 26 Sep 2007 13:12:59 +0000
Subject: [PATCH] added new api to IPlayerHelpers for detecting when the server
 starts up

--HG--
extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%401491
---
 core/PlayerManager.cpp  | 17 ++++++++++++++---
 core/PlayerManager.h    |  1 +
 public/IPlayerHelpers.h | 17 ++++++++++++++++-
 3 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/core/PlayerManager.cpp b/core/PlayerManager.cpp
index 6082cb52..9eb23a50 100644
--- a/core/PlayerManager.cpp
+++ b/core/PlayerManager.cpp
@@ -79,7 +79,7 @@ public:
 PlayerManager::PlayerManager()
 {
 	m_AuthQueue = NULL;
-	m_FirstPass = true;
+	m_FirstPass = false;
 
 	m_UserIdLookUp = new int[USHRT_MAX+1];
 	memset(m_UserIdLookUp, 0, sizeof(int) * (USHRT_MAX+1));
@@ -180,14 +180,14 @@ ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
 
 void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int clientMax)
 {
-	if (m_FirstPass)
+	if (!m_FirstPass)
 	{
 		/* Initialize all players */
 		m_maxClients = clientMax;
 		m_PlayerCount = 0;
 		m_Players = new CPlayer[m_maxClients + 1];
 		m_AuthQueue = new unsigned int[m_maxClients + 1];
-		m_FirstPass = false;
+		m_FirstPass = true;
 
 		memset(m_AuthQueue, 0, sizeof(unsigned int) * (m_maxClients + 1));
 
@@ -196,11 +196,22 @@ void PlayerManager::OnServerActivate(edict_t *pEdictList, int edictCount, int cl
 	m_onActivate->Execute(NULL);
 	m_onActivate2->Execute(NULL);
 
+	List<IClientListener *>::iterator iter;
+	for (iter = m_hooks.begin; iter != m_hooks.end(); iter++)
+	{
+		(*iter)->OnServerActivated(clientMax);
+	}
+
 	g_OnMapStarted = true;
 
 	SM_ExecuteAllConfigs();
 }
 
+bool PlayerManager::IsServerActivated()
+{
+	return m_FirstPass;
+}
+
 bool PlayerManager::CheckSetAdmin(int index, CPlayer *pPlayer, AdminId id)
 {
 	const char *password = g_Admins.GetAdminPassword(id);
diff --git a/core/PlayerManager.h b/core/PlayerManager.h
index c058f0d7..983f3cd5 100644
--- a/core/PlayerManager.h
+++ b/core/PlayerManager.h
@@ -130,6 +130,7 @@ public: //IPlayerManager
 	int GetMaxClients();
 	int GetNumPlayers();
 	int GetClientOfUserId(int userid);
+	bool IsServerActivated();
 public:
 	inline int MaxClients()
 	{
diff --git a/public/IPlayerHelpers.h b/public/IPlayerHelpers.h
index 43596bb3..bf02dcf3 100644
--- a/public/IPlayerHelpers.h
+++ b/public/IPlayerHelpers.h
@@ -41,7 +41,7 @@
 #include <IAdminSystem.h>
 
 #define SMINTERFACE_PLAYERMANAGER_NAME		"IPlayerManager"
-#define SMINTERFACE_PLAYERMANAGER_VERSION	4
+#define SMINTERFACE_PLAYERMANAGER_VERSION	5
 
 struct edict_t;
 class IPlayerInfo;
@@ -220,6 +220,13 @@ namespace SourceMod
 		virtual void OnClientAuthorized(int client, const char *authstring)
 		{
 		}
+
+		/**
+		 * @brief Called when the server is activated.
+		 */
+		virtual void OnServerActivated(int max_clients)
+		{
+		}
 	};
 
 	class IPlayerManager : public SMInterface
@@ -288,6 +295,14 @@ namespace SourceMod
 		 * @return				Client index, or 0 if invalid userid passed.
 		 */
 		virtual int GetClientOfUserId(int userid) =0;
+
+		/**
+		 * @brief Returns whether or not the server is activated.
+		 *
+		 * @return				True if ServerActivate() has been called
+		 *						at least once, false otherwise.
+		 */
+		virtual bool IsServerActivated() =0;
 	};
 }