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,48 @@
1
+ #pragma once
2
+
3
+ #include "CoreMinimal.h"
4
+ #include "Dom/JsonValue.h"
5
+ #include "Dom/JsonObject.h"
6
+
7
+ class FAssetHandlers
8
+ {
9
+ public:
10
+ // Register all asset handlers
11
+ static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
12
+
13
+ private:
14
+ // Handler implementations
15
+ static TSharedPtr<FJsonValue> ListAssets(const TSharedPtr<FJsonObject>& Params);
16
+ static TSharedPtr<FJsonValue> SearchAssets(const TSharedPtr<FJsonObject>& Params);
17
+ static TSharedPtr<FJsonValue> ReadAsset(const TSharedPtr<FJsonObject>& Params);
18
+ static TSharedPtr<FJsonValue> ReadAssetProperties(const TSharedPtr<FJsonObject>& Params);
19
+ static TSharedPtr<FJsonValue> DuplicateAsset(const TSharedPtr<FJsonObject>& Params);
20
+ static TSharedPtr<FJsonValue> RenameAsset(const TSharedPtr<FJsonObject>& Params);
21
+ static TSharedPtr<FJsonValue> MoveAsset(const TSharedPtr<FJsonObject>& Params);
22
+ static TSharedPtr<FJsonValue> DeleteAsset(const TSharedPtr<FJsonObject>& Params);
23
+ static TSharedPtr<FJsonValue> SaveAsset(const TSharedPtr<FJsonObject>& Params);
24
+ static TSharedPtr<FJsonValue> ListTextures(const TSharedPtr<FJsonObject>& Params);
25
+
26
+ // DataTable handlers
27
+ static TSharedPtr<FJsonValue> ImportDataTableJson(const TSharedPtr<FJsonObject>& Params);
28
+ static TSharedPtr<FJsonValue> ExportDataTableJson(const TSharedPtr<FJsonObject>& Params);
29
+ static TSharedPtr<FJsonValue> CreateDataTable(const TSharedPtr<FJsonObject>& Params);
30
+ static TSharedPtr<FJsonValue> ReadDataTable(const TSharedPtr<FJsonObject>& Params);
31
+ static TSharedPtr<FJsonValue> ReimportDataTable(const TSharedPtr<FJsonObject>& Params);
32
+
33
+ // FBX import handlers
34
+ static TSharedPtr<FJsonValue> ImportStaticMesh(const TSharedPtr<FJsonObject>& Params);
35
+ static TSharedPtr<FJsonValue> ImportSkeletalMesh(const TSharedPtr<FJsonObject>& Params);
36
+ static TSharedPtr<FJsonValue> ImportAnimation(const TSharedPtr<FJsonObject>& Params);
37
+
38
+ // Mesh material handlers
39
+ static TSharedPtr<FJsonValue> SetMeshMaterial(const TSharedPtr<FJsonObject>& Params);
40
+
41
+ // Mesh pivot handlers
42
+ static TSharedPtr<FJsonValue> RecenterPivot(const TSharedPtr<FJsonObject>& Params);
43
+
44
+ // Texture handlers
45
+ static TSharedPtr<FJsonValue> ListTextureProperties(const TSharedPtr<FJsonObject>& Params);
46
+ static TSharedPtr<FJsonValue> SetTextureProperties(const TSharedPtr<FJsonObject>& Params);
47
+ static TSharedPtr<FJsonValue> ImportTexture(const TSharedPtr<FJsonObject>& Params);
48
+ };
@@ -0,0 +1,289 @@
1
+ #include "AudioHandlers.h"
2
+ #include "HandlerRegistry.h"
3
+ #include "AssetRegistry/AssetRegistryModule.h"
4
+ #include "AssetToolsModule.h"
5
+ #include "IAssetTools.h"
6
+ #include "UObject/UObjectGlobals.h"
7
+ #include "UObject/Package.h"
8
+ #include "Misc/PackageName.h"
9
+ #include "UObject/SavePackage.h"
10
+ #include "EditorScriptingUtilities/Public/EditorAssetLibrary.h"
11
+ #include "Sound/SoundCue.h"
12
+ #include "Factories/SoundCueFactoryNew.h"
13
+ #include "Dom/JsonObject.h"
14
+ #include "Dom/JsonValue.h"
15
+ #include "Kismet/GameplayStatics.h"
16
+ #include "Sound/AmbientSound.h"
17
+ #include "Components/AudioComponent.h"
18
+
19
+ void FAudioHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
20
+ {
21
+ Registry.RegisterHandler(TEXT("list_sound_assets"), &ListSoundAssets);
22
+ Registry.RegisterHandler(TEXT("create_sound_cue"), &CreateSoundCue);
23
+ Registry.RegisterHandler(TEXT("create_metasound_source"), &CreateMetaSoundSource);
24
+ Registry.RegisterHandler(TEXT("play_sound_at_location"), &PlaySoundAtLocation);
25
+ Registry.RegisterHandler(TEXT("spawn_ambient_sound"), &SpawnAmbientSound);
26
+ }
27
+
28
+ TSharedPtr<FJsonValue> FAudioHandlers::ListSoundAssets(const TSharedPtr<FJsonObject>& Params)
29
+ {
30
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
31
+
32
+ bool bRecursive = true;
33
+ Params->TryGetBoolField(TEXT("recursive"), bRecursive);
34
+
35
+ IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(TEXT("AssetRegistry")).Get();
36
+
37
+ TArray<FTopLevelAssetPath> ClassPaths;
38
+ ClassPaths.Add(FTopLevelAssetPath(TEXT("/Script/Engine"), TEXT("SoundWave")));
39
+ ClassPaths.Add(FTopLevelAssetPath(TEXT("/Script/Engine"), TEXT("SoundCue")));
40
+ ClassPaths.Add(FTopLevelAssetPath(TEXT("/Script/MetasoundEngine"), TEXT("MetaSoundSource")));
41
+
42
+ TArray<TSharedPtr<FJsonValue>> AssetsArray;
43
+
44
+ for (const FTopLevelAssetPath& ClassPath : ClassPaths)
45
+ {
46
+ TArray<FAssetData> AssetDataList;
47
+ AssetRegistry.GetAssetsByClass(ClassPath, AssetDataList, bRecursive);
48
+
49
+ for (const FAssetData& AssetData : AssetDataList)
50
+ {
51
+ TSharedPtr<FJsonObject> AssetObj = MakeShared<FJsonObject>();
52
+ AssetObj->SetStringField(TEXT("name"), AssetData.AssetName.ToString());
53
+ AssetObj->SetStringField(TEXT("path"), AssetData.GetObjectPathString());
54
+ AssetObj->SetStringField(TEXT("class"), AssetData.AssetClassPath.GetAssetName().ToString());
55
+ AssetObj->SetStringField(TEXT("packagePath"), AssetData.PackagePath.ToString());
56
+ AssetsArray.Add(MakeShared<FJsonValueObject>(AssetObj));
57
+ }
58
+ }
59
+
60
+ Result->SetArrayField(TEXT("assets"), AssetsArray);
61
+ Result->SetNumberField(TEXT("count"), AssetsArray.Num());
62
+ Result->SetBoolField(TEXT("success"), true);
63
+
64
+ return MakeShared<FJsonValueObject>(Result);
65
+ }
66
+
67
+ TSharedPtr<FJsonValue> FAudioHandlers::CreateSoundCue(const TSharedPtr<FJsonObject>& Params)
68
+ {
69
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
70
+
71
+ FString Name;
72
+ if (!Params->TryGetStringField(TEXT("name"), Name))
73
+ {
74
+ Result->SetStringField(TEXT("error"), TEXT("Missing 'name' parameter"));
75
+ Result->SetBoolField(TEXT("success"), false);
76
+ return MakeShared<FJsonValueObject>(Result);
77
+ }
78
+
79
+ FString PackagePath = TEXT("/Game/Audio/SoundCues");
80
+ Params->TryGetStringField(TEXT("packagePath"), PackagePath);
81
+
82
+ // Delete existing asset if it exists
83
+ FString FullAssetPath = PackagePath + TEXT("/") + Name;
84
+ UEditorAssetLibrary::DeleteAsset(FullAssetPath);
85
+
86
+ FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
87
+ IAssetTools& AssetTools = AssetToolsModule.Get();
88
+
89
+ USoundCueFactoryNew* SoundCueFactory = NewObject<USoundCueFactoryNew>();
90
+ UObject* NewAsset = AssetTools.CreateAsset(Name, PackagePath, USoundCue::StaticClass(), SoundCueFactory);
91
+ if (!NewAsset)
92
+ {
93
+ Result->SetStringField(TEXT("error"), TEXT("Failed to create SoundCue"));
94
+ Result->SetBoolField(TEXT("success"), false);
95
+ return MakeShared<FJsonValueObject>(Result);
96
+ }
97
+
98
+ UEditorAssetLibrary::SaveAsset(NewAsset->GetPathName());
99
+
100
+ Result->SetStringField(TEXT("path"), NewAsset->GetPathName());
101
+ Result->SetStringField(TEXT("name"), Name);
102
+ Result->SetBoolField(TEXT("success"), true);
103
+
104
+ return MakeShared<FJsonValueObject>(Result);
105
+ }
106
+
107
+ TSharedPtr<FJsonValue> FAudioHandlers::CreateMetaSoundSource(const TSharedPtr<FJsonObject>& Params)
108
+ {
109
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
110
+
111
+ FString Name;
112
+ if (!Params->TryGetStringField(TEXT("name"), Name))
113
+ {
114
+ Result->SetStringField(TEXT("error"), TEXT("Missing 'name' parameter"));
115
+ Result->SetBoolField(TEXT("success"), false);
116
+ return MakeShared<FJsonValueObject>(Result);
117
+ }
118
+
119
+ FString PackagePath = TEXT("/Game/Audio/MetaSounds");
120
+ Params->TryGetStringField(TEXT("packagePath"), PackagePath);
121
+
122
+ // Find MetaSoundSource class
123
+ UClass* MetaSoundSourceClass = FindObject<UClass>(nullptr, TEXT("/Script/MetasoundEngine.MetaSoundSource"));
124
+ if (!MetaSoundSourceClass)
125
+ {
126
+ Result->SetStringField(TEXT("error"), TEXT("MetaSoundSource class not found. Enable MetaSound plugin."));
127
+ Result->SetBoolField(TEXT("success"), false);
128
+ return MakeShared<FJsonValueObject>(Result);
129
+ }
130
+
131
+ // Delete existing asset if it exists
132
+ FString FullAssetPath = PackagePath + TEXT("/") + Name;
133
+ UEditorAssetLibrary::DeleteAsset(FullAssetPath);
134
+
135
+ FAssetToolsModule& AssetToolsModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>(TEXT("AssetTools"));
136
+ IAssetTools& AssetTools = AssetToolsModule.Get();
137
+
138
+ UObject* NewAsset = AssetTools.CreateAsset(Name, PackagePath, MetaSoundSourceClass, nullptr);
139
+ if (!NewAsset)
140
+ {
141
+ Result->SetStringField(TEXT("error"), TEXT("Failed to create MetaSoundSource"));
142
+ Result->SetBoolField(TEXT("success"), false);
143
+ return MakeShared<FJsonValueObject>(Result);
144
+ }
145
+
146
+ UEditorAssetLibrary::SaveAsset(NewAsset->GetPathName());
147
+
148
+ Result->SetStringField(TEXT("path"), NewAsset->GetPathName());
149
+ Result->SetStringField(TEXT("name"), Name);
150
+ Result->SetBoolField(TEXT("success"), true);
151
+
152
+ return MakeShared<FJsonValueObject>(Result);
153
+ }
154
+
155
+ TSharedPtr<FJsonValue> FAudioHandlers::PlaySoundAtLocation(const TSharedPtr<FJsonObject>& Params)
156
+ {
157
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
158
+
159
+ // Get required sound asset path
160
+ FString SoundPath;
161
+ if (!Params->TryGetStringField(TEXT("assetPath"), SoundPath) && !Params->TryGetStringField(TEXT("path"), SoundPath))
162
+ {
163
+ Result->SetStringField(TEXT("error"), TEXT("Missing 'path' or 'assetPath' parameter"));
164
+ Result->SetBoolField(TEXT("success"), false);
165
+ return MakeShared<FJsonValueObject>(Result);
166
+ }
167
+
168
+ // Load the sound asset
169
+ USoundBase* Sound = Cast<USoundBase>(UEditorAssetLibrary::LoadAsset(SoundPath));
170
+ if (!Sound)
171
+ {
172
+ Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Sound not found: %s"), *SoundPath));
173
+ Result->SetBoolField(TEXT("success"), false);
174
+ return MakeShared<FJsonValueObject>(Result);
175
+ }
176
+
177
+ // Get the editor world
178
+ UWorld* World = GEditor ? GEditor->GetEditorWorldContext().World() : nullptr;
179
+ if (!World)
180
+ {
181
+ Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
182
+ Result->SetBoolField(TEXT("success"), false);
183
+ return MakeShared<FJsonValueObject>(Result);
184
+ }
185
+
186
+ // Parse location from JSON object (defaults to origin)
187
+ FVector Location = FVector::ZeroVector;
188
+ const TSharedPtr<FJsonObject>* LocationObj = nullptr;
189
+ if (Params->TryGetObjectField(TEXT("location"), LocationObj))
190
+ {
191
+ (*LocationObj)->TryGetNumberField(TEXT("x"), Location.X);
192
+ (*LocationObj)->TryGetNumberField(TEXT("y"), Location.Y);
193
+ (*LocationObj)->TryGetNumberField(TEXT("z"), Location.Z);
194
+ }
195
+
196
+ // Parse optional volume and pitch multipliers (accept both short and long names)
197
+ double Volume = 1.0;
198
+ double Pitch = 1.0;
199
+ if (!Params->TryGetNumberField(TEXT("volume"), Volume))
200
+ {
201
+ Params->TryGetNumberField(TEXT("volumeMultiplier"), Volume);
202
+ }
203
+ if (!Params->TryGetNumberField(TEXT("pitch"), Pitch))
204
+ {
205
+ Params->TryGetNumberField(TEXT("pitchMultiplier"), Pitch);
206
+ }
207
+
208
+ // Play the sound at the specified location
209
+ UGameplayStatics::PlaySoundAtLocation(World, Sound, Location, static_cast<float>(Volume), static_cast<float>(Pitch));
210
+
211
+ Result->SetStringField(TEXT("assetPath"), SoundPath);
212
+ Result->SetBoolField(TEXT("success"), true);
213
+
214
+ return MakeShared<FJsonValueObject>(Result);
215
+ }
216
+
217
+ TSharedPtr<FJsonValue> FAudioHandlers::SpawnAmbientSound(const TSharedPtr<FJsonObject>& Params)
218
+ {
219
+ TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
220
+
221
+ // Get required sound asset path
222
+ FString SoundPath;
223
+ if (!Params->TryGetStringField(TEXT("assetPath"), SoundPath) && !Params->TryGetStringField(TEXT("path"), SoundPath))
224
+ {
225
+ Result->SetStringField(TEXT("error"), TEXT("Missing 'path' or 'assetPath' parameter"));
226
+ Result->SetBoolField(TEXT("success"), false);
227
+ return MakeShared<FJsonValueObject>(Result);
228
+ }
229
+
230
+ // Get the editor world
231
+ UWorld* World = GEditor ? GEditor->GetEditorWorldContext().World() : nullptr;
232
+ if (!World)
233
+ {
234
+ Result->SetStringField(TEXT("error"), TEXT("Editor world not available"));
235
+ Result->SetBoolField(TEXT("success"), false);
236
+ return MakeShared<FJsonValueObject>(Result);
237
+ }
238
+
239
+ // Parse location from JSON object (defaults to origin)
240
+ FVector Location = FVector::ZeroVector;
241
+ const TSharedPtr<FJsonObject>* LocationObj = nullptr;
242
+ if (Params->TryGetObjectField(TEXT("location"), LocationObj))
243
+ {
244
+ (*LocationObj)->TryGetNumberField(TEXT("x"), Location.X);
245
+ (*LocationObj)->TryGetNumberField(TEXT("y"), Location.Y);
246
+ (*LocationObj)->TryGetNumberField(TEXT("z"), Location.Z);
247
+ }
248
+
249
+ // Spawn the AmbientSound actor
250
+ FTransform SpawnTransform(FRotator::ZeroRotator, Location);
251
+ AAmbientSound* AmbientSoundActor = World->SpawnActor<AAmbientSound>(AAmbientSound::StaticClass(), SpawnTransform);
252
+ if (!AmbientSoundActor)
253
+ {
254
+ Result->SetStringField(TEXT("error"), TEXT("Failed to spawn AmbientSound actor"));
255
+ Result->SetBoolField(TEXT("success"), false);
256
+ return MakeShared<FJsonValueObject>(Result);
257
+ }
258
+
259
+ // Set actor label if provided
260
+ FString Label;
261
+ if (Params->TryGetStringField(TEXT("label"), Label) && !Label.IsEmpty())
262
+ {
263
+ AmbientSoundActor->SetActorLabel(Label);
264
+ }
265
+
266
+ // Load and assign the sound asset to the AudioComponent
267
+ USoundBase* Sound = Cast<USoundBase>(UEditorAssetLibrary::LoadAsset(SoundPath));
268
+ if (Sound)
269
+ {
270
+ UAudioComponent* AudioComp = AmbientSoundActor->GetAudioComponent();
271
+ if (AudioComp)
272
+ {
273
+ AudioComp->SetSound(Sound);
274
+
275
+ // Apply optional volume multiplier
276
+ double Volume = 1.0;
277
+ if (Params->TryGetNumberField(TEXT("volume"), Volume))
278
+ {
279
+ AudioComp->VolumeMultiplier = static_cast<float>(Volume);
280
+ }
281
+ }
282
+ }
283
+
284
+ Result->SetStringField(TEXT("assetPath"), SoundPath);
285
+ Result->SetStringField(TEXT("label"), AmbientSoundActor->GetActorLabel());
286
+ Result->SetBoolField(TEXT("success"), true);
287
+
288
+ return MakeShared<FJsonValueObject>(Result);
289
+ }
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include "CoreMinimal.h"
4
+ #include "Dom/JsonValue.h"
5
+ #include "Dom/JsonObject.h"
6
+
7
+ class FAudioHandlers
8
+ {
9
+ public:
10
+ static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
11
+
12
+ private:
13
+ static TSharedPtr<FJsonValue> ListSoundAssets(const TSharedPtr<FJsonObject>& Params);
14
+ static TSharedPtr<FJsonValue> CreateSoundCue(const TSharedPtr<FJsonObject>& Params);
15
+ static TSharedPtr<FJsonValue> CreateMetaSoundSource(const TSharedPtr<FJsonObject>& Params);
16
+ static TSharedPtr<FJsonValue> PlaySoundAtLocation(const TSharedPtr<FJsonObject>& Params);
17
+ static TSharedPtr<FJsonValue> SpawnAmbientSound(const TSharedPtr<FJsonObject>& Params);
18
+ };