ultimate-unreal-engine-mcp 0.1.0
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/README.md +729 -0
- package/dist/build/error-parser.js +51 -0
- package/dist/build/fix-suggester.js +84 -0
- package/dist/build/ubt-runner.js +146 -0
- package/dist/cli.js +13 -0
- package/dist/config.js +8 -0
- package/dist/docs/data/ue57-api.js +228 -0
- package/dist/docs/doc-index.js +110 -0
- package/dist/docs/types.js +4 -0
- package/dist/generators/class-generator.js +363 -0
- package/dist/generators/file-modifier.js +276 -0
- package/dist/generators/uht-validator.js +177 -0
- package/dist/index.js +89 -0
- package/dist/parsers/cpp-class-index.js +230 -0
- package/dist/parsers/cpp-parser.js +369 -0
- package/dist/parsers/ini-parser.js +216 -0
- package/dist/parsers/uproject-parser.js +130 -0
- package/dist/plugin-bridge/client.js +217 -0
- package/dist/plugin-bridge/protocol.js +6 -0
- package/dist/plugin-bridge/retry.js +23 -0
- package/dist/setup.js +209 -0
- package/dist/tools/ai-systems/index.js +247 -0
- package/dist/tools/ai-systems/types.js +4 -0
- package/dist/tools/animation/index.js +241 -0
- package/dist/tools/animation/types.js +4 -0
- package/dist/tools/audio/index.js +204 -0
- package/dist/tools/audio/types.js +4 -0
- package/dist/tools/blueprint/index.js +495 -0
- package/dist/tools/blueprint/types.js +4 -0
- package/dist/tools/build/index.js +163 -0
- package/dist/tools/chaos/index.js +230 -0
- package/dist/tools/chaos/types.js +4 -0
- package/dist/tools/collision-physics/index.js +211 -0
- package/dist/tools/config/index.js +288 -0
- package/dist/tools/cpp/index.js +305 -0
- package/dist/tools/docs/index.js +251 -0
- package/dist/tools/editor/index.js +242 -0
- package/dist/tools/gas/index.js +222 -0
- package/dist/tools/gas/types.js +5 -0
- package/dist/tools/import-export/index.js +218 -0
- package/dist/tools/input/index.js +146 -0
- package/dist/tools/known-issues/index.js +88 -0
- package/dist/tools/known-issues/middleware.js +55 -0
- package/dist/tools/known-issues/store.js +125 -0
- package/dist/tools/livelink/index.js +203 -0
- package/dist/tools/livelink/types.js +4 -0
- package/dist/tools/material/index.js +190 -0
- package/dist/tools/motion-design/index.js +251 -0
- package/dist/tools/motion-design/types.js +6 -0
- package/dist/tools/movie-render/index.js +220 -0
- package/dist/tools/networking/index.js +149 -0
- package/dist/tools/pcg/index.js +164 -0
- package/dist/tools/selection/index.js +180 -0
- package/dist/tools/sequencer/index.js +218 -0
- package/dist/tools/validation/index.js +183 -0
- package/dist/tools/validation/types.js +4 -0
- package/dist/tools/viewport/index.js +310 -0
- package/dist/tools/worldpartition/index.js +226 -0
- package/dist/tools/worldpartition/types.js +4 -0
- package/dist/utils/execFileNoThrow.js +40 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/path-guard.js +26 -0
- package/package.json +40 -0
- package/unreal-plugin/MCPBridge/MCPBridge.uplugin +29 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/MCPBridgeEditor.Build.cs +68 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAICommands.cpp +919 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAICommands.h +23 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPActorCommands.cpp +415 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPActorCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAnimationCommands.cpp +653 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAnimationCommands.h +24 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAssetCommands.cpp +290 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAssetCommands.h +17 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAudioCommands.cpp +624 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPAudioCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBlueprintHandlers.cpp +616 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBlueprintHandlers.h +25 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBlueprintWriteHandlers.cpp +744 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBlueprintWriteHandlers.h +24 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBridgeEditor.cpp +23 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBridgeSubsystem.cpp +149 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPBridgeSubsystem.h +38 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPChaosCommands.cpp +771 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPChaosCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPCollisionPhysicsCommands.cpp +749 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPCollisionPhysicsCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPEditorStateCommands.cpp +172 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPEditorStateCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPGASCommands.cpp +715 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPGASCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPImportExportCommands.cpp +679 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPImportExportCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPInputHandlers.cpp +381 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPInputHandlers.h +24 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPLiveLinkCommands.cpp +504 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPLiveLinkCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMaterialCommands.cpp +511 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMaterialCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMotionDesignCommands.cpp +1110 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMotionDesignCommands.h +28 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMovieRenderCommands.cpp +590 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPMovieRenderCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPNetworkingCommands.cpp +482 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPNetworkingCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPPieCommands.cpp +338 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPPieCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPSelectionCommands.cpp +677 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPSelectionCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPSequencerCommands.cpp +721 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPSequencerCommands.h +16 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPValidationCommands.cpp +368 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPValidationCommands.h +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPViewportCommands.cpp +1208 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPViewportCommands.h +29 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPWorldPartitionCommands.cpp +822 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Private/MCPWorldPartitionCommands.h +23 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeEditor/Public/MCPBridgeEditor.h +14 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/MCPBridgeRuntime.Build.cs +28 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Private/MCPBridgeRuntime.cpp +22 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Private/MCPCommandRouter.cpp +118 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Private/MCPTcpServer.cpp +196 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Public/MCPBridgeRuntime.h +15 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Public/MCPCommandRouter.h +55 -0
- package/unreal-plugin/MCPBridge/Source/MCPBridgeRuntime/Public/MCPTcpServer.h +59 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// MCPCollisionPhysicsCommands.h (Plan 20-01)
|
|
2
|
+
// Declares handler registration for collision configuration and physics inspection commands.
|
|
3
|
+
// Handles: collision.read, collision.set, physics.material, physics.asset
|
|
4
|
+
//
|
|
5
|
+
// Call RegisterCollisionPhysicsCommands(*Router) in MCPBridgeSubsystem::Initialize()
|
|
6
|
+
// BEFORE the TCP server starts accepting connections.
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "MCPCommandRouter.h"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Register all collision and physics command handlers into the given router.
|
|
14
|
+
* Must be called on the game thread before connections arrive.
|
|
15
|
+
*
|
|
16
|
+
* Registered commands:
|
|
17
|
+
* collision.read -- read collision preset, enabled state, object type, and per-channel response map for a component (PHY-01)
|
|
18
|
+
* collision.set -- apply collision preset or individual channel overrides to a component (PHY-02)
|
|
19
|
+
* physics.material -- read and set friction, restitution, density, and surface type on a UPhysicalMaterial (PHY-03)
|
|
20
|
+
* physics.asset -- return per-bone body setup with primitive shapes (capsules, spheres, boxes) and dimensions (PHY-04)
|
|
21
|
+
*/
|
|
22
|
+
void RegisterCollisionPhysicsCommands(FMCPCommandRouter& Router);
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// MCPEditorStateCommands.cpp
|
|
2
|
+
// Implements MCP command handlers for editor state inspection.
|
|
3
|
+
//
|
|
4
|
+
// editor.state -- selected actors, open assets, viewport camera position/rotation/FOV
|
|
5
|
+
//
|
|
6
|
+
// All handlers are guaranteed to run on the game thread (FMCPCommandRouter guarantee via AsyncTask).
|
|
7
|
+
// GEditor->GetSelectedActors() and viewport APIs are only valid on the game thread.
|
|
8
|
+
|
|
9
|
+
#include "MCPEditorStateCommands.h"
|
|
10
|
+
|
|
11
|
+
#include "Editor.h"
|
|
12
|
+
#include "EditorViewportClient.h"
|
|
13
|
+
#include "LevelEditorViewport.h"
|
|
14
|
+
#include "EngineUtils.h"
|
|
15
|
+
#include "Engine/World.h"
|
|
16
|
+
#include "Subsystems/AssetEditorSubsystem.h"
|
|
17
|
+
#include "Serialization/JsonSerializer.h"
|
|
18
|
+
#include "Serialization/JsonWriter.h"
|
|
19
|
+
#include "Dom/JsonObject.h"
|
|
20
|
+
#include "Dom/JsonValue.h"
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Internal JSON response helpers
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
static FString BuildEditorStateSuccessResponse(const FString& CorrId, TSharedPtr<FJsonObject> Data)
|
|
27
|
+
{
|
|
28
|
+
TSharedPtr<FJsonObject> Obj = MakeShared<FJsonObject>();
|
|
29
|
+
Obj->SetBoolField(TEXT("success"), true);
|
|
30
|
+
Obj->SetStringField(TEXT("correlationId"), CorrId);
|
|
31
|
+
if (Data.IsValid())
|
|
32
|
+
{
|
|
33
|
+
Obj->SetObjectField(TEXT("data"), Data);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
FString Output;
|
|
37
|
+
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&Output);
|
|
38
|
+
FJsonSerializer::Serialize(Obj.ToSharedRef(), Writer);
|
|
39
|
+
return Output;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static FString BuildEditorStateErrorResponse(const FString& CorrId, const FString& Error)
|
|
43
|
+
{
|
|
44
|
+
TSharedPtr<FJsonObject> Obj = MakeShared<FJsonObject>();
|
|
45
|
+
Obj->SetBoolField(TEXT("success"), false);
|
|
46
|
+
Obj->SetStringField(TEXT("correlationId"), CorrId);
|
|
47
|
+
Obj->SetStringField(TEXT("error"), Error);
|
|
48
|
+
|
|
49
|
+
FString Output;
|
|
50
|
+
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&Output);
|
|
51
|
+
FJsonSerializer::Serialize(Obj.ToSharedRef(), Writer);
|
|
52
|
+
return Output;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// RegisterEditorStateCommands
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
|
|
59
|
+
void RegisterEditorStateCommands(FMCPCommandRouter& Router)
|
|
60
|
+
{
|
|
61
|
+
// -----------------------------------------------------------------------
|
|
62
|
+
// editor.state
|
|
63
|
+
// Returns:
|
|
64
|
+
// - selectedActors: [{label, class, id}, ...]
|
|
65
|
+
// - openAssets: ["/Game/Path/Asset", ...]
|
|
66
|
+
// - viewport: {location:{x,y,z}, rotation:{pitch,yaw,roll}, fov:float}
|
|
67
|
+
// -----------------------------------------------------------------------
|
|
68
|
+
Router.RegisterHandler(TEXT("editor.state"), [](TSharedPtr<FJsonObject> Cmd, FMCPResponseSender SendResponse)
|
|
69
|
+
{
|
|
70
|
+
const FString CorrId = Cmd->GetStringField(TEXT("correlationId"));
|
|
71
|
+
|
|
72
|
+
if (!GEditor)
|
|
73
|
+
{
|
|
74
|
+
SendResponse(BuildEditorStateErrorResponse(CorrId, TEXT("no_editor")) + TEXT("\n"));
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// -------------------------------------------------------------------
|
|
79
|
+
// 1. Selected actors
|
|
80
|
+
// -------------------------------------------------------------------
|
|
81
|
+
TArray<TSharedPtr<FJsonValue>> SelectedActorsArray;
|
|
82
|
+
|
|
83
|
+
USelection* Selection = GEditor->GetSelectedActors();
|
|
84
|
+
if (Selection)
|
|
85
|
+
{
|
|
86
|
+
for (FSelectionIterator It(*Selection); It; ++It)
|
|
87
|
+
{
|
|
88
|
+
AActor* Actor = Cast<AActor>(*It);
|
|
89
|
+
if (!Actor)
|
|
90
|
+
{
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
TSharedPtr<FJsonObject> ActorObj = MakeShared<FJsonObject>();
|
|
95
|
+
ActorObj->SetStringField(TEXT("label"), Actor->GetActorLabel());
|
|
96
|
+
ActorObj->SetStringField(TEXT("class"), Actor->GetClass()->GetName());
|
|
97
|
+
ActorObj->SetStringField(TEXT("id"), Actor->GetName());
|
|
98
|
+
|
|
99
|
+
SelectedActorsArray.Add(MakeShared<FJsonValueObject>(ActorObj));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// -------------------------------------------------------------------
|
|
104
|
+
// 2. Open assets (via UAssetEditorSubsystem)
|
|
105
|
+
// -------------------------------------------------------------------
|
|
106
|
+
TArray<TSharedPtr<FJsonValue>> OpenAssetsArray;
|
|
107
|
+
|
|
108
|
+
UAssetEditorSubsystem* AssetEditorSubsystem = GEditor->GetEditorSubsystem<UAssetEditorSubsystem>();
|
|
109
|
+
if (AssetEditorSubsystem)
|
|
110
|
+
{
|
|
111
|
+
TArray<UObject*> EditedAssets = AssetEditorSubsystem->GetAllEditedAssets();
|
|
112
|
+
for (UObject* Asset : EditedAssets)
|
|
113
|
+
{
|
|
114
|
+
if (Asset)
|
|
115
|
+
{
|
|
116
|
+
OpenAssetsArray.Add(MakeShared<FJsonValueString>(Asset->GetPathName()));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// -------------------------------------------------------------------
|
|
122
|
+
// 3. Viewport camera (first FLevelEditorViewportClient found)
|
|
123
|
+
// -------------------------------------------------------------------
|
|
124
|
+
FVector CamLocation(0.0f, 0.0f, 0.0f);
|
|
125
|
+
FRotator CamRotation(0.0f, 0.0f, 0.0f);
|
|
126
|
+
float CamFOV = 90.0f;
|
|
127
|
+
|
|
128
|
+
for (FEditorViewportClient* ViewportClient : GEditor->GetAllViewportClients())
|
|
129
|
+
{
|
|
130
|
+
FLevelEditorViewportClient* LevelVP = static_cast<FLevelEditorViewportClient*>(ViewportClient);
|
|
131
|
+
// Only cast if the pointer is actually a FLevelEditorViewportClient.
|
|
132
|
+
// FEditorViewportClient does not use UObject hierarchy, so we check
|
|
133
|
+
// the viewport type to confirm it is a level editor viewport.
|
|
134
|
+
if (LevelVP && ViewportClient->GetEditorViewportWidget().IsValid())
|
|
135
|
+
{
|
|
136
|
+
// Prefer the first perspective viewport; take any non-null.
|
|
137
|
+
CamLocation = LevelVP->GetViewLocation();
|
|
138
|
+
CamRotation = LevelVP->GetViewRotation();
|
|
139
|
+
CamFOV = LevelVP->ViewFOV;
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Build viewport location object.
|
|
145
|
+
TSharedPtr<FJsonObject> LocObj = MakeShared<FJsonObject>();
|
|
146
|
+
LocObj->SetNumberField(TEXT("x"), static_cast<double>(CamLocation.X));
|
|
147
|
+
LocObj->SetNumberField(TEXT("y"), static_cast<double>(CamLocation.Y));
|
|
148
|
+
LocObj->SetNumberField(TEXT("z"), static_cast<double>(CamLocation.Z));
|
|
149
|
+
|
|
150
|
+
// Build viewport rotation object.
|
|
151
|
+
TSharedPtr<FJsonObject> RotObj = MakeShared<FJsonObject>();
|
|
152
|
+
RotObj->SetNumberField(TEXT("pitch"), static_cast<double>(CamRotation.Pitch));
|
|
153
|
+
RotObj->SetNumberField(TEXT("yaw"), static_cast<double>(CamRotation.Yaw));
|
|
154
|
+
RotObj->SetNumberField(TEXT("roll"), static_cast<double>(CamRotation.Roll));
|
|
155
|
+
|
|
156
|
+
// Build viewport object.
|
|
157
|
+
TSharedPtr<FJsonObject> ViewportObj = MakeShared<FJsonObject>();
|
|
158
|
+
ViewportObj->SetObjectField(TEXT("location"), LocObj);
|
|
159
|
+
ViewportObj->SetObjectField(TEXT("rotation"), RotObj);
|
|
160
|
+
ViewportObj->SetNumberField(TEXT("fov"), static_cast<double>(CamFOV));
|
|
161
|
+
|
|
162
|
+
// -------------------------------------------------------------------
|
|
163
|
+
// 4. Assemble final data object
|
|
164
|
+
// -------------------------------------------------------------------
|
|
165
|
+
TSharedPtr<FJsonObject> Data = MakeShared<FJsonObject>();
|
|
166
|
+
Data->SetArrayField(TEXT("selectedActors"), SelectedActorsArray);
|
|
167
|
+
Data->SetArrayField(TEXT("openAssets"), OpenAssetsArray);
|
|
168
|
+
Data->SetObjectField(TEXT("viewport"), ViewportObj);
|
|
169
|
+
|
|
170
|
+
SendResponse(BuildEditorStateSuccessResponse(CorrId, Data) + TEXT("\n"));
|
|
171
|
+
});
|
|
172
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// MCPEditorStateCommands.h
|
|
2
|
+
// Declares handler registration for editor state inspection.
|
|
3
|
+
// Handles: editor.state
|
|
4
|
+
//
|
|
5
|
+
// Call RegisterEditorStateCommands(*Router) in MCPBridgeSubsystem::Initialize()
|
|
6
|
+
// BEFORE the TCP server starts accepting connections.
|
|
7
|
+
|
|
8
|
+
#pragma once
|
|
9
|
+
|
|
10
|
+
#include "MCPCommandRouter.h"
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Register the editor.state command handler into the given router.
|
|
14
|
+
* Must be called on the game thread before connections arrive.
|
|
15
|
+
*/
|
|
16
|
+
void RegisterEditorStateCommands(FMCPCommandRouter& Router);
|