2#include <unordered_set>
4#include "../Utils/Memory.h"
5#include "../Utils/ProcessHandle.h"
96 if (!schema_class_field_data_base || schema_class_field_data_base.value_or(0) == 0)
161 optional <CSchemaSystemTypeScope*>
type_scope(
const string& scope_name)
const {
166 for (
size_t i = 0; i < 18; i++) {
171 const auto current_name = current_scope.value()->scope_name();
172 if (!current_name || current_name.value_or(scope_name) != scope_name)
175 return current_scope;
186 optional <CSchemaSystemTypeScope*>
type_scope(
const size_t scope_index)
const {
187 if (scope_index > 19)
206 std::stringstream dump_content;
208 for (
size_t i = 0;
auto members_description = class_description->
members_description(i); ++i) {
209 if (!members_description || !members_description.value()->is_netvar())
212 const auto netvar_name = members_description.value()->netvar_name();
213 const auto offset = members_description.value()->offset();
214 const auto m_type = members_description.value()->m_type()->type_name();
216 if (netvar_name && offset.value_or(0) != 0) {
217 g_netvars[class_name][netvar_name.value()] = offset.value();
219 dump_content << netvar_name.value() <<
" | " << std::hex << offset.value() <<
" | " << m_type.value_or(
"unknow") <<
"\n";
232 size_t dump_netvars(
const string& scope_name,
const bool dump_to_file)
const {
233 const auto scope = this->
type_scope(scope_name);
238 std::filesystem::create_directories(
"C:\\netvars\\");
240 std::unordered_set<string> processed_classes;
242 size_t container_index = 0;
244 const auto class_description_container = scope.value()->class_description_container(container_index);
245 if (!class_description_container)
248 size_t class_description_index = 0;
249 auto class_description = class_description_container.value()->class_description(class_description_index);
250 while (class_description) {
251 const auto class_name = class_description.value()->class_name();
255 std::vector<std::pair<string, ClassDescription*>> class_hierarchy;
256 auto current_class = class_description.value();
257 while (current_class) {
258 const auto current_class_name = current_class->class_name();
259 if (!current_class_name)
261 class_hierarchy.insert(class_hierarchy.begin(), { current_class_name.value(), current_class });
262 current_class = current_class->parent_info() ? current_class->parent_info().value()->parent() :
nullptr;
265 for (
const auto& [name, desc] : class_hierarchy) {
266 if (processed_classes.contains(name))
269 std::stringstream dump_content;
270 dump_content <<
"[Hierarchy]\n";
271 for (
const auto& [hier_name, _] : class_hierarchy)
272 dump_content << hier_name <<
" -> ";
273 dump_content.seekp(-4, std::ios_base::end);
274 dump_content <<
"\n\n";
276 dump_content <<
"[" << name <<
"]\n";
278 processed_classes.insert(name);
280 if (dump_to_file && dump_content.tellp() != std::streampos(0) && dump_content.str().find(
"|") != string::npos) {
281 string filename =
"C:\\netvars\\" + name +
".txt";
282 std::ofstream dump_file(filename);
283 dump_file << dump_content.rdbuf();
288 class_description_index++;
289 class_description = class_description_container.value()->class_description(class_description_index);
294 size_t netvar_count = 0;
295 for (
const auto& [class_name, netvar_map] :
g_netvars) {
296 netvar_count += netvar_map.size();
307 size_t dump_netvars(
const size_t scope_index,
const bool dump_to_file)
const {
308 const auto scope = this->
type_scope(scope_index);
312 const auto scope_name = scope.value()->scope_name();
328 optional <uintptr_t>
get_netvar(
const T& addr,
const string& class_name,
const string& netvar_name)
const {
330 if (
auto it_var = it_class->second.find(netvar_name); it_var != it_class->second.end())
331 return reinterpret_cast<uintptr_t
>(addr) + it_var->second;
337 static inline std::unordered_map<string, std::unordered_map<std::string, int32_t>>
g_netvars;
constexpr size_t CLASS_DESCRIPTION_CONTAINERS_ARRAY_SIZE
Definition CSchemaSystem.h:8
constexpr size_t SCHEMA_CLASS_FIELD_DATA_SIZE
Definition CSchemaSystem.h:11
constexpr size_t CLASS_DESCRIPTION_CONTAINER_SIZE
Definition CSchemaSystem.h:10
constexpr size_t CLASS_DESCRIPTION_CONTAINERS_ARRAY_MAX_INDEX
Definition CSchemaSystem.h:9
constexpr size_t CLASS_DESCRIPTION_CONTAINERS_ARRAY_OFFSET
Definition CSchemaSystem.h:7
Definition CSchemaSystem.h:125
optional< string > scope_name() const
Definition CSchemaSystem.h:130
optional< ClassDescription_Container * > class_description_container(const size_t index) const
Definition CSchemaSystem.h:139
Definition CSchemaSystem.h:152
std::stringstream iterate_netvars(const string &class_name, const ClassDescription *class_description, const bool dump_to_file) const
Definition CSchemaSystem.h:205
optional< CSchemaSystemTypeScope * > type_scope(const string &scope_name) const
Definition CSchemaSystem.h:161
size_t dump_netvars(const string &scope_name, const bool dump_to_file) const
Definition CSchemaSystem.h:232
optional< CSchemaSystemTypeScope * > type_scope(const size_t scope_index) const
Definition CSchemaSystem.h:186
size_t dump_netvars(const size_t scope_index, const bool dump_to_file) const
Definition CSchemaSystem.h:307
optional< uintptr_t > get_netvar(const T &addr, const string &class_name, const string &netvar_name) const
Definition CSchemaSystem.h:328
static std::unordered_map< string, std::unordered_map< std::string, int32_t > > g_netvars
Global variable to store dumped NetVars.
Definition CSchemaSystem.h:337
Definition CSchemaSystem.h:13
optional< string > type_name() const
Definition CSchemaSystem.h:18
Definition CSchemaSystem.h:114
optional< ClassDescription * > class_description(const size_t index) const
Definition CSchemaSystem.h:119
Definition CSchemaSystem.h:68
optional< uint32_t > class_size() const
Definition CSchemaSystem.h:80
optional< SchemaClassFieldData_t * > members_description(const size_t index) const
Definition CSchemaSystem.h:94
optional< string > class_name() const
Definition CSchemaSystem.h:73
optional< SchemaParentInfo * > parent_info() const
Definition CSchemaSystem.h:109
optional< uint32_t > members_size() const
Definition CSchemaSystem.h:87
static optional< T > read_memory(const N &address)
Definition Memory.h:78
static bool is_valid_ptr(const T &ptr)
Definition Memory.h:136
static optional< string > read_string(const T &address, const size_t max_length=64)
Definition Memory.h:125
Definition CSchemaSystem.h:24
optional< int32_t > offset() const
Definition CSchemaSystem.h:44
optional< string > netvar_name() const
Definition CSchemaSystem.h:29
bool is_netvar() const
Definition CSchemaSystem.h:51
CSchemaType_Builtin * m_type() const
Definition CSchemaSystem.h:37
Definition CSchemaSystem.h:58
ClassDescription * parent() const
Definition CSchemaSystem.h:63