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,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
|
+
};
|