Cyrus Mod Loader
Loading...
Searching...
No Matches
MemoryMessage.h
1#pragma once
2#include "shared.h"
3#include <cstdint>
4#include <unordered_set>
5
8 void *unk; // 0x8
10 uint8_t unk1; // 0x18
11 bool isLastNode; // 0x19
12 uint8_t pad[6]; // 0x1A
13 std::string name; // 0x20
14 uint8_t data; // 0x40 either serviceID or messageID
15};
16
17void traverseMemNodes(MemoryMessageNode *node,
18 std::unordered_set<std::string> &names, uint8_t id) {
19 if (!node || node->isLastNode)
20 return;
21
22 if (node->data == id) {
23 names.insert(node->name);
24 }
25
26 traverseMemNodes(node->leftNode, names, id);
27 traverseMemNodes(node->rightNode, names, id);
28}
29
30std::string getMessageName(uintptr_t MessageManager, uint8_t serviceID,
31 uint8_t messageID) {
32 const auto serviceBST =
33 *reinterpret_cast<uintptr_t *>(MessageManager + 0x4AD8);
34 const auto messageBST =
35 *reinterpret_cast<uintptr_t *>(MessageManager + 0x4AC8);
36
37 const auto rootServiceNode =
38 *reinterpret_cast<MemoryMessageNode **>(serviceBST + 0x8);
39 const auto rootMessageNode =
40 *reinterpret_cast<MemoryMessageNode **>(messageBST + 0x8);
41
42 std::unordered_set<std::string> serviceMsgNames{};
43 traverseMemNodes(rootServiceNode, serviceMsgNames, serviceID);
44
45 std::unordered_set<std::string> messageNames{};
46 traverseMemNodes(rootMessageNode, messageNames, messageID);
47
48 for (const auto &name : messageNames) {
49 for (const auto &service : serviceMsgNames) {
50 if (name.find(service) != std::string::npos) {
51 return name;
52 }
53 }
54 }
55
56 return "UNKNOWN";
57}
Definition MemoryMessage.h:6
uint8_t data
Definition MemoryMessage.h:14
uint8_t unk1
Definition MemoryMessage.h:10
MemoryMessageNode * leftNode
Definition MemoryMessage.h:7
uint8_t pad[6]
Definition MemoryMessage.h:12
void * unk
Definition MemoryMessage.h:8
MemoryMessageNode * rightNode
Definition MemoryMessage.h:9
bool isLastNode
Definition MemoryMessage.h:11
std::string name
Definition MemoryMessage.h:13