core/PlayerManager.cpp
changeset 2323 efa6bfdd7571
parent 2289 44045ead61cd
child 2342 70d4ef38b90e
     1.1 --- a/core/PlayerManager.cpp	Sun Sep 21 14:20:01 2008 +1200
     1.2 +++ b/core/PlayerManager.cpp	Fri Sep 26 19:08:49 2008 +1200
     1.3 @@ -68,6 +68,15 @@
     1.4  SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
     1.5  SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
     1.6  
     1.7 +#if defined ORANGEBOX_BUILD
     1.8 +SH_DECL_EXTERN1_void(ConCommand, Dispatch, SH_NOATTRIB, false, const CCommand &);
     1.9 +#else
    1.10 +extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
    1.11 +extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
    1.12 +#endif
    1.13 +
    1.14 +ConCommand *maxplayersCmd = NULL;
    1.15 +
    1.16  class KickPlayerTimer : public ITimedEvent
    1.17  {
    1.18  public:
    1.19 @@ -137,6 +146,32 @@
    1.20  
    1.21  	m_bIsListenServer = !engine->IsDedicatedServer();
    1.22  	m_ListenClient = 0;
    1.23 +
    1.24 +	g_ConVarManager.AddConVarChangeListener("tv_enable", this);
    1.25 +
    1.26 +	ConCommandBase *pBase = icvar->GetCommands();
    1.27 +	ConCommand *pCmd = NULL;
    1.28 +	while (pBase)
    1.29 +	{
    1.30 +		if (strcmp(pBase->GetName(), "maxplayers") == 0)
    1.31 +		{
    1.32 +			/* Don't want to return convar with same name */
    1.33 +			if (!pBase->IsCommand())
    1.34 +			{
    1.35 +				break;
    1.36 +			}
    1.37 +
    1.38 +			pCmd = (ConCommand *)pBase;
    1.39 +			break;
    1.40 +		}
    1.41 +		pBase = const_cast<ConCommandBase *>(pBase->GetNext());
    1.42 +	}
    1.43 +
    1.44 +	if (pCmd != NULL)
    1.45 +	{
    1.46 +		SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, pCmd, CmdMaxplayersCallback, true);
    1.47 +		maxplayersCmd = pCmd;
    1.48 +	}
    1.49  }
    1.50  
    1.51  void PlayerManager::OnSourceModShutdown()
    1.52 @@ -165,6 +200,13 @@
    1.53  	g_Forwards.ReleaseForward(PostAdminFilter);
    1.54  
    1.55  	delete [] m_Players;
    1.56 +
    1.57 +	g_ConVarManager.RemoveConVarChangeListener("tv_enable", this);
    1.58 +
    1.59 +	if (maxplayersCmd != NULL)
    1.60 +	{
    1.61 +		SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, maxplayersCmd, CmdMaxplayersCallback, true);
    1.62 +	}
    1.63  }
    1.64  
    1.65  ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key, 
    1.66 @@ -202,11 +244,11 @@
    1.67  		/* Initialize all players */
    1.68  		m_maxClients = clientMax;
    1.69  		m_PlayerCount = 0;
    1.70 -		m_Players = new CPlayer[m_maxClients + 1];
    1.71 -		m_AuthQueue = new unsigned int[m_maxClients + 1];
    1.72 +		m_Players = new CPlayer[ABSOLUTE_PLAYER_LIMIT + 1];
    1.73 +		m_AuthQueue = new unsigned int[ABSOLUTE_PLAYER_LIMIT + 1];
    1.74  		m_FirstPass = true;
    1.75  
    1.76 -		memset(m_AuthQueue, 0, sizeof(unsigned int) * (m_maxClients + 1));
    1.77 +		memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1));
    1.78  
    1.79  		g_NumPlayersToAuth = &m_AuthQueue[0];
    1.80  	}
    1.81 @@ -1203,6 +1245,68 @@
    1.82  	}
    1.83  }
    1.84  
    1.85 +void PlayerManager::OnConVarChanged( ConVar *pConVar, const char *oldValue, float flOldValue )
    1.86 +{
    1.87 +	if (pConVar->GetBool() && !atoi(oldValue))
    1.88 +	{
    1.89 +		MaxPlayersChanged(gpGlobals->maxClients + 1);
    1.90 +	}
    1.91 +	else
    1.92 +	{
    1.93 +		MaxPlayersChanged();
    1.94 +	}
    1.95 +}
    1.96 +
    1.97 +void PlayerManager::OnSourceModMaxPlayersChanged( int newvalue )
    1.98 +{
    1.99 +	m_maxClients = newvalue;
   1.100 +}
   1.101 +
   1.102 +void PlayerManager::MaxPlayersChanged( int newvalue /*= -1*/ )
   1.103 +{
   1.104 +	if (newvalue == -1)
   1.105 +	{
   1.106 +		newvalue = gpGlobals->maxClients;
   1.107 +	}
   1.108 +
   1.109 +	if (newvalue == MaxClients())
   1.110 +	{
   1.111 +		return;
   1.112 +	}
   1.113 +
   1.114 +	/* Notify the rest of core */
   1.115 +	SMGlobalClass *pBase = SMGlobalClass::head;
   1.116 +	while (pBase)
   1.117 +	{
   1.118 +		pBase->OnSourceModMaxPlayersChanged(newvalue);
   1.119 +		pBase = pBase->m_pGlobalClassNext;
   1.120 +	}
   1.121 +
   1.122 +	/* Notify Extensions */
   1.123 +	List<IClientListener *>::iterator iter;
   1.124 +	IClientListener *pListener = NULL;
   1.125 +	for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
   1.126 +	{
   1.127 +		pListener = (*iter);
   1.128 +		if (pListener->GetClientListenerVersion() >= 8)
   1.129 +		{
   1.130 +			pListener->OnMaxPlayersChanged(newvalue);
   1.131 +		}
   1.132 +	}
   1.133 +}
   1.134 +
   1.135 +#if defined ORANGEBOX_BUILD
   1.136 +void CmdMaxplayersCallback(const CCommand &command)
   1.137 +{
   1.138 +#else
   1.139 +void CmdMaxplayersCallback()
   1.140 +{
   1.141 +#endif
   1.142 +
   1.143 +	g_Players.MaxPlayersChanged();
   1.144 +}
   1.145 +
   1.146 +
   1.147  /*******************
   1.148   *** PLAYER CODE ***
   1.149   *******************/