diff --git a/shared/sdk/AActor.cpp b/shared/sdk/AActor.cpp index 0aa40ff2..fa171708 100644 --- a/shared/sdk/AActor.cpp +++ b/shared/sdk/AActor.cpp @@ -4,6 +4,7 @@ #include "ScriptRotator.hpp" #include "UCameraComponent.hpp" #include "TArray.hpp" +#include "FMalloc.hpp" #include "AActor.hpp" @@ -219,23 +220,24 @@ std::vector AActor::get_components_by_class(UClass* uclass) { TArray ReturnValue{}; // 0x8 }; // Size: 0x18 - static Params_K2_GetComponentsByClass params{}; - + Params_K2_GetComponentsByClass params{}; params.ComponentClass = uclass; this->process_event(func, ¶ms); std::vector ret{}; - for (int i = 0; i < params.ReturnValue.count; ++i) { - ret.push_back(params.ReturnValue.data[i]); + if (params.ReturnValue.data != nullptr) { + for (int i = 0; i < params.ReturnValue.count; ++i) { + ret.push_back(params.ReturnValue.data[i]); + } } return ret; } std::vector AActor::get_all_components() { - const auto actor_component_t = sdk::find_uobject(L"Class /Script/Engine.ActorComponent"); + static const auto actor_component_t = sdk::find_uobject(L"Class /Script/Engine.ActorComponent"); if (actor_component_t == nullptr) { return {}; diff --git a/shared/sdk/CVar.cpp b/shared/sdk/CVar.cpp index a564e829..7da09d65 100644 --- a/shared/sdk/CVar.cpp +++ b/shared/sdk/CVar.cpp @@ -747,7 +747,7 @@ bool IConsoleCommand::Execute(const wchar_t* args) { } bool IConsoleCommand::Execute(const std::vector& args) { - std::vector> args_vec{}; + std::vector> args_vec{}; for (const auto& arg : args) { auto& arr = args_vec.emplace_back(); @@ -758,7 +758,7 @@ bool IConsoleCommand::Execute(const std::vector& args) { } FakeOutputDevice fake_output_device{}; - sdk::TArray> fake_args_vec{}; + sdk::TArrayLite> fake_args_vec{}; fake_args_vec.data = args_vec.data(); fake_args_vec.count = args_vec.size(); @@ -768,7 +768,7 @@ bool IConsoleCommand::Execute(const std::vector& args) { return execute_internal(fake_args_vec, nullptr, &fake_output_device); } -bool IConsoleCommand::execute_internal(const sdk::TArray>& args, void* world, void* output_device) { +bool IConsoleCommand::execute_internal(const sdk::TArrayLite>& args, void* world, void* output_device) { const auto info = locate_vtable_indices(); if (!info) { @@ -782,7 +782,7 @@ bool IConsoleCommand::execute_internal(const sdk::TArray>& return false; } - using ExecuteFn = bool(*)(IConsoleCommand*, sdk::TArray> const*, void*, void*); + using ExecuteFn = bool(*)(IConsoleCommand*, sdk::TArrayLite> const*, void*, void*); const auto func = (*(ExecuteFn**)this)[info->execute_index]; return func(this, &args, world, output_device); diff --git a/shared/sdk/CVar.hpp b/shared/sdk/CVar.hpp index 913682e4..e94b31c7 100644 --- a/shared/sdk/CVar.hpp +++ b/shared/sdk/CVar.hpp @@ -104,7 +104,7 @@ struct IConsoleCommand : IConsoleObject { bool Execute(const std::vector& args); protected: - bool execute_internal(const sdk::TArray>& args, void* world, void* output_device); + bool execute_internal(const sdk::TArrayLite>& args, void* world, void* output_device); }; struct IConsoleVariable : IConsoleObject { diff --git a/shared/sdk/FMalloc.cpp b/shared/sdk/FMalloc.cpp index b27e6660..cc575641 100644 --- a/shared/sdk/FMalloc.cpp +++ b/shared/sdk/FMalloc.cpp @@ -171,7 +171,6 @@ FMalloc* FMalloc::get() { } uint32_t distance_from_ret = 0; - utility::exhaustive_decode((uint8_t*)fn, 100, [&](utility::ExhaustionContext& ctx) -> utility::ExhaustionResult { ++distance_from_ret; return utility::ExhaustionResult::CONTINUE; diff --git a/shared/sdk/FName.cpp b/shared/sdk/FName.cpp index 5ba79f1d..ab6d7e4a 100644 --- a/shared/sdk/FName.cpp +++ b/shared/sdk/FName.cpp @@ -457,6 +457,11 @@ std::wstring FName::to_string() const { fn(this, &buffer); - return buffer.data; + if (buffer.data != nullptr) { + std::wstring result = buffer.data; + return result; + } + + return std::wstring{}; } } \ No newline at end of file diff --git a/shared/sdk/TArray.hpp b/shared/sdk/TArray.hpp index c3e85d5c..c5b63b92 100644 --- a/shared/sdk/TArray.hpp +++ b/shared/sdk/TArray.hpp @@ -1,8 +1,27 @@ #pragma once +#include + namespace sdk { +template +struct TArrayLite { + T* data{nullptr}; + int32_t count{0}; + int32_t capacity{0}; +}; + template struct TArray { + ~TArray() { + if (data == nullptr) { + return; + } + + if (auto m = FMalloc::get(); m != nullptr) { + m->free(data); + } + } + T* data{nullptr}; int32_t count{0}; int32_t capacity{0};