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.
Files changed (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/dist/bridge.d.ts +25 -0
  4. package/dist/bridge.js +124 -0
  5. package/dist/bridge.js.map +1 -0
  6. package/dist/deployer.d.ts +18 -0
  7. package/dist/deployer.js +175 -0
  8. package/dist/deployer.js.map +1 -0
  9. package/dist/editor-control.d.ts +15 -0
  10. package/dist/editor-control.js +181 -0
  11. package/dist/editor-control.js.map +1 -0
  12. package/dist/github-app.d.ts +4 -0
  13. package/dist/github-app.js +94 -0
  14. package/dist/github-app.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +125 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/init.d.ts +2 -0
  19. package/dist/init.js +290 -0
  20. package/dist/init.js.map +1 -0
  21. package/dist/instructions.d.ts +1 -0
  22. package/dist/instructions.js +150 -0
  23. package/dist/instructions.js.map +1 -0
  24. package/dist/project.d.ts +32 -0
  25. package/dist/project.js +175 -0
  26. package/dist/project.js.map +1 -0
  27. package/dist/tools/animation.d.ts +2 -0
  28. package/dist/tools/animation.js +62 -0
  29. package/dist/tools/animation.js.map +1 -0
  30. package/dist/tools/asset.d.ts +2 -0
  31. package/dist/tools/asset.js +128 -0
  32. package/dist/tools/asset.js.map +1 -0
  33. package/dist/tools/audio.d.ts +2 -0
  34. package/dist/tools/audio.js +24 -0
  35. package/dist/tools/audio.js.map +1 -0
  36. package/dist/tools/blueprint.d.ts +2 -0
  37. package/dist/tools/blueprint.js +64 -0
  38. package/dist/tools/blueprint.js.map +1 -0
  39. package/dist/tools/demo.d.ts +2 -0
  40. package/dist/tools/demo.js +10 -0
  41. package/dist/tools/demo.js.map +1 -0
  42. package/dist/tools/editor.d.ts +2 -0
  43. package/dist/tools/editor.js +133 -0
  44. package/dist/tools/editor.js.map +1 -0
  45. package/dist/tools/feedback.d.ts +2 -0
  46. package/dist/tools/feedback.js +44 -0
  47. package/dist/tools/feedback.js.map +1 -0
  48. package/dist/tools/foliage.d.ts +2 -0
  49. package/dist/tools/foliage.js +29 -0
  50. package/dist/tools/foliage.js.map +1 -0
  51. package/dist/tools/gameplay.d.ts +2 -0
  52. package/dist/tools/gameplay.js +101 -0
  53. package/dist/tools/gameplay.js.map +1 -0
  54. package/dist/tools/gas.d.ts +2 -0
  55. package/dist/tools/gas.js +43 -0
  56. package/dist/tools/gas.js.map +1 -0
  57. package/dist/tools/landscape.d.ts +2 -0
  58. package/dist/tools/landscape.js +32 -0
  59. package/dist/tools/landscape.js.map +1 -0
  60. package/dist/tools/level.d.ts +2 -0
  61. package/dist/tools/level.js +66 -0
  62. package/dist/tools/level.js.map +1 -0
  63. package/dist/tools/material.d.ts +2 -0
  64. package/dist/tools/material.js +59 -0
  65. package/dist/tools/material.js.map +1 -0
  66. package/dist/tools/networking.d.ts +2 -0
  67. package/dist/tools/networking.js +42 -0
  68. package/dist/tools/networking.js.map +1 -0
  69. package/dist/tools/niagara.d.ts +2 -0
  70. package/dist/tools/niagara.js +42 -0
  71. package/dist/tools/niagara.js.map +1 -0
  72. package/dist/tools/pcg.d.ts +2 -0
  73. package/dist/tools/pcg.js +39 -0
  74. package/dist/tools/pcg.js.map +1 -0
  75. package/dist/tools/project.d.ts +2 -0
  76. package/dist/tools/project.js +282 -0
  77. package/dist/tools/project.js.map +1 -0
  78. package/dist/tools/reflection.d.ts +2 -0
  79. package/dist/tools/reflection.js +26 -0
  80. package/dist/tools/reflection.js.map +1 -0
  81. package/dist/tools/widget.d.ts +2 -0
  82. package/dist/tools/widget.js +34 -0
  83. package/dist/tools/widget.js.map +1 -0
  84. package/dist/types.d.ts +21 -0
  85. package/dist/types.js +38 -0
  86. package/dist/types.js.map +1 -0
  87. package/package.json +76 -0
  88. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.cpp +746 -0
  89. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/BridgeServer.h +81 -0
  90. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.cpp +49 -0
  91. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/GameThreadExecutor.h +37 -0
  92. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.cpp +75 -0
  93. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/HandlerRegistry.h +50 -0
  94. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.cpp +1418 -0
  95. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers.h +43 -0
  96. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.cpp +1773 -0
  97. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AssetHandlers.h +48 -0
  98. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.cpp +289 -0
  99. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AudioHandlers.h +18 -0
  100. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +1982 -0
  101. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +44 -0
  102. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.cpp +1217 -0
  103. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DemoHandlers.h +71 -0
  104. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.cpp +465 -0
  105. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/DialogHandlers.h +49 -0
  106. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.cpp +1676 -0
  107. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/EditorHandlers.h +53 -0
  108. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.cpp +876 -0
  109. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/FoliageHandlers.h +22 -0
  110. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +2222 -0
  111. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.h +54 -0
  112. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +783 -0
  113. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.h +24 -0
  114. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.cpp +898 -0
  115. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LandscapeHandlers.h +24 -0
  116. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.cpp +1270 -0
  117. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/LevelHandlers.h +34 -0
  118. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.cpp +2190 -0
  119. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/MaterialHandlers.h +53 -0
  120. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.cpp +554 -0
  121. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NetworkingHandlers.h +29 -0
  122. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +601 -0
  123. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.h +25 -0
  124. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.cpp +1024 -0
  125. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PCGHandlers.h +25 -0
  126. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.cpp +370 -0
  127. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/PhysicsHandlers.h +19 -0
  128. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.cpp +499 -0
  129. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/ReflectionHandlers.h +27 -0
  130. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.cpp +426 -0
  131. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SequencerHandlers.h +19 -0
  132. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.cpp +303 -0
  133. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/SplineHandlers.h +18 -0
  134. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.cpp +985 -0
  135. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/WidgetHandlers.h +27 -0
  136. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.cpp +181 -0
  137. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/JsonSerializer.h +42 -0
  138. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/UE_MCP_Bridge.cpp +39 -0
  139. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Public/UE_MCP_BridgeModule.h +14 -0
  140. package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/UE_MCP_Bridge.Build.cs +87 -0
  141. 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
+ };