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); }
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 }