ue-mcp 0.4.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +89 -0
- package/dist/bridge.d.ts +25 -0
- package/dist/bridge.js +124 -0
- package/dist/bridge.js.map +1 -0
- package/dist/deployer.d.ts +18 -0
- package/dist/deployer.js +175 -0
- package/dist/deployer.js.map +1 -0
- package/dist/editor-control.d.ts +15 -0
- package/dist/editor-control.js +181 -0
- package/dist/editor-control.js.map +1 -0
- package/dist/github-app.d.ts +4 -0
- package/dist/github-app.js +94 -0
- package/dist/github-app.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +125 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.js +290 -0
- package/dist/init.js.map +1 -0
- package/dist/instructions.d.ts +1 -0
- package/dist/instructions.js +150 -0
- package/dist/instructions.js.map +1 -0
- package/dist/project.d.ts +32 -0
- package/dist/project.js +175 -0
- package/dist/project.js.map +1 -0
- package/dist/tools/animation.d.ts +2 -0
- package/dist/tools/animation.js +62 -0
- package/dist/tools/animation.js.map +1 -0
- package/dist/tools/asset.d.ts +2 -0
- package/dist/tools/asset.js +128 -0
- package/dist/tools/asset.js.map +1 -0
- package/dist/tools/audio.d.ts +2 -0
- package/dist/tools/audio.js +24 -0
- package/dist/tools/audio.js.map +1 -0
- package/dist/tools/blueprint.d.ts +2 -0
- package/dist/tools/blueprint.js +64 -0
- package/dist/tools/blueprint.js.map +1 -0
- package/dist/tools/demo.d.ts +2 -0
- package/dist/tools/demo.js +10 -0
- package/dist/tools/demo.js.map +1 -0
- package/dist/tools/editor.d.ts +2 -0
- package/dist/tools/editor.js +133 -0
- package/dist/tools/editor.js.map +1 -0
- package/dist/tools/feedback.d.ts +2 -0
- package/dist/tools/feedback.js +44 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/foliage.d.ts +2 -0
- package/dist/tools/foliage.js +29 -0
- package/dist/tools/foliage.js.map +1 -0
- package/dist/tools/gameplay.d.ts +2 -0
- package/dist/tools/gameplay.js +101 -0
- package/dist/tools/gameplay.js.map +1 -0
- package/dist/tools/gas.d.ts +2 -0
- package/dist/tools/gas.js +43 -0
- package/dist/tools/gas.js.map +1 -0
- package/dist/tools/landscape.d.ts +2 -0
- package/dist/tools/landscape.js +32 -0
- package/dist/tools/landscape.js.map +1 -0
- package/dist/tools/level.d.ts +2 -0
- package/dist/tools/level.js +66 -0
- package/dist/tools/level.js.map +1 -0
- package/dist/tools/material.d.ts +2 -0
- package/dist/tools/material.js +59 -0
- package/dist/tools/material.js.map +1 -0
- package/dist/tools/networking.d.ts +2 -0
- package/dist/tools/networking.js +42 -0
- package/dist/tools/networking.js.map +1 -0
- package/dist/tools/niagara.d.ts +2 -0
- package/dist/tools/niagara.js +42 -0
- package/dist/tools/niagara.js.map +1 -0
- package/dist/tools/pcg.d.ts +2 -0
- package/dist/tools/pcg.js +39 -0
- package/dist/tools/pcg.js.map +1 -0
- package/dist/tools/project.d.ts +2 -0
- package/dist/tools/project.js +282 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/reflection.d.ts +2 -0
- package/dist/tools/reflection.js +26 -0
- package/dist/tools/reflection.js.map +1 -0
- package/dist/tools/widget.d.ts +2 -0
- package/dist/tools/widget.js +34 -0
- package/dist/tools/widget.js.map +1 -0
- package/dist/types.d.ts +21 -0
- package/dist/types.js +38 -0
- package/dist/types.js.map +1 -0
- package/package.json +76 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +746 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.h +81 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +49 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +37 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.cpp +75 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.h +50 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +1418 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +43 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +1773 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +48 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.cpp +289 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.h +18 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +1982 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +44 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +1217 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.h +71 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.cpp +465 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.h +49 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +1676 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +53 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +876 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +22 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +2222 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +54 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +783 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +24 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +898 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +24 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +1270 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +34 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +2190 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +53 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.cpp +554 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.h +29 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +601 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +1024 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.h +25 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +370 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.h +19 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.cpp +499 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.h +27 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +426 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +19 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +303 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.h +18 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +985 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +27 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.cpp +181 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.h +42 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +39 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/UE_MCP_BridgeModule.h +14 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
- package/plugin/ue_mcp_bridge/UE_MCP_Bridge.uplugin +55 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FPCGHandlers
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
|
|
11
|
+
|
|
12
|
+
private:
|
|
13
|
+
static TSharedPtr<FJsonValue> ListPCGGraphs(const TSharedPtr<FJsonObject>& Params);
|
|
14
|
+
static TSharedPtr<FJsonValue> GetPCGComponents(const TSharedPtr<FJsonObject>& Params);
|
|
15
|
+
static TSharedPtr<FJsonValue> CreatePCGGraph(const TSharedPtr<FJsonObject>& Params);
|
|
16
|
+
static TSharedPtr<FJsonValue> ReadPCGGraph(const TSharedPtr<FJsonObject>& Params);
|
|
17
|
+
static TSharedPtr<FJsonValue> AddPCGNode(const TSharedPtr<FJsonObject>& Params);
|
|
18
|
+
static TSharedPtr<FJsonValue> ConnectPCGNodes(const TSharedPtr<FJsonObject>& Params);
|
|
19
|
+
static TSharedPtr<FJsonValue> RemovePCGNode(const TSharedPtr<FJsonObject>& Params);
|
|
20
|
+
static TSharedPtr<FJsonValue> SetPCGNodeSettings(const TSharedPtr<FJsonObject>& Params);
|
|
21
|
+
static TSharedPtr<FJsonValue> ExecutePCGGraph(const TSharedPtr<FJsonObject>& Params);
|
|
22
|
+
static TSharedPtr<FJsonValue> SpawnPCGVolume(const TSharedPtr<FJsonObject>& Params);
|
|
23
|
+
static TSharedPtr<FJsonValue> ReadPCGNodeSettings(const TSharedPtr<FJsonObject>& Params);
|
|
24
|
+
static TSharedPtr<FJsonValue> GetPCGComponentDetails(const TSharedPtr<FJsonObject>& Params);
|
|
25
|
+
};
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
#include "PhysicsHandlers.h"
|
|
2
|
+
#include "HandlerRegistry.h"
|
|
3
|
+
#include "Components/PrimitiveComponent.h"
|
|
4
|
+
#include "PhysicsEngine/BodyInstance.h"
|
|
5
|
+
#include "Engine/World.h"
|
|
6
|
+
#include "Editor.h"
|
|
7
|
+
#include "Editor/EditorEngine.h"
|
|
8
|
+
#include "GameFramework/Actor.h"
|
|
9
|
+
#include "EngineUtils.h"
|
|
10
|
+
#include "Dom/JsonObject.h"
|
|
11
|
+
#include "Dom/JsonValue.h"
|
|
12
|
+
|
|
13
|
+
void FPhysicsHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
14
|
+
{
|
|
15
|
+
Registry.RegisterHandler(TEXT("set_collision_profile"), &SetCollisionProfile);
|
|
16
|
+
Registry.RegisterHandler(TEXT("set_physics_enabled"), &SetPhysicsEnabled);
|
|
17
|
+
Registry.RegisterHandler(TEXT("set_collision_enabled"), &SetCollisionEnabled);
|
|
18
|
+
Registry.RegisterHandler(TEXT("set_body_properties"), &SetBodyProperties);
|
|
19
|
+
// Aliases
|
|
20
|
+
Registry.RegisterHandler(TEXT("set_simulate_physics"), &SetPhysicsEnabled);
|
|
21
|
+
Registry.RegisterHandler(TEXT("set_physics_properties"), &SetBodyProperties);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
TSharedPtr<FJsonValue> FPhysicsHandlers::SetCollisionProfile(const TSharedPtr<FJsonObject>& Params)
|
|
25
|
+
{
|
|
26
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
27
|
+
|
|
28
|
+
FString ActorLabel;
|
|
29
|
+
if (!Params->TryGetStringField(TEXT("actorLabel"), ActorLabel))
|
|
30
|
+
{
|
|
31
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'actorLabel' parameter"));
|
|
32
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
33
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
FString ProfileName;
|
|
37
|
+
if (!Params->TryGetStringField(TEXT("profileName"), ProfileName))
|
|
38
|
+
{
|
|
39
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'profileName' parameter (e.g. BlockAll, OverlapAll, BlockAllDynamic, NoCollision, Pawn, PhysicsActor)"));
|
|
40
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
41
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
UWorld* World = GEditor->GetEditorWorldContext().World();
|
|
45
|
+
if (!World)
|
|
46
|
+
{
|
|
47
|
+
Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
|
|
48
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
49
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Find actor by label
|
|
53
|
+
AActor* Actor = nullptr;
|
|
54
|
+
for (TActorIterator<AActor> ActorIt(World); ActorIt; ++ActorIt)
|
|
55
|
+
{
|
|
56
|
+
if ((*ActorIt)->GetActorLabel() == ActorLabel)
|
|
57
|
+
{
|
|
58
|
+
Actor = *ActorIt;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!Actor)
|
|
64
|
+
{
|
|
65
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
|
|
66
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
67
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Set collision profile on all PrimitiveComponents
|
|
71
|
+
int32 ComponentsModified = 0;
|
|
72
|
+
TArray<UPrimitiveComponent*> PrimitiveComponents;
|
|
73
|
+
Actor->GetComponents<UPrimitiveComponent>(PrimitiveComponents);
|
|
74
|
+
|
|
75
|
+
for (UPrimitiveComponent* PrimComp : PrimitiveComponents)
|
|
76
|
+
{
|
|
77
|
+
if (!PrimComp) continue;
|
|
78
|
+
PrimComp->SetCollisionProfileName(FName(*ProfileName));
|
|
79
|
+
ComponentsModified++;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
Result->SetStringField(TEXT("actorLabel"), ActorLabel);
|
|
83
|
+
Result->SetStringField(TEXT("profileName"), ProfileName);
|
|
84
|
+
Result->SetNumberField(TEXT("componentsModified"), ComponentsModified);
|
|
85
|
+
Result->SetBoolField(TEXT("success"), ComponentsModified > 0);
|
|
86
|
+
|
|
87
|
+
if (ComponentsModified == 0)
|
|
88
|
+
{
|
|
89
|
+
Result->SetStringField(TEXT("warning"), TEXT("No PrimitiveComponents found on actor"));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
TSharedPtr<FJsonValue> FPhysicsHandlers::SetPhysicsEnabled(const TSharedPtr<FJsonObject>& Params)
|
|
96
|
+
{
|
|
97
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
98
|
+
|
|
99
|
+
FString ActorLabel;
|
|
100
|
+
if (!Params->TryGetStringField(TEXT("actorLabel"), ActorLabel))
|
|
101
|
+
{
|
|
102
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'actorLabel' parameter"));
|
|
103
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
104
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
bool bEnabled = true;
|
|
108
|
+
if (!Params->TryGetBoolField(TEXT("enabled"), bEnabled))
|
|
109
|
+
{
|
|
110
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'enabled' parameter (true/false)"));
|
|
111
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
112
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
UWorld* World = GEditor->GetEditorWorldContext().World();
|
|
116
|
+
if (!World)
|
|
117
|
+
{
|
|
118
|
+
Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
|
|
119
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
120
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Find actor by label
|
|
124
|
+
AActor* Actor = nullptr;
|
|
125
|
+
for (TActorIterator<AActor> ActorIt(World); ActorIt; ++ActorIt)
|
|
126
|
+
{
|
|
127
|
+
if ((*ActorIt)->GetActorLabel() == ActorLabel)
|
|
128
|
+
{
|
|
129
|
+
Actor = *ActorIt;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!Actor)
|
|
135
|
+
{
|
|
136
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
|
|
137
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
138
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Enable/disable physics on all PrimitiveComponents
|
|
142
|
+
int32 ComponentsModified = 0;
|
|
143
|
+
TArray<UPrimitiveComponent*> PrimitiveComponents;
|
|
144
|
+
Actor->GetComponents<UPrimitiveComponent>(PrimitiveComponents);
|
|
145
|
+
|
|
146
|
+
for (UPrimitiveComponent* PrimComp : PrimitiveComponents)
|
|
147
|
+
{
|
|
148
|
+
if (!PrimComp) continue;
|
|
149
|
+
PrimComp->SetSimulatePhysics(bEnabled);
|
|
150
|
+
ComponentsModified++;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
Result->SetStringField(TEXT("actorLabel"), ActorLabel);
|
|
154
|
+
Result->SetBoolField(TEXT("enabled"), bEnabled);
|
|
155
|
+
Result->SetNumberField(TEXT("componentsModified"), ComponentsModified);
|
|
156
|
+
Result->SetBoolField(TEXT("success"), ComponentsModified > 0);
|
|
157
|
+
|
|
158
|
+
if (ComponentsModified == 0)
|
|
159
|
+
{
|
|
160
|
+
Result->SetStringField(TEXT("warning"), TEXT("No PrimitiveComponents found on actor"));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
TSharedPtr<FJsonValue> FPhysicsHandlers::SetCollisionEnabled(const TSharedPtr<FJsonObject>& Params)
|
|
167
|
+
{
|
|
168
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
169
|
+
|
|
170
|
+
FString ActorLabel;
|
|
171
|
+
if (!Params->TryGetStringField(TEXT("actorLabel"), ActorLabel))
|
|
172
|
+
{
|
|
173
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'actorLabel' parameter"));
|
|
174
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
175
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
FString CollisionType;
|
|
179
|
+
if (!Params->TryGetStringField(TEXT("collisionType"), CollisionType))
|
|
180
|
+
{
|
|
181
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'collisionType' parameter (NoCollision, QueryOnly, PhysicsOnly, QueryAndPhysics)"));
|
|
182
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
183
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Map string to ECollisionEnabled
|
|
187
|
+
ECollisionEnabled::Type CollisionEnabled;
|
|
188
|
+
if (CollisionType.Equals(TEXT("NoCollision"), ESearchCase::IgnoreCase))
|
|
189
|
+
{
|
|
190
|
+
CollisionEnabled = ECollisionEnabled::NoCollision;
|
|
191
|
+
}
|
|
192
|
+
else if (CollisionType.Equals(TEXT("QueryOnly"), ESearchCase::IgnoreCase))
|
|
193
|
+
{
|
|
194
|
+
CollisionEnabled = ECollisionEnabled::QueryOnly;
|
|
195
|
+
}
|
|
196
|
+
else if (CollisionType.Equals(TEXT("PhysicsOnly"), ESearchCase::IgnoreCase))
|
|
197
|
+
{
|
|
198
|
+
CollisionEnabled = ECollisionEnabled::PhysicsOnly;
|
|
199
|
+
}
|
|
200
|
+
else if (CollisionType.Equals(TEXT("QueryAndPhysics"), ESearchCase::IgnoreCase))
|
|
201
|
+
{
|
|
202
|
+
CollisionEnabled = ECollisionEnabled::QueryAndPhysics;
|
|
203
|
+
}
|
|
204
|
+
else
|
|
205
|
+
{
|
|
206
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Unknown collision type: '%s'. Use NoCollision, QueryOnly, PhysicsOnly, or QueryAndPhysics."), *CollisionType));
|
|
207
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
208
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
UWorld* World = GEditor->GetEditorWorldContext().World();
|
|
212
|
+
if (!World)
|
|
213
|
+
{
|
|
214
|
+
Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
|
|
215
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
216
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Find actor by label
|
|
220
|
+
AActor* Actor = nullptr;
|
|
221
|
+
for (TActorIterator<AActor> ActorIt(World); ActorIt; ++ActorIt)
|
|
222
|
+
{
|
|
223
|
+
if ((*ActorIt)->GetActorLabel() == ActorLabel)
|
|
224
|
+
{
|
|
225
|
+
Actor = *ActorIt;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (!Actor)
|
|
231
|
+
{
|
|
232
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
|
|
233
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
234
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Set collision enabled on all PrimitiveComponents
|
|
238
|
+
int32 ComponentsModified = 0;
|
|
239
|
+
TArray<UPrimitiveComponent*> PrimitiveComponents;
|
|
240
|
+
Actor->GetComponents<UPrimitiveComponent>(PrimitiveComponents);
|
|
241
|
+
|
|
242
|
+
for (UPrimitiveComponent* PrimComp : PrimitiveComponents)
|
|
243
|
+
{
|
|
244
|
+
if (!PrimComp) continue;
|
|
245
|
+
PrimComp->SetCollisionEnabled(CollisionEnabled);
|
|
246
|
+
ComponentsModified++;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
Result->SetStringField(TEXT("actorLabel"), ActorLabel);
|
|
250
|
+
Result->SetStringField(TEXT("collisionType"), CollisionType);
|
|
251
|
+
Result->SetNumberField(TEXT("componentsModified"), ComponentsModified);
|
|
252
|
+
Result->SetBoolField(TEXT("success"), ComponentsModified > 0);
|
|
253
|
+
|
|
254
|
+
if (ComponentsModified == 0)
|
|
255
|
+
{
|
|
256
|
+
Result->SetStringField(TEXT("warning"), TEXT("No PrimitiveComponents found on actor"));
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
TSharedPtr<FJsonValue> FPhysicsHandlers::SetBodyProperties(const TSharedPtr<FJsonObject>& Params)
|
|
263
|
+
{
|
|
264
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
265
|
+
|
|
266
|
+
FString ActorLabel;
|
|
267
|
+
if (!Params->TryGetStringField(TEXT("actorLabel"), ActorLabel))
|
|
268
|
+
{
|
|
269
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'actorLabel' parameter"));
|
|
270
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
271
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
UWorld* World = GEditor->GetEditorWorldContext().World();
|
|
275
|
+
if (!World)
|
|
276
|
+
{
|
|
277
|
+
Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
|
|
278
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
279
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Find actor by label
|
|
283
|
+
AActor* Actor = nullptr;
|
|
284
|
+
for (TActorIterator<AActor> ActorIt(World); ActorIt; ++ActorIt)
|
|
285
|
+
{
|
|
286
|
+
if ((*ActorIt)->GetActorLabel() == ActorLabel)
|
|
287
|
+
{
|
|
288
|
+
Actor = *ActorIt;
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if (!Actor)
|
|
294
|
+
{
|
|
295
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Actor not found: %s"), *ActorLabel));
|
|
296
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
297
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// Get all PrimitiveComponents
|
|
301
|
+
int32 ComponentsModified = 0;
|
|
302
|
+
TArray<UPrimitiveComponent*> PrimitiveComponents;
|
|
303
|
+
Actor->GetComponents<UPrimitiveComponent>(PrimitiveComponents);
|
|
304
|
+
|
|
305
|
+
// Track which properties were set
|
|
306
|
+
TArray<FString> PropertiesSet;
|
|
307
|
+
|
|
308
|
+
for (UPrimitiveComponent* PrimComp : PrimitiveComponents)
|
|
309
|
+
{
|
|
310
|
+
if (!PrimComp) continue;
|
|
311
|
+
|
|
312
|
+
FBodyInstance* BodyInstance = PrimComp->GetBodyInstance();
|
|
313
|
+
if (!BodyInstance) continue;
|
|
314
|
+
|
|
315
|
+
// Set mass override if provided
|
|
316
|
+
double Mass = 0.0;
|
|
317
|
+
if (Params->TryGetNumberField(TEXT("mass"), Mass))
|
|
318
|
+
{
|
|
319
|
+
BodyInstance->SetMassOverride(Mass);
|
|
320
|
+
if (ComponentsModified == 0) PropertiesSet.Add(TEXT("mass"));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Set linear damping if provided
|
|
324
|
+
double LinearDamping = 0.0;
|
|
325
|
+
if (Params->TryGetNumberField(TEXT("linearDamping"), LinearDamping))
|
|
326
|
+
{
|
|
327
|
+
BodyInstance->LinearDamping = LinearDamping;
|
|
328
|
+
PrimComp->SetLinearDamping(LinearDamping);
|
|
329
|
+
if (ComponentsModified == 0) PropertiesSet.Add(TEXT("linearDamping"));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Set angular damping if provided
|
|
333
|
+
double AngularDamping = 0.0;
|
|
334
|
+
if (Params->TryGetNumberField(TEXT("angularDamping"), AngularDamping))
|
|
335
|
+
{
|
|
336
|
+
BodyInstance->AngularDamping = AngularDamping;
|
|
337
|
+
PrimComp->SetAngularDamping(AngularDamping);
|
|
338
|
+
if (ComponentsModified == 0) PropertiesSet.Add(TEXT("angularDamping"));
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Set gravity enabled if provided
|
|
342
|
+
bool bEnableGravity = true;
|
|
343
|
+
if (Params->TryGetBoolField(TEXT("enableGravity"), bEnableGravity))
|
|
344
|
+
{
|
|
345
|
+
PrimComp->SetEnableGravity(bEnableGravity);
|
|
346
|
+
if (ComponentsModified == 0) PropertiesSet.Add(TEXT("enableGravity"));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
ComponentsModified++;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Build properties set list
|
|
353
|
+
TArray<TSharedPtr<FJsonValue>> PropsArray;
|
|
354
|
+
for (const FString& PropName : PropertiesSet)
|
|
355
|
+
{
|
|
356
|
+
PropsArray.Add(MakeShared<FJsonValueString>(PropName));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
Result->SetStringField(TEXT("actorLabel"), ActorLabel);
|
|
360
|
+
Result->SetArrayField(TEXT("propertiesSet"), PropsArray);
|
|
361
|
+
Result->SetNumberField(TEXT("componentsModified"), ComponentsModified);
|
|
362
|
+
Result->SetBoolField(TEXT("success"), ComponentsModified > 0);
|
|
363
|
+
|
|
364
|
+
if (ComponentsModified == 0)
|
|
365
|
+
{
|
|
366
|
+
Result->SetStringField(TEXT("warning"), TEXT("No PrimitiveComponents with BodyInstance found on actor"));
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
370
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FPhysicsHandlers
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
// Register all physics handlers
|
|
11
|
+
static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
|
|
12
|
+
|
|
13
|
+
private:
|
|
14
|
+
// Handler implementations
|
|
15
|
+
static TSharedPtr<FJsonValue> SetCollisionProfile(const TSharedPtr<FJsonObject>& Params);
|
|
16
|
+
static TSharedPtr<FJsonValue> SetPhysicsEnabled(const TSharedPtr<FJsonObject>& Params);
|
|
17
|
+
static TSharedPtr<FJsonValue> SetCollisionEnabled(const TSharedPtr<FJsonObject>& Params);
|
|
18
|
+
static TSharedPtr<FJsonValue> SetBodyProperties(const TSharedPtr<FJsonObject>& Params);
|
|
19
|
+
};
|