#include "def_mono.hpp" #include "def_il2cpp.hpp" namespace { std::optional readmonostring(void *ptr) { if (!ptr) return {}; MonoString *string = (MonoString *)ptr; auto data = (wchar_t *)string->chars; auto len = string->length; if (!(len && data)) return {}; if (wcslen(data) != len) return {}; return std::wstring_view(data, len); } void *createmonostring(std::wstring_view ws, MonoString *origin) { auto newstring = (MonoString *)malloc(sizeof(MonoString) + ws.size() + 2); memcpy(newstring, origin, sizeof(MonoString)); memcpy((wchar_t *)newstring->chars, ws.data(), ws.size() * 2); newstring->length = ws.size(); return newstring; } } void commonsolvemonostring(uintptr_t offset, uintptr_t *data, size_t *len) { auto sw = il2cppfunctions::get_string((void *)offset); if (!sw) sw = monofunctions::get_string((void *)offset); if (!sw) sw = readmonostring((void *)offset); if (!sw) return; auto sw_v = sw.value(); *data = (uintptr_t)sw_v.data(); *len = sw_v.length() * sizeof(wchar_t); if (*len > TEXT_BUFFER_SIZE) { *len = 0; return; } } void unity_ui_string_hook_after(uintptr_t *offset, void *data, size_t len) { auto view = std::wstring_view((wchar_t *)data, len / 2); auto newstring = il2cppfunctions::create_string(view); if (!newstring) newstring = monofunctions::create_string(view); if (!newstring) newstring = createmonostring(view, (MonoString *)*offset); *offset = (uintptr_t)newstring; } uintptr_t tryfindmonoil2cpp(const char *_dll, const char *_namespace, const char *_class, const char *_method, int paramCoun, bool strict) { auto addr = il2cppfunctions::get_method_pointer(_dll, _namespace, _class, _method, paramCoun, strict); if (addr) return addr; return monofunctions::get_method_pointer(_dll, _namespace, _class, _method, paramCoun, strict); }