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