core/UserMessages.cpp
changeset 3855 d8ba5eddf543
parent 3819 d17aed3d46bf
child 3861 2b9cad31c7c1
     1.1 --- a/core/UserMessages.cpp	Tue Mar 19 11:19:19 2013 -0400
     1.2 +++ b/core/UserMessages.cpp	Tue Mar 19 11:19:38 2013 -0400
     1.3 @@ -32,13 +32,15 @@
     1.4  #include "UserMessages.h"
     1.5  #include "sm_stringutil.h"
     1.6  
     1.7 -#if SOURCE_ENGINE == SE_CSGO
     1.8 +#if SOURCE_ENGINE == SE_DOTA
     1.9 +#include <dota_usermessage_helpers.h>
    1.10 +#elif SOURCE_ENGINE == SE_CSGO
    1.11  #include <cstrike15_usermessage_helpers.h>
    1.12  #endif
    1.13  
    1.14  UserMessages g_UserMsgs;
    1.15  
    1.16 -#if SOURCE_ENGINE == SE_CSGO
    1.17 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
    1.18  SH_DECL_HOOK3_void(IVEngineServer, SendUserMessage, SH_NOATTRIB, 0, IRecipientFilter &, int, const protobuf::Message &);
    1.19  #else
    1.20  #if SOURCE_ENGINE >= SE_LEFT4DEAD
    1.21 @@ -96,7 +98,7 @@
    1.22  {
    1.23  	if (m_HookCount)
    1.24  	{
    1.25 -#if SOURCE_ENGINE == SE_CSGO
    1.26 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
    1.27  		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
    1.28  		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
    1.29  #else
    1.30 @@ -111,7 +113,10 @@
    1.31  
    1.32  int UserMessages::GetMessageIndex(const char *msg)
    1.33  {
    1.34 -#if SOURCE_ENGINE == SE_CSGO
    1.35 +#if SOURCE_ENGINE == SE_DOTA
    1.36 +	// Can split this per engine and/or game later
    1.37 +	return g_DotaUsermessageHelpers.GetIndex(msg);
    1.38 +#elif SOURCE_ENGINE == SE_CSGO
    1.39  	// Can split this per engine and/or game later
    1.40  	return g_Cstrike15UsermessageHelpers.GetIndex(msg);
    1.41  #else
    1.42 @@ -150,8 +155,12 @@
    1.43  
    1.44  bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) const
    1.45  {
    1.46 -#if SOURCE_ENGINE == SE_CSGO
    1.47 +#ifdef USE_PROTOBUF_USERMESSAGES
    1.48 +#if SOURCE_ENGINE == SE_DOTA
    1.49 +	const char *pszName = g_DotaUsermessageHelpers.GetName(msgid);
    1.50 +#elif SOURCE_ENGINE == SE_CSGO
    1.51  	const char *pszName = g_Cstrike15UsermessageHelpers.GetName(msgid);
    1.52 +#endif
    1.53  	if (!pszName)
    1.54  		return false;
    1.55  
    1.56 @@ -259,7 +268,7 @@
    1.57  	if (m_CurFlags & USERMSG_BLOCKHOOKS)
    1.58  	{
    1.59  		// direct message creation, return buffer "from engine". keep track
    1.60 -		m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
    1.61 +		m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
    1.62  		buffer = m_FakeEngineBuffer;
    1.63  	} else {
    1.64  		char messageName[32];
    1.65 @@ -274,12 +283,12 @@
    1.66  		{
    1.67  		case MRES_IGNORED:
    1.68  		case MRES_HANDLED:
    1.69 -			m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
    1.70 +			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
    1.71  			buffer = m_FakeEngineBuffer;
    1.72  			break;		
    1.73  
    1.74  		case MRES_OVERRIDE:
    1.75 -			m_FakeEngineBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_id)->New();
    1.76 +			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
    1.77  		// fallthrough
    1.78  		case MRES_SUPERCEDE:
    1.79  			buffer = msg;
    1.80 @@ -300,7 +309,7 @@
    1.81  		return false;
    1.82  	}
    1.83  
    1.84 -#if SOURCE_ENGINE == SE_CSGO
    1.85 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
    1.86  	if (m_CurFlags & USERMSG_BLOCKHOOKS)
    1.87  	{
    1.88  		ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(m_CellRecFilter), m_CurId, *m_FakeEngineBuffer);
    1.89 @@ -330,7 +339,7 @@
    1.90  	} else {
    1.91  		engine->MessageEnd();
    1.92  	}
    1.93 -#endif // SE_CSGO
    1.94 +#endif // SE_CSGO || SE_DOTA
    1.95  
    1.96  	m_InExec = false;
    1.97  	m_CurFlags = 0;
    1.98 @@ -415,7 +424,7 @@
    1.99  
   1.100  	if (!m_HookCount++)
   1.101  	{
   1.102 -#if SOURCE_ENGINE == SE_CSGO
   1.103 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.104  		SH_ADD_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
   1.105  		SH_ADD_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
   1.106  #else
   1.107 @@ -437,6 +446,17 @@
   1.108  }
   1.109  
   1.110  #ifdef USE_PROTOBUF_USERMESSAGES
   1.111 +const protobuf::Message *GetMessagePrototype(int msg_type)
   1.112 +{
   1.113 +#if SOURCE_ENGINE == SE_DOTA
   1.114 +	return g_DotaUsermessageHelpers.GetPrototype(msg_type);
   1.115 +#elif SOURCE_ENGINE == SE_CSGO
   1.116 +	return g_Cstrike15UsermessageHelpers.GetPrototype(msg_type);
   1.117 +#endif
   1.118 +}
   1.119 +#endif
   1.120 +
   1.121 +#ifdef USE_PROTOBUF_USERMESSAGES
   1.122  bool UserMessages::InternalUnhook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew)
   1.123  #else
   1.124  bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
   1.125 @@ -481,7 +501,7 @@
   1.126  {
   1.127  	if (--m_HookCount == 0)
   1.128  	{
   1.129 -#if SOURCE_ENGINE == SE_CSGO
   1.130 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.131  		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
   1.132  		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
   1.133  #else
   1.134 @@ -493,10 +513,14 @@
   1.135  	}
   1.136  }
   1.137  
   1.138 -#if SOURCE_ENGINE == SE_CSGO
   1.139 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.140  void UserMessages::OnSendUserMessage_Pre(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
   1.141  {
   1.142 +#if SOURCE_ENGINE == SE_DOTA
   1.143 +	OnStartMessage_Pre(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
   1.144 +#elif SOURCE_ENGINE == SE_CSGO
   1.145  	OnStartMessage_Pre(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
   1.146 +#endif
   1.147  	if (m_FakeMetaRes == MRES_SUPERCEDE)
   1.148  	{
   1.149  		int size = msg.ByteSize();
   1.150 @@ -509,7 +533,11 @@
   1.151  		m_FakeEngineBuffer = &const_cast<protobuf::Message &>(msg);
   1.152  	}
   1.153  
   1.154 +#if SOURCE_ENGINE == SE_DOTA
   1.155 +	OnStartMessage_Post(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
   1.156 +#elif SOURCE_ENGINE == SE_CSGO
   1.157  	OnStartMessage_Post(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
   1.158 +#endif
   1.159  
   1.160  	OnMessageEnd_Pre();
   1.161  	if (m_FakeMetaRes == MRES_SUPERCEDE)
   1.162 @@ -541,7 +569,7 @@
   1.163  	RETURN_META(res)
   1.164  #endif
   1.165  
   1.166 -#if SOURCE_ENGINE == SE_CSGO
   1.167 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.168  protobuf::Message *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
   1.169  #elif SOURCE_ENGINE >= SE_LEFT4DEAD
   1.170  bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
   1.171 @@ -569,7 +597,8 @@
   1.172  #ifdef USE_PROTOBUF_USERMESSAGES
   1.173  		if (m_InterceptBuffer)
   1.174  			delete m_InterceptBuffer;
   1.175 -		m_InterceptBuffer = g_Cstrike15UsermessageHelpers.GetPrototype(msg_type)->New();
   1.176 +		m_InterceptBuffer = GetMessagePrototype(msg_type)->New();
   1.177 +
   1.178  		UM_RETURN_META_VALUE(MRES_SUPERCEDE, m_InterceptBuffer);
   1.179  #else
   1.180  		m_InterceptBuffer.Reset();
   1.181 @@ -580,7 +609,7 @@
   1.182  	UM_RETURN_META_VALUE(MRES_IGNORED, NULL);
   1.183  }
   1.184  
   1.185 -#if SOURCE_ENGINE == SE_CSGO
   1.186 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.187  protobuf::Message *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
   1.188  #elif SOURCE_ENGINE >= SE_LEFT4DEAD
   1.189  bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
   1.190 @@ -745,7 +774,7 @@
   1.191  
   1.192  	if (!handled && intercepted)
   1.193  	{
   1.194 -#if SOURCE_ENGINE == SE_CSGO
   1.195 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.196  		ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer);
   1.197  #else
   1.198  		bf_write *engine_bfw;
   1.199 @@ -757,15 +786,16 @@
   1.200  		m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
   1.201  		engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
   1.202  		ENGINE_CALL(MessageEnd)();
   1.203 -#endif // SE_CSGO
   1.204 +#endif // SE_CSGO || SE_DOTA
   1.205  	}
   1.206  
   1.207  	{
   1.208 -#if SOURCE_ENGINE == SE_CSGO
   1.209 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.210  		int size = m_OrigBuffer->ByteSize();
   1.211  		uint8 *data = (uint8 *)stackalloc(size);
   1.212  		m_OrigBuffer->SerializePartialToArray(data, size);
   1.213 -		protobuf::Message *pTempMsg = g_Cstrike15UsermessageHelpers.GetPrototype(m_CurId)->New();
   1.214 +
   1.215 +		protobuf::Message *pTempMsg = GetMessagePrototype(m_CurId)->New();
   1.216  		pTempMsg->ParsePartialFromArray(data, size);
   1.217  #else
   1.218  		bf_write *pTempMsg = m_OrigBuffer;
   1.219 @@ -790,7 +820,7 @@
   1.220  			iter++;
   1.221  		}
   1.222  
   1.223 -#if SOURCE_ENGINE == SE_CSGO
   1.224 +#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
   1.225  		delete pTempMsg;
   1.226  #endif
   1.227  	}