From 6324e679a7792835dd4e55a9fe8007673a60d2c8 Mon Sep 17 00:00:00 2001 From: massclown <155495748+massclown@users.noreply.github.com> Date: Fri, 25 Apr 2025 23:36:47 +0200 Subject: [PATCH] fix: pass scale to UEPseudo UWorld::SpawnActor --- UE4SS/src/LuaType/LuaUWorld.cpp | 40 +++++++++++++++++++++++++++++---- docs/lua-api/classes/uworld.md | 5 +++++ 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/UE4SS/src/LuaType/LuaUWorld.cpp b/UE4SS/src/LuaType/LuaUWorld.cpp index 887db969b..537e5de6e 100644 --- a/UE4SS/src/LuaType/LuaUWorld.cpp +++ b/UE4SS/src/LuaType/LuaUWorld.cpp @@ -65,7 +65,8 @@ namespace RC::LuaType std::string error_overload_not_found{R"( No overload found for function 'SpawnActor'. Overloads: -#1: SpawnActor(UClass Class, table Location, table Rotation))"}; +#1: SpawnActor(UClass Class, table Location, table Rotation) +#2: SpawnActor(UClass Class, table Location, table Rotation, table Scale))"}; if (!lua.is_userdata()) { @@ -136,10 +137,41 @@ No overload found for function 'SpawnActor'. lua.throw_error(error_overload_not_found); } - auto* actor = lua_object.get_remote_cpp_object()->SpawnActor(actor_class.get_remote_cpp_object(), &location, &rotation); - LuaType::AActor::construct(lua, actor); + // Check if we have a scale parameter + if (lua.is_table()) + { + // Handle scale parameter + Unreal::FVector scale{1.0f, 1.0f, 1.0f}; + lua.for_each_in_table([&](const LuaMadeSimple::LuaTableReference& table) { + if (table.key.is_string() && table.key.get_string() == "X" && table.value.is_number()) + { + scale.SetX(table.value.get_number()); + } - return 1; + if (table.key.is_string() && table.key.get_string() == "Y" && table.value.is_number()) + { + scale.SetY(table.value.get_number()); + } + + if (table.key.is_string() && table.key.get_string() == "Z" && table.value.is_number()) + { + scale.SetZ(table.value.get_number()); + } + return false; + }); + + Unreal::FTransform transform{rotation, location, scale}; + auto* actor = lua_object.get_remote_cpp_object()->SpawnActor(actor_class.get_remote_cpp_object(), &transform); + LuaType::AActor::construct(lua, actor); + return 1; + } + else + { + // Original behavior without scale + auto* actor = lua_object.get_remote_cpp_object()->SpawnActor(actor_class.get_remote_cpp_object(), &location, &rotation); + LuaType::AActor::construct(lua, actor); + return 1; + } }); if constexpr (is_final == LuaMadeSimple::Type::IsFinal::Yes) diff --git a/docs/lua-api/classes/uworld.md b/docs/lua-api/classes/uworld.md index 12f808699..1bc6a6a5a 100644 --- a/docs/lua-api/classes/uworld.md +++ b/docs/lua-api/classes/uworld.md @@ -8,3 +8,8 @@ This function uses `UGameplayStatics:BeginDeferredActorSpawnFromClass` and `UGameplayStatics:FinishSpawningActor` to spawn an actor. - **Return type:** `AActor` - **Returns:** Spawned actor object or an invalid object. + +### SpawnActor(UClass ActorClass, FVector Location, FRotator Rotation, FVector Scale) +This function uses `UGameplayStatics:BeginDeferredActorSpawnFromClass` and `UGameplayStatics:FinishSpawningActor` to spawn an actor. +- **Return type:** `AActor` +- **Returns:** Spawned actor object or an invalid object.