コード例 #1
0
ファイル: UserMessages.cpp プロジェクト: 50Wliu/sourcemod
void UserMessages::OnSendUserMessage_Pre(IRecipientFilter &filter, int msg_type, const protobuf::Message &msg)
{
#if SOURCE_ENGINE == SE_DOTA
	OnStartMessage_Pre(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
#elif SOURCE_ENGINE == SE_CSGO
	OnStartMessage_Pre(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
#endif
	if (m_FakeMetaRes == MRES_SUPERCEDE)
	{
		int size = msg.ByteSize();
		uint8 *data = (uint8 *)stackalloc(size);
		msg.SerializePartialToArray(data, size);
		m_InterceptBuffer->ParsePartialFromArray(data, size);
	}
	else
	{
		m_FakeEngineBuffer = &const_cast<protobuf::Message &>(msg);
	}

#if SOURCE_ENGINE == SE_DOTA
	OnStartMessage_Post(&filter, msg_type, g_DotaUsermessageHelpers.GetName(msg_type));
#elif SOURCE_ENGINE == SE_CSGO
	OnStartMessage_Post(&filter, msg_type, g_Cstrike15UsermessageHelpers.GetName(msg_type));
#endif

	OnMessageEnd_Pre();
	if (m_FakeMetaRes == MRES_SUPERCEDE)
		RETURN_META(MRES_SUPERCEDE);

	RETURN_META(MRES_IGNORED);
}
コード例 #2
0
google::protobuf::Message *UserMessages::StartProtobufMessage(int msg_id, const cell_t players[], unsigned int playersNum, int flags)
{
#ifndef USE_PROTOBUF_USERMESSAGES
	return NULL;
#else
	protobuf::Message *buffer;

	if (m_InExec || m_InHook)
	{
		return NULL;
	}
	if (msg_id < 0 || msg_id >= 255)
	{
		return NULL;
	}

	m_CurId = msg_id;
	m_CellRecFilter.Initialize(players, playersNum);

	m_CurFlags = flags;
	if (m_CurFlags & USERMSG_INITMSG)
	{
		m_CellRecFilter.SetToInit(true);
	}
	if (m_CurFlags & USERMSG_RELIABLE)
	{
		m_CellRecFilter.SetToReliable(true);
	}

	m_InExec = true;

	if (m_CurFlags & USERMSG_BLOCKHOOKS)
	{
		// direct message creation, return buffer "from engine". keep track
		m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
		buffer = m_FakeEngineBuffer;
	} else {
		char messageName[32];
		if (!GetMessageName(msg_id, messageName, sizeof(messageName)))
		{
			m_InExec = false;
			return NULL;
		}

		protobuf::Message *msg = OnStartMessage_Pre(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
		switch (m_FakeMetaRes)
		{
		case MRES_IGNORED:
		case MRES_HANDLED:
			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
			buffer = m_FakeEngineBuffer;
			break;		

		case MRES_OVERRIDE:
			m_FakeEngineBuffer = GetMessagePrototype(msg_id)->New();
		// fallthrough
		case MRES_SUPERCEDE:
			buffer = msg;
			break;
		}
		
		OnStartMessage_Post(static_cast<IRecipientFilter *>(&m_CellRecFilter), msg_id, messageName);
	}

	return buffer;
#endif // USE_PROTOBUF_USERMESSAGES
}