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 }