Skip to content

Commit

Permalink
UObjectHook: Display components of actors
Browse files Browse the repository at this point in the history
  • Loading branch information
praydog committed Oct 22, 2023
1 parent 383450b commit 2809c4b
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 4 deletions.
42 changes: 40 additions & 2 deletions shared/sdk/AActor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "ScriptVector.hpp"
#include "ScriptRotator.hpp"
#include "UCameraComponent.hpp"
#include "TArray.hpp"

#include "AActor.hpp"

Expand Down Expand Up @@ -132,7 +133,7 @@ struct FTransform {
};


USceneComponent* AActor::add_component_by_class(UClass* uclass) {
UActorComponent* AActor::add_component_by_class(UClass* uclass) {
static const auto func = AActor::static_class()->find_function(L"AddComponentByClass");

if (func == nullptr) {
Expand All @@ -146,7 +147,7 @@ USceneComponent* AActor::add_component_by_class(UClass* uclass) {
FTransform RelativeTransform{};
bool bDeferredFinish{false};
char pad_41[0x7];
sdk::USceneComponent* ret{nullptr};
sdk::UActorComponent* ret{nullptr};
} params;

params.uclass = uclass;
Expand Down Expand Up @@ -175,4 +176,41 @@ void AActor::finish_add_component(sdk::UObject* component) {

this->process_event(func, &params);
}

std::vector<UActorComponent*> AActor::get_components_by_class(UClass* uclass) {
static const auto func = AActor::static_class()->find_function(L"K2_GetComponentsByClass");

if (func == nullptr) {
return {};
}

struct Params_K2_GetComponentsByClass {
UClass* ComponentClass{}; // 0x0
TArray<UActorComponent*> ReturnValue{}; // 0x8
}; // Size: 0x18

static Params_K2_GetComponentsByClass params{};

params.ComponentClass = uclass;

this->process_event(func, &params);

std::vector<UActorComponent*> ret{};

for (int i = 0; i < params.ReturnValue.count; ++i) {
ret.push_back(params.ReturnValue.data[i]);
}

return ret;
}

std::vector<UActorComponent*> AActor::get_all_components() {
const auto actor_component_t = sdk::find_uobject<sdk::UClass>(L"Class /Script/Engine.ActorComponent");

if (actor_component_t == nullptr) {
return {};
}

return get_components_by_class(actor_component_t);
}
}
10 changes: 9 additions & 1 deletion shared/sdk/AActor.hpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
#pragma once

#include <vector>

#include "Math.hpp"

#include "UClass.hpp"

namespace sdk {
class UCameraComponent;
class USceneComponent;
class UActorComponent : public UObject {

};

class AActor : public UObject {
public:
Expand All @@ -21,9 +26,12 @@ class AActor : public UObject {
USceneComponent* get_component_by_class(UClass* uclass);
UCameraComponent* get_camera_component();

USceneComponent* add_component_by_class(UClass* uclass);
UActorComponent* add_component_by_class(UClass* uclass);
void finish_add_component(sdk::UObject* component);

std::vector<UActorComponent*> get_components_by_class(UClass* uclass);
std::vector<UActorComponent*> get_all_components();

protected:
};
}
24 changes: 23 additions & 1 deletion src/mods/UObjectHook.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,8 @@ void UObjectHook::ui_handle_object(sdk::UObject* object) {
});

if (uclass->is_a(sdk::AActor::static_class())) {
auto actor = (sdk::AActor*)object;

static char component_add_name[256]{};

if (ImGui::InputText("Add Component", component_add_name, sizeof(component_add_name), ImGuiInputTextFlags_::ImGuiInputTextFlags_EnterReturnsTrue)) {
Expand All @@ -290,7 +292,6 @@ void UObjectHook::ui_handle_object(sdk::UObject* object) {
return;
}

auto actor = (sdk::AActor*)object;
auto component = (sdk::UObject*)actor->add_component_by_class(component_c);

if (component != nullptr) {
Expand Down Expand Up @@ -335,6 +336,27 @@ void UObjectHook::ui_handle_object(sdk::UObject* object) {
strcpy_s(component_add_name, "Nonexistent component");
}
}

if (ImGui::TreeNode("Components")) {
auto components = actor->get_all_components();

std::sort(components.begin(), components.end(), [](sdk::UObject* a, sdk::UObject* b) {
return a->get_full_name() < b->get_full_name();
});

for (auto comp : components) {
auto comp_obj = (sdk::UObject*)comp;

ImGui::PushID(comp_obj);
if (ImGui::TreeNode(utility::narrow(comp_obj->get_full_name()).data())) {
ui_handle_object(comp_obj);
ImGui::TreePop();
}
ImGui::PopID();
}

ImGui::TreePop();
}
}

if (ImGui::TreeNode("Functions")) {
Expand Down

0 comments on commit 2809c4b

Please sign in to comment.