core/UserMessages.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Tue Mar 19 11:19:38 2013 -0400 (2013-03-19)
changeset 3855 d8ba5eddf543
parent 3819 d17aed3d46bf
child 3861 2b9cad31c7c1
permissions -rw-r--r--
Updated protobuf and usermessage support for Dota 2 (bug 5656, r=asherkin).
dvander@592
     1
/**
ds@653
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1231
     4
 * SourceMod
ds@3099
     5
 * Copyright (C) 2004-2010 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
ds@653
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@1231
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1231
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1231
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
ds@653
    28
 *
ds@653
    29
 * Version: $Id$
ds@653
    30
 */
dvander@592
    31
dvander@592
    32
#include "UserMessages.h"
ds@765
    33
#include "sm_stringutil.h"
dvander@592
    34
skamonkey@3855
    35
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
    36
#include <dota_usermessage_helpers.h>
skamonkey@3855
    37
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
    38
#include <cstrike15_usermessage_helpers.h>
skamonkey@3743
    39
#endif
skamonkey@3743
    40
dvander@616
    41
UserMessages g_UserMsgs;
dvander@592
    42
skamonkey@3855
    43
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
    44
SH_DECL_HOOK3_void(IVEngineServer, SendUserMessage, SH_NOATTRIB, 0, IRecipientFilter &, int, const protobuf::Message &);
skamonkey@3743
    45
#else
ds@3099
    46
#if SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
    47
SH_DECL_HOOK3(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int, const char *);
ds@2400
    48
#else
dvander@592
    49
SH_DECL_HOOK2(IVEngineServer, UserMessageBegin, SH_NOATTRIB, 0, bf_write *, IRecipientFilter *, int);
ds@2400
    50
#endif
dvander@592
    51
SH_DECL_HOOK0_void(IVEngineServer, MessageEnd, SH_NOATTRIB, 0);
skamonkey@3743
    52
#endif // ==SE_CSGO
dvander@592
    53
skamonkey@3743
    54
UserMessages::UserMessages()
skamonkey@3743
    55
#ifndef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
    56
	: m_InterceptBuffer(m_pBase, 2500)
dvander@592
    57
{
dvander@592
    58
	m_Names = sm_trie_create();
skamonkey@3743
    59
#else
skamonkey@3743
    60
	: m_InterceptBuffer(NULL)
skamonkey@3743
    61
{
skamonkey@3743
    62
#endif
dvander@592
    63
	m_HookCount = 0;
dvander@592
    64
	m_InExec = false;
dvander@592
    65
	m_InHook = false;
dvander@592
    66
	m_CurFlags = 0;
dvander@592
    67
	m_CurId = INVALID_MESSAGE_ID;
dvander@592
    68
}
dvander@592
    69
dvander@616
    70
UserMessages::~UserMessages()
dvander@592
    71
{
skamonkey@3743
    72
#ifndef USE_PROTOBUF_USERMESSAGES
dvander@592
    73
	sm_trie_destroy(m_Names);
skamonkey@3743
    74
#endif
faluco@641
    75
faluco@641
    76
	CStack<ListenerInfo *>::iterator iter;
faluco@641
    77
	for (iter=m_FreeListeners.begin(); iter!=m_FreeListeners.end(); iter++)
faluco@641
    78
	{
faluco@641
    79
		delete (*iter);
faluco@641
    80
	}
faluco@641
    81
	m_FreeListeners.popall();
dvander@592
    82
}
dvander@592
    83
ds@765
    84
void UserMessages::OnSourceModStartup(bool late)
ds@765
    85
{
skamonkey@3743
    86
#ifndef USE_PROTOBUF_USERMESSAGES
ds@765
    87
	/* -1 means SourceMM was unable to get the user message list */
ds@765
    88
	m_FallbackSearch = (g_SMAPI->GetUserMessageCount() == -1);
skamonkey@3743
    89
#endif
ds@765
    90
}
ds@765
    91
dvander@616
    92
void UserMessages::OnSourceModAllInitialized()
dvander@592
    93
{
dvander@592
    94
	g_ShareSys.AddInterface(NULL, this);
dvander@592
    95
}
dvander@592
    96
dvander@616
    97
void UserMessages::OnSourceModAllShutdown()
dvander@592
    98
{
dvander@592
    99
	if (m_HookCount)
dvander@592
   100
	{
skamonkey@3855
   101
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
kyle@3819
   102
		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
kyle@3819
   103
		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
skamonkey@3743
   104
#else
kyle@3819
   105
		SH_REMOVE_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Pre), false);
kyle@3819
   106
		SH_REMOVE_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Post), true);
kyle@3819
   107
		SH_REMOVE_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Pre), false);
kyle@3819
   108
		SH_REMOVE_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Post), true);
skamonkey@3743
   109
#endif
dvander@592
   110
	}
dvander@592
   111
	m_HookCount = 0;
dvander@592
   112
}
dvander@592
   113
dvander@616
   114
int UserMessages::GetMessageIndex(const char *msg)
dvander@592
   115
{
skamonkey@3855
   116
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   117
	// Can split this per engine and/or game later
skamonkey@3855
   118
	return g_DotaUsermessageHelpers.GetIndex(msg);
skamonkey@3855
   119
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
   120
	// Can split this per engine and/or game later
skamonkey@3743
   121
	return g_Cstrike15UsermessageHelpers.GetIndex(msg);
skamonkey@3743
   122
#else
dvander@592
   123
	int msgid;
ds@698
   124
dvander@592
   125
	if (!sm_trie_retrieve(m_Names, msg, reinterpret_cast<void **>(&msgid)))
dvander@592
   126
	{
ds@765
   127
		if (m_FallbackSearch)
ds@765
   128
		{
ds@765
   129
			char msgbuf[64];
ds@765
   130
			int size;
ds@765
   131
			msgid = 0;
ds@765
   132
ds@765
   133
			while (gamedll->GetUserMessageInfo(msgid, msgbuf, sizeof(msgbuf), size))
ds@765
   134
			{
ds@765
   135
				if (strcmp(msgbuf, msg) == 0)
ds@765
   136
				{
ds@765
   137
					sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
ds@765
   138
					return msgid;
ds@765
   139
				}
ds@765
   140
				msgid++;
ds@765
   141
			}
ds@765
   142
		}
ds@765
   143
ds@698
   144
		msgid = g_SMAPI->FindUserMessage(msg);
dvander@592
   145
ds@698
   146
		if (msgid != INVALID_MESSAGE_ID)
dvander@592
   147
		{
ds@698
   148
			sm_trie_insert(m_Names, msg, reinterpret_cast<void *>(msgid));
dvander@592
   149
		}
dvander@592
   150
	}
dvander@592
   151
dvander@592
   152
	return msgid;
skamonkey@3743
   153
#endif
dvander@592
   154
}
dvander@592
   155
ds@765
   156
bool UserMessages::GetMessageName(int msgid, char *buffer, size_t maxlength) const
ds@765
   157
{
skamonkey@3855
   158
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3855
   159
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   160
	const char *pszName = g_DotaUsermessageHelpers.GetName(msgid);
skamonkey@3855
   161
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
   162
	const char *pszName = g_Cstrike15UsermessageHelpers.GetName(msgid);
skamonkey@3855
   163
#endif
skamonkey@3743
   164
	if (!pszName)
skamonkey@3743
   165
		return false;
skamonkey@3743
   166
skamonkey@3743
   167
	strncopy(buffer, pszName, maxlength);
skamonkey@3743
   168
	return true;
skamonkey@3743
   169
#else
ds@765
   170
	if (m_FallbackSearch)
ds@765
   171
	{
ds@765
   172
		int size;
ds@765
   173
		return gamedll->GetUserMessageInfo(msgid, buffer, maxlength, size);
ds@765
   174
	}
ds@766
   175
ds@765
   176
	const char *msg = g_SMAPI->GetUserMessage(msgid);
ds@765
   177
ds@765
   178
	if (msg)
ds@765
   179
	{
ds@765
   180
		strncopy(buffer, msg, maxlength);
ds@765
   181
		return true;
ds@765
   182
	}
ds@765
   183
ds@765
   184
	return false;
skamonkey@3743
   185
#endif
ds@765
   186
}
ds@765
   187
skamonkey@3743
   188
bf_write *UserMessages::StartBitBufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags)
dvander@592
   189
{
skamonkey@3743
   190
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   191
	return NULL;
skamonkey@3743
   192
#else
dvander@592
   193
	bf_write *buffer;
faluco@593
   194
faluco@593
   195
	if (m_InExec || m_InHook)
dvander@592
   196
	{
dvander@592
   197
		return NULL;
dvander@592
   198
	}
dvander@592
   199
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   200
	{
dvander@592
   201
		return NULL;
dvander@592
   202
	}
dvander@592
   203
faluco@593
   204
	m_CellRecFilter.Initialize(players, playersNum);
dvander@592
   205
dvander@592
   206
	m_CurFlags = flags;
dvander@592
   207
	if (m_CurFlags & USERMSG_INITMSG)
dvander@592
   208
	{
faluco@593
   209
		m_CellRecFilter.SetToInit(true);
dvander@592
   210
	}
dvander@592
   211
	if (m_CurFlags & USERMSG_RELIABLE)
dvander@592
   212
	{
faluco@593
   213
		m_CellRecFilter.SetToReliable(true);
dvander@592
   214
	}
dvander@592
   215
dvander@592
   216
	m_InExec = true;
dvander@592
   217
faluco@1250
   218
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
dvander@592
   219
	{
ds@3099
   220
#if SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
   221
		buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id));
ds@2400
   222
#else
faluco@1250
   223
		buffer = ENGINE_CALL(UserMessageBegin)(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
ds@2400
   224
#endif
faluco@1250
   225
	} else {
ds@3099
   226
#if SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
   227
		buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, g_SMAPI->GetUserMessage(msg_id));
ds@2400
   228
#else
dvander@592
   229
		buffer = engine->UserMessageBegin(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id);
ds@2400
   230
#endif
dvander@592
   231
	}
dvander@592
   232
dvander@592
   233
	return buffer;
skamonkey@3743
   234
#endif // USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   235
}
skamonkey@3743
   236
skamonkey@3743
   237
google::protobuf::Message *UserMessages::StartProtobufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags)
skamonkey@3743
   238
{
skamonkey@3743
   239
#ifndef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   240
	return NULL;
skamonkey@3743
   241
#else
skamonkey@3743
   242
	protobuf::Message *buffer;
skamonkey@3743
   243
skamonkey@3743
   244
	if (m_InExec || m_InHook)
skamonkey@3743
   245
	{
skamonkey@3743
   246
		return NULL;
skamonkey@3743
   247
	}
skamonkey@3743
   248
	if (msg_id < 0 || msg_id >= 255)
skamonkey@3743
   249
	{
skamonkey@3743
   250
		return NULL;
skamonkey@3743
   251
	}
skamonkey@3743
   252
skamonkey@3743
   253
	m_CurId = msg_id;
skamonkey@3743
   254
	m_CellRecFilter.Initialize(players, playersNum);
skamonkey@3743
   255
skamonkey@3743
   256
	m_CurFlags = flags;
skamonkey@3743
   257
	if (m_CurFlags & USERMSG_INITMSG)
skamonkey@3743
   258
	{
skamonkey@3743
   259
		m_CellRecFilter.SetToInit(true);
skamonkey@3743
   260
	}
skamonkey@3743
   261
	if (m_CurFlags & USERMSG_RELIABLE)
skamonkey@3743
   262
	{
skamonkey@3743
   263
		m_CellRecFilter.SetToReliable(true);
skamonkey@3743
   264
	}
skamonkey@3743
   265
skamonkey@3743
   266
	m_InExec = true;
skamonkey@3743
   267
skamonkey@3743
   268
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
skamonkey@3743
   269
	{
skamonkey@3743
   270
		// direct message creation, return buffer "from engine". keep track
skamonkey@3855
   271
		m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
skamonkey@3743
   272
		buffer = m_FakeEngineBuffer;
skamonkey@3743
   273
	} else {
skamonkey@3757
   274
		char messageName[32];
skamonkey@3757
   275
		if (!GetMessageName(msg_id, messageName, sizeof(messageName)))
skamonkey@3757
   276
		{
skamonkey@3757
   277
			m_InExec = false;
skamonkey@3757
   278
			return NULL;
skamonkey@3757
   279
		}
skamonkey@3757
   280
skamonkey@3757
   281
		protobuf::Message *msg = OnStartMessage_Pre(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
skamonkey@3743
   282
		switch (m_FakeMetaRes)
skamonkey@3743
   283
		{
skamonkey@3743
   284
		case MRES_IGNORED:
skamonkey@3743
   285
		case MRES_HANDLED:
skamonkey@3855
   286
			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
skamonkey@3743
   287
			buffer = m_FakeEngineBuffer;
skamonkey@3743
   288
			break;		
skamonkey@3743
   289
skamonkey@3743
   290
		case MRES_OVERRIDE:
skamonkey@3855
   291
			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
skamonkey@3743
   292
		// fallthrough
skamonkey@3743
   293
		case MRES_SUPERCEDE:
skamonkey@3743
   294
			buffer = msg;
skamonkey@3743
   295
			break;
skamonkey@3743
   296
		}
skamonkey@3743
   297
		
skamonkey@3757
   298
		OnStartMessage_Post(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
skamonkey@3743
   299
	}
skamonkey@3743
   300
skamonkey@3743
   301
	return buffer;
skamonkey@3743
   302
#endif // USE_PROTOBUF_USERMESSAGES
dvander@592
   303
}
dvander@592
   304
dvander@616
   305
bool UserMessages::EndMessage()
dvander@592
   306
{
dvander@592
   307
	if (!m_InExec)
dvander@592
   308
	{
dvander@592
   309
		return false;
dvander@592
   310
	}
dvander@592
   311
skamonkey@3855
   312
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
   313
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
skamonkey@3743
   314
	{
skamonkey@3743
   315
		ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(m_CellRecFilter), m_CurId, *m_FakeEngineBuffer);
skamonkey@3743
   316
		delete m_FakeEngineBuffer;
skamonkey@3743
   317
		m_FakeEngineBuffer = NULL;
skamonkey@3743
   318
	} else {
skamonkey@3743
   319
		OnMessageEnd_Pre();
skamonkey@3743
   320
skamonkey@3743
   321
		switch (m_FakeMetaRes)
skamonkey@3743
   322
		{
skamonkey@3743
   323
		case MRES_IGNORED:
skamonkey@3743
   324
		case MRES_HANDLED:
skamonkey@3743
   325
		case MRES_OVERRIDE:
skamonkey@3743
   326
			engine->SendUserMessage(static_cast<IRecipientFilter &>(m_CellRecFilter), m_CurId, *m_FakeEngineBuffer);
skamonkey@3743
   327
			delete m_FakeEngineBuffer;
skamonkey@3743
   328
			m_FakeEngineBuffer = NULL;
skamonkey@3743
   329
			break;
skamonkey@3743
   330
		//case MRES_SUPERCEDE:
skamonkey@3743
   331
		}
skamonkey@3743
   332
skamonkey@3743
   333
		OnMessageEnd_Post();
skamonkey@3743
   334
	}
skamonkey@3743
   335
#else
faluco@1250
   336
	if (m_CurFlags & USERMSG_BLOCKHOOKS)
dvander@592
   337
	{
faluco@1250
   338
		ENGINE_CALL(MessageEnd)();
faluco@1250
   339
	} else {
dvander@592
   340
		engine->MessageEnd();
dvander@592
   341
	}
skamonkey@3855
   342
#endif // SE_CSGO || SE_DOTA
dvander@592
   343
dvander@592
   344
	m_InExec = false;
dvander@592
   345
	m_CurFlags = 0;
faluco@593
   346
	m_CellRecFilter.Reset();
dvander@592
   347
dvander@592
   348
	return true;
dvander@592
   349
}
dvander@592
   350
skamonkey@3743
   351
UserMessageType UserMessages::GetUserMessageType() const
skamonkey@3743
   352
{
skamonkey@3743
   353
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   354
	return UM_Protobuf;
skamonkey@3743
   355
#else
skamonkey@3743
   356
	return UM_BitBuf;
skamonkey@3743
   357
#endif
skamonkey@3743
   358
}
skamonkey@3743
   359
dvander@2636
   360
bool UserMessages::HookUserMessage2(int msg_id,
dvander@2636
   361
									IUserMessageListener *pListener,
dvander@2636
   362
									bool intercept)
dvander@2636
   363
{
skamonkey@3743
   364
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   365
	return InternalHook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, true);
skamonkey@3743
   366
#else
skamonkey@3743
   367
	return InternalHook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, true);
skamonkey@3743
   368
#endif
dvander@2636
   369
}
dvander@2636
   370
dvander@2636
   371
bool UserMessages::UnhookUserMessage2(int msg_id,
dvander@2636
   372
									  IUserMessageListener *pListener,
dvander@2636
   373
									  bool intercept)
dvander@2636
   374
{
skamonkey@3743
   375
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   376
	return InternalUnhook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, true);
skamonkey@3743
   377
#else
skamonkey@3743
   378
	return InternalUnhook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, true);
skamonkey@3743
   379
#endif
dvander@2636
   380
}
dvander@2636
   381
dvander@616
   382
bool UserMessages::HookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
dvander@592
   383
{
skamonkey@3743
   384
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   385
	return InternalHook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, false);
skamonkey@3743
   386
#else
skamonkey@3743
   387
	return InternalHook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, false);
skamonkey@3743
   388
#endif
dvander@2636
   389
}
dvander@2636
   390
dvander@2636
   391
bool UserMessages::UnhookUserMessage(int msg_id, IUserMessageListener *pListener, bool intercept)
dvander@2636
   392
{	
skamonkey@3743
   393
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   394
	return InternalUnhook(msg_id, (IProtobufUserMessageListener *)pListener, intercept, false);
skamonkey@3743
   395
#else
skamonkey@3743
   396
	return InternalUnhook(msg_id, (IBitBufUserMessageListener *)pListener, intercept, false);
skamonkey@3743
   397
#endif
dvander@2636
   398
}
dvander@2636
   399
skamonkey@3743
   400
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   401
bool UserMessages::InternalHook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew)
skamonkey@3743
   402
#else
skamonkey@3743
   403
bool UserMessages::InternalHook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
skamonkey@3743
   404
#endif
dvander@2636
   405
{
dvander@592
   406
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   407
	{
dvander@592
   408
		return false;
dvander@592
   409
	}
dvander@592
   410
faluco@593
   411
	ListenerInfo *pInfo;
faluco@593
   412
	if (m_FreeListeners.empty())
faluco@593
   413
	{
faluco@593
   414
		pInfo = new ListenerInfo;
faluco@593
   415
	} else {
faluco@593
   416
		pInfo = m_FreeListeners.front();
faluco@593
   417
		m_FreeListeners.pop();
faluco@593
   418
	}
faluco@593
   419
faluco@593
   420
	pInfo->Callback = pListener;
faluco@593
   421
	pInfo->IsHooked = false;
faluco@593
   422
	pInfo->KillMe = false;
dvander@2636
   423
	pInfo->IsNew = isNew;
faluco@593
   424
dvander@592
   425
	if (!m_HookCount++)
dvander@592
   426
	{
skamonkey@3855
   427
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
kyle@3819
   428
		SH_ADD_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
kyle@3819
   429
		SH_ADD_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
skamonkey@3743
   430
#else
kyle@3819
   431
		SH_ADD_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Pre), false);
kyle@3819
   432
		SH_ADD_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Post), true);
kyle@3819
   433
		SH_ADD_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Pre), false);
kyle@3819
   434
		SH_ADD_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Post), true);
skamonkey@3743
   435
#endif
dvander@592
   436
	}
dvander@592
   437
dvander@592
   438
	if (intercept)
dvander@592
   439
	{
faluco@593
   440
		m_msgIntercepts[msg_id].push_back(pInfo);
dvander@592
   441
	} else {
faluco@593
   442
		m_msgHooks[msg_id].push_back(pInfo);
dvander@592
   443
	}
dvander@592
   444
dvander@592
   445
	return true;
dvander@592
   446
}
dvander@592
   447
skamonkey@3743
   448
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3855
   449
const protobuf::Message *GetMessagePrototype(int msg_type)
skamonkey@3855
   450
{
skamonkey@3855
   451
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   452
	return g_DotaUsermessageHelpers.GetPrototype(msg_type);
skamonkey@3855
   453
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3855
   454
	return g_Cstrike15UsermessageHelpers.GetPrototype(msg_type);
skamonkey@3855
   455
#endif
skamonkey@3855
   456
}
skamonkey@3855
   457
#endif
skamonkey@3855
   458
skamonkey@3855
   459
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   460
bool UserMessages::InternalUnhook(int msg_id, IProtobufUserMessageListener *pListener, bool intercept, bool isNew)
skamonkey@3743
   461
#else
skamonkey@3743
   462
bool UserMessages::InternalUnhook(int msg_id, IBitBufUserMessageListener *pListener, bool intercept, bool isNew)
skamonkey@3743
   463
#endif
dvander@2636
   464
{
faluco@593
   465
	MsgList *pList;
dvander@592
   466
	MsgIter iter;
faluco@593
   467
	ListenerInfo *pInfo;
dvander@592
   468
	bool deleted = false;
dvander@592
   469
dvander@592
   470
	if (msg_id < 0 || msg_id >= 255)
dvander@592
   471
	{
dvander@592
   472
		return false;
dvander@592
   473
	}
dvander@592
   474
faluco@593
   475
	pList = (intercept) ? &m_msgIntercepts[msg_id] : &m_msgHooks[msg_id];
faluco@593
   476
	for (iter=pList->begin(); iter!=pList->end(); iter++)
dvander@592
   477
	{
faluco@593
   478
		pInfo = (*iter);
dvander@2636
   479
		if (pInfo->Callback == pListener && pInfo->IsNew == isNew)
dvander@592
   480
		{
faluco@593
   481
			if (pInfo->IsHooked)
faluco@593
   482
			{
faluco@593
   483
				pInfo->KillMe = true;
faluco@593
   484
				return true;
faluco@593
   485
			}
faluco@593
   486
			pList->erase(iter);
dvander@592
   487
			deleted = true;
dvander@592
   488
			break;
dvander@592
   489
		}
dvander@592
   490
	}
dvander@592
   491
faluco@593
   492
	if (deleted)
faluco@593
   493
	{
faluco@593
   494
		_DecRefCounter();
faluco@593
   495
	}
faluco@593
   496
faluco@593
   497
	return deleted;
faluco@593
   498
}
faluco@593
   499
dvander@616
   500
void UserMessages::_DecRefCounter()
faluco@593
   501
{
faluco@593
   502
	if (--m_HookCount == 0)
dvander@592
   503
	{
skamonkey@3855
   504
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
kyle@3819
   505
		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Pre), false);
kyle@3819
   506
		SH_REMOVE_HOOK(IVEngineServer, SendUserMessage, engine, SH_MEMBER(this, &UserMessages::OnSendUserMessage_Post), true);
skamonkey@3743
   507
#else
kyle@3819
   508
		SH_REMOVE_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Pre), false);
kyle@3819
   509
		SH_REMOVE_HOOK(IVEngineServer, UserMessageBegin, engine, SH_MEMBER(this, &UserMessages::OnStartMessage_Post), true);
kyle@3819
   510
		SH_REMOVE_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Pre), false);
kyle@3819
   511
		SH_REMOVE_HOOK(IVEngineServer, MessageEnd, engine, SH_MEMBER(this, &UserMessages::OnMessageEnd_Post), true);
skamonkey@3743
   512
#endif
dvander@592
   513
	}
dvander@592
   514
}
dvander@592
   515
skamonkey@3855
   516
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
   517
void UserMessages::OnSendUserMessage_Pre(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
skamonkey@3743
   518
{
skamonkey@3855
   519
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   520
	OnStartMessage_Pre(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
skamonkey@3855
   521
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3743
   522
	OnStartMessage_Pre(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
skamonkey@3855
   523
#endif
skamonkey@3743
   524
	if (m_FakeMetaRes == MRES_SUPERCEDE)
skamonkey@3743
   525
	{
skamonkey@3778
   526
		int size = msg.ByteSize();
skamonkey@3778
   527
		uint8 *data = (uint8 *)stackalloc(size);
skamonkey@3778
   528
		msg.SerializePartialToArray(data, size);
skamonkey@3786
   529
		m_InterceptBuffer->ParsePartialFromArray(data, size);
skamonkey@3743
   530
	}
skamonkey@3743
   531
	else
skamonkey@3743
   532
	{
skamonkey@3759
   533
		m_FakeEngineBuffer = &const_cast<protobuf::Message &>(msg);
skamonkey@3743
   534
	}
skamonkey@3743
   535
skamonkey@3855
   536
#if SOURCE_ENGINE == SE_DOTA
skamonkey@3855
   537
	OnStartMessage_Post(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
skamonkey@3855
   538
#elif SOURCE_ENGINE == SE_CSGO
skamonkey@3786
   539
	OnStartMessage_Post(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
skamonkey@3855
   540
#endif
skamonkey@3786
   541
skamonkey@3743
   542
	OnMessageEnd_Pre();
skamonkey@3743
   543
	if (m_FakeMetaRes == MRES_SUPERCEDE)
skamonkey@3743
   544
		RETURN_META(MRES_SUPERCEDE);
skamonkey@3743
   545
skamonkey@3743
   546
	RETURN_META(MRES_IGNORED);
skamonkey@3743
   547
}
skamonkey@3743
   548
skamonkey@3743
   549
void UserMessages::OnSendUserMessage_Post(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
skamonkey@3743
   550
{
skamonkey@3743
   551
	OnMessageEnd_Post();
skamonkey@3743
   552
	RETURN_META(MRES_IGNORED);
skamonkey@3743
   553
}
skamonkey@3743
   554
#endif
skamonkey@3743
   555
skamonkey@3743
   556
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   557
#define UM_RETURN_META_VALUE(res, val) \
skamonkey@3743
   558
	m_FakeMetaRes = res;               \
skamonkey@3743
   559
	return val;
skamonkey@3743
   560
skamonkey@3743
   561
#define UM_RETURN_META(res)            \
skamonkey@3743
   562
	m_FakeMetaRes = res;               \
skamonkey@3743
   563
	return;
skamonkey@3743
   564
#else
skamonkey@3743
   565
#define UM_RETURN_META_VALUE(res, val) \
skamonkey@3743
   566
	RETURN_META_VALUE(res, val)
skamonkey@3743
   567
skamonkey@3743
   568
#define UM_RETURN_META(res)            \
skamonkey@3743
   569
	RETURN_META(res)
skamonkey@3743
   570
#endif
skamonkey@3743
   571
skamonkey@3855
   572
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
   573
protobuf::Message *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
skamonkey@3743
   574
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
   575
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type, const char *msg_name)
ds@2400
   576
#else
dvander@616
   577
bf_write *UserMessages::OnStartMessage_Pre(IRecipientFilter *filter, int msg_type)
ds@2400
   578
#endif
dvander@592
   579
{
dvander@592
   580
	bool is_intercept_empty = m_msgIntercepts[msg_type].empty();
dvander@592
   581
	bool is_hook_empty = m_msgHooks[msg_type].empty();
dvander@592
   582
faluco@593
   583
	if ((is_intercept_empty && is_hook_empty)
faluco@1250
   584
		|| (m_InExec && (m_CurFlags & USERMSG_BLOCKHOOKS)))
dvander@592
   585
	{
dvander@592
   586
		m_InHook = false;
skamonkey@3743
   587
		UM_RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   588
	}
dvander@592
   589
dvander@592
   590
	m_CurId = msg_type;
dvander@592
   591
	m_CurRecFilter = filter;
dvander@592
   592
	m_InHook = true;
faluco@597
   593
	m_BlockEndPost = false;
dvander@592
   594
dvander@592
   595
	if (!is_intercept_empty)
dvander@592
   596
	{
skamonkey@3743
   597
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   598
		if (m_InterceptBuffer)
skamonkey@3743
   599
			delete m_InterceptBuffer;
skamonkey@3855
   600
		m_InterceptBuffer = GetMessagePrototype(msg_type)->New();
skamonkey@3855
   601
skamonkey@3743
   602
		UM_RETURN_META_VALUE(MRES_SUPERCEDE, m_InterceptBuffer);
skamonkey@3743
   603
#else
faluco@593
   604
		m_InterceptBuffer.Reset();
skamonkey@3743
   605
		UM_RETURN_META_VALUE(MRES_SUPERCEDE, &m_InterceptBuffer);
skamonkey@3743
   606
#endif
dvander@592
   607
	}
dvander@592
   608
skamonkey@3743
   609
	UM_RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   610
}
dvander@592
   611
skamonkey@3855
   612
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
   613
protobuf::Message *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
skamonkey@3743
   614
#elif SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
   615
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type, const char *msg_name)
ds@2400
   616
#else
dvander@616
   617
bf_write *UserMessages::OnStartMessage_Post(IRecipientFilter *filter, int msg_type)
ds@2400
   618
#endif
dvander@592
   619
{
dvander@592
   620
	if (!m_InHook)
dvander@592
   621
	{
skamonkey@3743
   622
		UM_RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   623
	}
dvander@592
   624
skamonkey@3743
   625
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3786
   626
	if (m_FakeMetaRes == MRES_SUPERCEDE)
skamonkey@3786
   627
		m_OrigBuffer = m_InterceptBuffer;
skamonkey@3786
   628
	else
skamonkey@3786
   629
		m_OrigBuffer = m_FakeEngineBuffer;
skamonkey@3743
   630
#else
dvander@592
   631
	m_OrigBuffer = META_RESULT_ORIG_RET(bf_write *);
skamonkey@3743
   632
#endif
dvander@592
   633
skamonkey@3743
   634
	UM_RETURN_META_VALUE(MRES_IGNORED, NULL);
dvander@592
   635
}
dvander@592
   636
dvander@616
   637
void UserMessages::OnMessageEnd_Post()
dvander@592
   638
{
dvander@2636
   639
	if (!m_InHook)
dvander@592
   640
	{
skamonkey@3743
   641
		UM_RETURN_META(MRES_IGNORED);
dvander@592
   642
	}
dvander@592
   643
faluco@593
   644
	MsgList *pList;
dvander@592
   645
	MsgIter iter;
faluco@593
   646
	ListenerInfo *pInfo;
faluco@593
   647
pred@2577
   648
	m_InHook = false;
pred@2577
   649
faluco@593
   650
	pList = &m_msgIntercepts[m_CurId];
faluco@593
   651
	for (iter=pList->begin(); iter!=pList->end(); )
faluco@593
   652
	{
faluco@593
   653
		pInfo = (*iter);
dvander@2636
   654
		if (m_BlockEndPost && !pInfo->IsNew)
dvander@2636
   655
		{
dvander@2636
   656
			continue;
dvander@2636
   657
		}
faluco@593
   658
		pInfo->IsHooked = true;
faluco@593
   659
		pInfo->Callback->OnUserMessageSent(m_CurId);
dvander@2636
   660
		if (pInfo->IsNew)
dvander@2636
   661
		{
dvander@2636
   662
			pInfo->Callback->OnPostUserMessage(m_CurId, !m_BlockEndPost);
dvander@2636
   663
		}
dvander@592
   664
faluco@593
   665
		if (pInfo->KillMe)
faluco@593
   666
		{
faluco@593
   667
			iter = pList->erase(iter);
faluco@593
   668
			m_FreeListeners.push(pInfo);
faluco@593
   669
			_DecRefCounter();
faluco@593
   670
			continue;
faluco@593
   671
		}
faluco@593
   672
faluco@593
   673
		pInfo->IsHooked = false;
faluco@593
   674
		iter++;
dvander@592
   675
	}
dvander@592
   676
faluco@593
   677
	pList = &m_msgHooks[m_CurId];
faluco@594
   678
	for (iter=pList->begin(); iter!=pList->end(); )
dvander@592
   679
	{
faluco@593
   680
		pInfo = (*iter);
dvander@2636
   681
		if (m_BlockEndPost && !pInfo->IsNew)
dvander@2636
   682
		{
dvander@2636
   683
			continue;
dvander@2636
   684
		}
faluco@594
   685
		pInfo->IsHooked = true;
faluco@593
   686
		pInfo->Callback->OnUserMessageSent(m_CurId);
dvander@2636
   687
		if (pInfo->IsNew)
dvander@2636
   688
		{
dvander@2636
   689
			pInfo->Callback->OnPostUserMessage(m_CurId, !m_BlockEndPost);
dvander@2636
   690
		}
faluco@593
   691
faluco@593
   692
		if (pInfo->KillMe)
faluco@593
   693
		{
faluco@593
   694
			iter = pList->erase(iter);
faluco@593
   695
			m_FreeListeners.push(pInfo);
faluco@593
   696
			_DecRefCounter();
faluco@593
   697
			continue;
faluco@593
   698
		}
faluco@593
   699
faluco@593
   700
		pInfo->IsHooked = false;
faluco@593
   701
		iter++;
dvander@592
   702
	}
dvander@592
   703
}
dvander@592
   704
dvander@616
   705
void UserMessages::OnMessageEnd_Pre()
dvander@592
   706
{
dvander@592
   707
	if (!m_InHook)
dvander@592
   708
	{
skamonkey@3743
   709
		UM_RETURN_META(MRES_IGNORED);
dvander@592
   710
	}
dvander@592
   711
faluco@593
   712
	MsgList *pList;
dvander@592
   713
	MsgIter iter;
faluco@593
   714
	ListenerInfo *pInfo;
faluco@593
   715
dvander@592
   716
	ResultType res;
dvander@592
   717
	bool intercepted = false;
dvander@592
   718
	bool handled = false;
dvander@592
   719
faluco@593
   720
	pList = &m_msgIntercepts[m_CurId];
faluco@593
   721
	for (iter=pList->begin(); iter!=pList->end(); )
dvander@592
   722
	{
faluco@593
   723
		pInfo = (*iter);
faluco@593
   724
		pInfo->IsHooked = true;
skamonkey@3743
   725
#ifdef USE_PROTOBUF_USERMESSAGES
skamonkey@3743
   726
		res = pInfo->Callback->InterceptUserMessage(m_CurId, m_InterceptBuffer, m_CurRecFilter);
skamonkey@3743
   727
#else
faluco@593
   728
		res = pInfo->Callback->InterceptUserMessage(m_CurId, &m_InterceptBuffer, m_CurRecFilter);
skamonkey@3743
   729
#endif
faluco@593
   730
faluco@597
   731
		intercepted = true;
faluco@597
   732
faluco@593
   733
		switch (res)
dvander@592
   734
		{
faluco@593
   735
		case Pl_Stop:
faluco@593
   736
			{
faluco@593
   737
				if (pInfo->KillMe)
faluco@593
   738
				{
faluco@593
   739
					pList->erase(iter);
faluco@593
   740
					m_FreeListeners.push(pInfo);
faluco@593
   741
					_DecRefCounter();
faluco@593
   742
					goto supercede;
faluco@593
   743
				}
faluco@593
   744
				pInfo->IsHooked = false;
faluco@593
   745
				goto supercede;
faluco@593
   746
			}
faluco@593
   747
		case Pl_Handled:
faluco@593
   748
			{
faluco@593
   749
				handled = true;
faluco@593
   750
				if (pInfo->KillMe)
faluco@593
   751
				{
faluco@593
   752
					iter = pList->erase(iter);
faluco@593
   753
					m_FreeListeners.push(pInfo);
faluco@593
   754
					_DecRefCounter();
faluco@593
   755
					continue;
faluco@593
   756
				}
faluco@593
   757
				break;
faluco@593
   758
			}
faluco@593
   759
		default:
faluco@593
   760
			{
faluco@593
   761
				if (pInfo->KillMe)
faluco@593
   762
				{
faluco@593
   763
					iter = pList->erase(iter);
faluco@593
   764
					m_FreeListeners.push(pInfo);
faluco@593
   765
					_DecRefCounter();
faluco@593
   766
					continue;
faluco@593
   767
				}
faluco@597
   768
				break;
faluco@593
   769
			}
dvander@592
   770
		}
faluco@593
   771
		pInfo->IsHooked = false;
faluco@593
   772
		iter++;
dvander@592
   773
	}
dvander@592
   774
dvander@2734
   775
	if (!handled && intercepted)
dvander@592
   776
	{
skamonkey@3855
   777
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3743
   778
		ENGINE_CALL(SendUserMessage)(static_cast<IRecipientFilter &>(*m_CurRecFilter), m_CurId, *m_InterceptBuffer);
skamonkey@3743
   779
#else
faluco@593
   780
		bf_write *engine_bfw;
ds@3099
   781
#if SOURCE_ENGINE >= SE_LEFT4DEAD
ds@2400
   782
		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId, g_SMAPI->GetUserMessage(m_CurId));
ds@2400
   783
#else
dvander@592
   784
		engine_bfw = ENGINE_CALL(UserMessageBegin)(m_CurRecFilter, m_CurId);
ds@2400
   785
#endif
dvander@592
   786
		m_ReadBuffer.StartReading(m_InterceptBuffer.GetBasePointer(), m_InterceptBuffer.GetNumBytesWritten());
dvander@592
   787
		engine_bfw->WriteBitsFromBuffer(&m_ReadBuffer, m_InterceptBuffer.GetNumBitsWritten());
dvander@592
   788
		ENGINE_CALL(MessageEnd)();
skamonkey@3855
   789
#endif // SE_CSGO || SE_DOTA
dvander@592
   790
	}
dvander@592
   791
dvander@592
   792
	{
skamonkey@3855
   793
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3778
   794
		int size = m_OrigBuffer->ByteSize();
skamonkey@3778
   795
		uint8 *data = (uint8 *)stackalloc(size);
skamonkey@3778
   796
		m_OrigBuffer->SerializePartialToArray(data, size);
skamonkey@3855
   797
skamonkey@3855
   798
		protobuf::Message *pTempMsg = GetMessagePrototype(m_CurId)->New();
skamonkey@3786
   799
		pTempMsg->ParsePartialFromArray(data, size);
skamonkey@3779
   800
#else
skamonkey@3779
   801
		bf_write *pTempMsg = m_OrigBuffer;
skamonkey@3779
   802
#endif
faluco@593
   803
skamonkey@3778
   804
		pList = &m_msgHooks[m_CurId];
skamonkey@3778
   805
		for (iter=pList->begin(); iter!=pList->end(); )
faluco@593
   806
		{
skamonkey@3778
   807
			pInfo = (*iter);
skamonkey@3778
   808
			pInfo->IsHooked = true;
skamonkey@3778
   809
			pInfo->Callback->OnUserMessage(m_CurId, pTempMsg, m_CurRecFilter);
skamonkey@3778
   810
skamonkey@3778
   811
			if (pInfo->KillMe)
skamonkey@3778
   812
			{
skamonkey@3778
   813
				iter = pList->erase(iter);
skamonkey@3778
   814
				m_FreeListeners.push(pInfo);
skamonkey@3778
   815
				_DecRefCounter();
skamonkey@3778
   816
				continue;
skamonkey@3778
   817
			}
skamonkey@3778
   818
skamonkey@3778
   819
			pInfo->IsHooked = false;
skamonkey@3778
   820
			iter++;
faluco@593
   821
		}
faluco@593
   822
skamonkey@3855
   823
#if SOURCE_ENGINE == SE_CSGO || SOURCE_ENGINE == SE_DOTA
skamonkey@3778
   824
		delete pTempMsg;
skamonkey@3779
   825
#endif
dvander@592
   826
	}
dvander@592
   827
skamonkey@3743
   828
	UM_RETURN_META((intercepted) ? MRES_SUPERCEDE : MRES_IGNORED);
dvander@592
   829
supercede:
faluco@597
   830
	m_BlockEndPost = true;
skamonkey@3743
   831
	UM_RETURN_META(MRES_SUPERCEDE);
dvander@592
   832
}