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,53 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FMaterialHandlers
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
|
|
11
|
+
|
|
12
|
+
private:
|
|
13
|
+
static TSharedPtr<FJsonValue> ListExpressionTypes(const TSharedPtr<FJsonObject>& Params);
|
|
14
|
+
static TSharedPtr<FJsonValue> CreateMaterial(const TSharedPtr<FJsonObject>& Params);
|
|
15
|
+
static TSharedPtr<FJsonValue> ReadMaterial(const TSharedPtr<FJsonObject>& Params);
|
|
16
|
+
static TSharedPtr<FJsonValue> SetMaterialShadingModel(const TSharedPtr<FJsonObject>& Params);
|
|
17
|
+
static TSharedPtr<FJsonValue> SetMaterialBlendMode(const TSharedPtr<FJsonObject>& Params);
|
|
18
|
+
static TSharedPtr<FJsonValue> SetMaterialBaseColor(const TSharedPtr<FJsonObject>& Params);
|
|
19
|
+
static TSharedPtr<FJsonValue> AddMaterialExpression(const TSharedPtr<FJsonObject>& Params);
|
|
20
|
+
static TSharedPtr<FJsonValue> ListMaterialExpressions(const TSharedPtr<FJsonObject>& Params);
|
|
21
|
+
static TSharedPtr<FJsonValue> ListMaterialParameters(const TSharedPtr<FJsonObject>& Params);
|
|
22
|
+
static TSharedPtr<FJsonValue> RecompileMaterial(const TSharedPtr<FJsonObject>& Params);
|
|
23
|
+
static TSharedPtr<FJsonValue> CreateMaterialInstance(const TSharedPtr<FJsonObject>& Params);
|
|
24
|
+
static TSharedPtr<FJsonValue> SetMaterialParameter(const TSharedPtr<FJsonObject>& Params);
|
|
25
|
+
static TSharedPtr<FJsonValue> ConnectExpression(const TSharedPtr<FJsonObject>& Params);
|
|
26
|
+
static TSharedPtr<FJsonValue> ConnectMaterialProperty(const TSharedPtr<FJsonObject>& Params);
|
|
27
|
+
static TSharedPtr<FJsonValue> DeleteExpression(const TSharedPtr<FJsonObject>& Params);
|
|
28
|
+
static TSharedPtr<FJsonValue> SetExpressionValue(const TSharedPtr<FJsonObject>& Params);
|
|
29
|
+
static TSharedPtr<FJsonValue> CreateMaterialFromTexture(const TSharedPtr<FJsonObject>& Params);
|
|
30
|
+
static TSharedPtr<FJsonValue> ReadMaterialInstance(const TSharedPtr<FJsonObject>& Params);
|
|
31
|
+
|
|
32
|
+
// Name-based handlers matching TS tool expectations
|
|
33
|
+
static TSharedPtr<FJsonValue> ConnectTextureToMaterial(const TSharedPtr<FJsonObject>& Params);
|
|
34
|
+
static TSharedPtr<FJsonValue> ConnectMaterialExpressions(const TSharedPtr<FJsonObject>& Params);
|
|
35
|
+
static TSharedPtr<FJsonValue> ConnectToMaterialProperty(const TSharedPtr<FJsonObject>& Params);
|
|
36
|
+
static TSharedPtr<FJsonValue> DeleteMaterialExpression(const TSharedPtr<FJsonObject>& Params);
|
|
37
|
+
|
|
38
|
+
// Helper to load a UMaterial from an asset path
|
|
39
|
+
static UMaterial* LoadMaterialFromPath(const FString& AssetPath);
|
|
40
|
+
|
|
41
|
+
// Helper to load a UMaterialInstanceConstant from an asset path
|
|
42
|
+
static UMaterialInstanceConstant* LoadMaterialInstanceFromPath(const FString& AssetPath);
|
|
43
|
+
|
|
44
|
+
// Helper to convert shading model string to enum
|
|
45
|
+
static EMaterialShadingModel ParseShadingModel(const FString& ShadingModelStr);
|
|
46
|
+
static FString ShadingModelToString(EMaterialShadingModel ShadingModel);
|
|
47
|
+
|
|
48
|
+
// Helper to map material property name string to EMaterialProperty enum
|
|
49
|
+
static bool ParseMaterialProperty(const FString& PropertyName, EMaterialProperty& OutProperty);
|
|
50
|
+
|
|
51
|
+
// Helper to find an expression by name (description or class) within a material
|
|
52
|
+
static UMaterialExpression* FindExpressionByName(UMaterial* Material, const FString& ExpressionName);
|
|
53
|
+
};
|
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
#include "NetworkingHandlers.h"
|
|
2
|
+
#include "HandlerRegistry.h"
|
|
3
|
+
#include "Engine/Blueprint.h"
|
|
4
|
+
#include "GameFramework/Actor.h"
|
|
5
|
+
#include "Kismet2/KismetEditorUtilities.h"
|
|
6
|
+
#include "Kismet2/BlueprintEditorUtils.h"
|
|
7
|
+
#include "UObject/UObjectGlobals.h"
|
|
8
|
+
#include "UObject/Package.h"
|
|
9
|
+
#include "Misc/PackageName.h"
|
|
10
|
+
#include "UObject/SavePackage.h"
|
|
11
|
+
#include "Dom/JsonObject.h"
|
|
12
|
+
#include "Dom/JsonValue.h"
|
|
13
|
+
#include "UObject/UnrealType.h"
|
|
14
|
+
#include "EditorScriptingUtilities/Public/EditorAssetLibrary.h"
|
|
15
|
+
|
|
16
|
+
void FNetworkingHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
17
|
+
{
|
|
18
|
+
Registry.RegisterHandler(TEXT("get_networking_info"), &GetNetworkingInfo);
|
|
19
|
+
Registry.RegisterHandler(TEXT("set_replicates"), &SetReplicates);
|
|
20
|
+
Registry.RegisterHandler(TEXT("configure_net_update_frequency"), &ConfigureNetUpdateFrequency);
|
|
21
|
+
Registry.RegisterHandler(TEXT("set_net_dormancy"), &SetNetDormancy);
|
|
22
|
+
Registry.RegisterHandler(TEXT("set_always_relevant"), &SetAlwaysRelevant);
|
|
23
|
+
Registry.RegisterHandler(TEXT("set_net_priority"), &SetNetPriority);
|
|
24
|
+
Registry.RegisterHandler(TEXT("set_replicate_movement"), &SetReplicateMovement);
|
|
25
|
+
Registry.RegisterHandler(TEXT("set_variable_replication"), &SetVariableReplication);
|
|
26
|
+
Registry.RegisterHandler(TEXT("get_replication_info"), &GetReplicationInfo);
|
|
27
|
+
Registry.RegisterHandler(TEXT("set_owner_only_relevant"), &SetOwnerOnlyRelevant);
|
|
28
|
+
|
|
29
|
+
// Aliases
|
|
30
|
+
Registry.RegisterHandler(TEXT("set_property_replicated"), &SetVariableReplication);
|
|
31
|
+
Registry.RegisterHandler(TEXT("set_only_relevant_to_owner"), &SetOwnerOnlyRelevant);
|
|
32
|
+
// New handlers
|
|
33
|
+
Registry.RegisterHandler(TEXT("set_net_load_on_client"), &SetNetLoadOnClient);
|
|
34
|
+
Registry.RegisterHandler(TEXT("configure_net_cull_distance"), &ConfigureNetCullDistance);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
AActor* FNetworkingHandlers::LoadBlueprintCDO(const FString& BlueprintPath, TSharedPtr<FJsonObject>& OutResult)
|
|
38
|
+
{
|
|
39
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
40
|
+
if (!Blueprint || !Blueprint->GeneratedClass)
|
|
41
|
+
{
|
|
42
|
+
OutResult->SetStringField(TEXT("error"), FString::Printf(TEXT("Blueprint not found or has no generated class: %s"), *BlueprintPath));
|
|
43
|
+
OutResult->SetBoolField(TEXT("success"), false);
|
|
44
|
+
return nullptr;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
AActor* CDO = Cast<AActor>(Blueprint->GeneratedClass->GetDefaultObject());
|
|
48
|
+
if (!CDO)
|
|
49
|
+
{
|
|
50
|
+
OutResult->SetStringField(TEXT("error"), TEXT("CDO is not an Actor"));
|
|
51
|
+
OutResult->SetBoolField(TEXT("success"), false);
|
|
52
|
+
return nullptr;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return CDO;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
void FNetworkingHandlers::SaveBlueprint(UBlueprint* Blueprint)
|
|
59
|
+
{
|
|
60
|
+
if (!Blueprint) return;
|
|
61
|
+
FKismetEditorUtilities::CompileBlueprint(Blueprint);
|
|
62
|
+
UPackage* Package = Blueprint->GetOutermost();
|
|
63
|
+
if (Package)
|
|
64
|
+
{
|
|
65
|
+
Package->MarkPackageDirty();
|
|
66
|
+
FString PackageFileName = FPackageName::LongPackageNameToFilename(Package->GetName(), FPackageName::GetAssetPackageExtension());
|
|
67
|
+
FSavePackageArgs SaveArgs;
|
|
68
|
+
SaveArgs.TopLevelFlags = RF_Standalone;
|
|
69
|
+
UPackage::SavePackage(Package, nullptr, *PackageFileName, SaveArgs);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::GetNetworkingInfo(const TSharedPtr<FJsonObject>& Params)
|
|
74
|
+
{
|
|
75
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
76
|
+
|
|
77
|
+
FString BlueprintPath;
|
|
78
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
79
|
+
{
|
|
80
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
81
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
82
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
86
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
87
|
+
|
|
88
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
89
|
+
Result->SetBoolField(TEXT("replicates"), CDO->GetIsReplicated());
|
|
90
|
+
Result->SetNumberField(TEXT("netUpdateFrequency"), CDO->GetNetUpdateFrequency());
|
|
91
|
+
Result->SetNumberField(TEXT("minNetUpdateFrequency"), CDO->GetMinNetUpdateFrequency());
|
|
92
|
+
Result->SetNumberField(TEXT("netPriority"), CDO->NetPriority);
|
|
93
|
+
Result->SetBoolField(TEXT("alwaysRelevant"), CDO->bAlwaysRelevant);
|
|
94
|
+
Result->SetBoolField(TEXT("replicateMovement"), CDO->IsReplicatingMovement());
|
|
95
|
+
Result->SetNumberField(TEXT("netDormancy"), (int32)CDO->NetDormancy);
|
|
96
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
97
|
+
|
|
98
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetReplicates(const TSharedPtr<FJsonObject>& Params)
|
|
102
|
+
{
|
|
103
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
104
|
+
|
|
105
|
+
FString BlueprintPath;
|
|
106
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
107
|
+
{
|
|
108
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
109
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
110
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
114
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
115
|
+
|
|
116
|
+
bool bReplicates = false;
|
|
117
|
+
Params->TryGetBoolField(TEXT("replicates"), bReplicates);
|
|
118
|
+
CDO->SetReplicates(bReplicates);
|
|
119
|
+
|
|
120
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
121
|
+
SaveBlueprint(Blueprint);
|
|
122
|
+
|
|
123
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
124
|
+
Result->SetBoolField(TEXT("replicates"), bReplicates);
|
|
125
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
126
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::ConfigureNetUpdateFrequency(const TSharedPtr<FJsonObject>& Params)
|
|
130
|
+
{
|
|
131
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
132
|
+
|
|
133
|
+
FString BlueprintPath;
|
|
134
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
135
|
+
{
|
|
136
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
137
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
138
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
142
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
143
|
+
|
|
144
|
+
double NetUpdateFrequency = 0;
|
|
145
|
+
if (Params->TryGetNumberField(TEXT("netUpdateFrequency"), NetUpdateFrequency))
|
|
146
|
+
{
|
|
147
|
+
CDO->SetNetUpdateFrequency((float)NetUpdateFrequency);
|
|
148
|
+
}
|
|
149
|
+
double MinNetUpdateFrequency = 0;
|
|
150
|
+
if (Params->TryGetNumberField(TEXT("minNetUpdateFrequency"), MinNetUpdateFrequency))
|
|
151
|
+
{
|
|
152
|
+
CDO->SetMinNetUpdateFrequency((float)MinNetUpdateFrequency);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
156
|
+
SaveBlueprint(Blueprint);
|
|
157
|
+
|
|
158
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
159
|
+
Result->SetNumberField(TEXT("netUpdateFrequency"), CDO->GetNetUpdateFrequency());
|
|
160
|
+
Result->SetNumberField(TEXT("minNetUpdateFrequency"), CDO->GetMinNetUpdateFrequency());
|
|
161
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
162
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetNetDormancy(const TSharedPtr<FJsonObject>& Params)
|
|
166
|
+
{
|
|
167
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
168
|
+
|
|
169
|
+
FString BlueprintPath;
|
|
170
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
171
|
+
{
|
|
172
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
173
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
174
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
178
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
179
|
+
|
|
180
|
+
FString Dormancy;
|
|
181
|
+
if (Params->TryGetStringField(TEXT("dormancy"), Dormancy))
|
|
182
|
+
{
|
|
183
|
+
if (Dormancy == TEXT("DORM_Never"))
|
|
184
|
+
CDO->NetDormancy = DORM_Never;
|
|
185
|
+
else if (Dormancy == TEXT("DORM_Awake"))
|
|
186
|
+
CDO->NetDormancy = DORM_Awake;
|
|
187
|
+
else if (Dormancy == TEXT("DORM_DormantAll"))
|
|
188
|
+
CDO->NetDormancy = DORM_DormantAll;
|
|
189
|
+
else if (Dormancy == TEXT("DORM_DormantPartial"))
|
|
190
|
+
CDO->NetDormancy = DORM_DormantPartial;
|
|
191
|
+
else if (Dormancy == TEXT("DORM_Initial"))
|
|
192
|
+
CDO->NetDormancy = DORM_Initial;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
196
|
+
SaveBlueprint(Blueprint);
|
|
197
|
+
|
|
198
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
199
|
+
Result->SetNumberField(TEXT("netDormancy"), (int32)CDO->NetDormancy);
|
|
200
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
201
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetAlwaysRelevant(const TSharedPtr<FJsonObject>& Params)
|
|
205
|
+
{
|
|
206
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
207
|
+
|
|
208
|
+
FString BlueprintPath;
|
|
209
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
210
|
+
{
|
|
211
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
212
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
213
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
217
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
218
|
+
|
|
219
|
+
bool bAlwaysRelevant = false;
|
|
220
|
+
Params->TryGetBoolField(TEXT("alwaysRelevant"), bAlwaysRelevant);
|
|
221
|
+
CDO->bAlwaysRelevant = bAlwaysRelevant;
|
|
222
|
+
|
|
223
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
224
|
+
SaveBlueprint(Blueprint);
|
|
225
|
+
|
|
226
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
227
|
+
Result->SetBoolField(TEXT("alwaysRelevant"), bAlwaysRelevant);
|
|
228
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
229
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetNetPriority(const TSharedPtr<FJsonObject>& Params)
|
|
233
|
+
{
|
|
234
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
235
|
+
|
|
236
|
+
FString BlueprintPath;
|
|
237
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
238
|
+
{
|
|
239
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
240
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
241
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
245
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
246
|
+
|
|
247
|
+
double NetPriority = 1.0;
|
|
248
|
+
if (Params->TryGetNumberField(TEXT("netPriority"), NetPriority))
|
|
249
|
+
{
|
|
250
|
+
CDO->NetPriority = (float)NetPriority;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
254
|
+
SaveBlueprint(Blueprint);
|
|
255
|
+
|
|
256
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
257
|
+
Result->SetNumberField(TEXT("netPriority"), CDO->NetPriority);
|
|
258
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
259
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetReplicateMovement(const TSharedPtr<FJsonObject>& Params)
|
|
263
|
+
{
|
|
264
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
265
|
+
|
|
266
|
+
FString BlueprintPath;
|
|
267
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
268
|
+
{
|
|
269
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
270
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
271
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
275
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
276
|
+
|
|
277
|
+
bool bReplicateMovement = false;
|
|
278
|
+
Params->TryGetBoolField(TEXT("replicateMovement"), bReplicateMovement);
|
|
279
|
+
CDO->SetReplicatingMovement(bReplicateMovement);
|
|
280
|
+
|
|
281
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
282
|
+
SaveBlueprint(Blueprint);
|
|
283
|
+
|
|
284
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
285
|
+
Result->SetBoolField(TEXT("replicateMovement"), bReplicateMovement);
|
|
286
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
287
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetVariableReplication(const TSharedPtr<FJsonObject>& Params)
|
|
291
|
+
{
|
|
292
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
293
|
+
|
|
294
|
+
FString BlueprintPath;
|
|
295
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
296
|
+
{
|
|
297
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
298
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
299
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
FString VariableName;
|
|
303
|
+
if (!Params->TryGetStringField(TEXT("variableName"), VariableName))
|
|
304
|
+
{
|
|
305
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'variableName' parameter"));
|
|
306
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
307
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
FString ReplicationType = TEXT("None");
|
|
311
|
+
Params->TryGetStringField(TEXT("replicationType"), ReplicationType);
|
|
312
|
+
|
|
313
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
314
|
+
if (!Blueprint)
|
|
315
|
+
{
|
|
316
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Blueprint not found: %s"), *BlueprintPath));
|
|
317
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
318
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Find the variable in the blueprint
|
|
322
|
+
FName VarFName(*VariableName);
|
|
323
|
+
FBPVariableDescription* VarDesc = nullptr;
|
|
324
|
+
for (FBPVariableDescription& Var : Blueprint->NewVariables)
|
|
325
|
+
{
|
|
326
|
+
if (Var.VarName == VarFName)
|
|
327
|
+
{
|
|
328
|
+
VarDesc = &Var;
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
if (!VarDesc)
|
|
334
|
+
{
|
|
335
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Variable '%s' not found in blueprint"), *VariableName));
|
|
336
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
337
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Set the replication condition
|
|
341
|
+
if (ReplicationType == TEXT("Replicated"))
|
|
342
|
+
{
|
|
343
|
+
VarDesc->PropertyFlags |= CPF_Net;
|
|
344
|
+
VarDesc->PropertyFlags &= ~CPF_RepNotify;
|
|
345
|
+
VarDesc->ReplicationCondition = COND_None;
|
|
346
|
+
// Replication condition is already set on VarDesc above
|
|
347
|
+
}
|
|
348
|
+
else if (ReplicationType == TEXT("RepNotify"))
|
|
349
|
+
{
|
|
350
|
+
VarDesc->PropertyFlags |= CPF_Net;
|
|
351
|
+
VarDesc->PropertyFlags |= CPF_RepNotify;
|
|
352
|
+
VarDesc->ReplicationCondition = COND_None;
|
|
353
|
+
// Replication condition is already set on VarDesc above
|
|
354
|
+
}
|
|
355
|
+
else // "None"
|
|
356
|
+
{
|
|
357
|
+
VarDesc->PropertyFlags &= ~CPF_Net;
|
|
358
|
+
VarDesc->PropertyFlags &= ~CPF_RepNotify;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
SaveBlueprint(Blueprint);
|
|
362
|
+
|
|
363
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
364
|
+
Result->SetStringField(TEXT("variableName"), VariableName);
|
|
365
|
+
Result->SetStringField(TEXT("replicationType"), ReplicationType);
|
|
366
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
367
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::GetReplicationInfo(const TSharedPtr<FJsonObject>& Params)
|
|
371
|
+
{
|
|
372
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
373
|
+
|
|
374
|
+
FString BlueprintPath;
|
|
375
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
376
|
+
{
|
|
377
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
378
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
379
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
383
|
+
if (!Blueprint || !Blueprint->GeneratedClass)
|
|
384
|
+
{
|
|
385
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Blueprint not found or has no generated class: %s"), *BlueprintPath));
|
|
386
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
387
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
AActor* CDO = Cast<AActor>(Blueprint->GeneratedClass->GetDefaultObject());
|
|
391
|
+
if (!CDO)
|
|
392
|
+
{
|
|
393
|
+
Result->SetStringField(TEXT("error"), TEXT("CDO is not an Actor"));
|
|
394
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
395
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// General replication info
|
|
399
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
400
|
+
Result->SetBoolField(TEXT("replicates"), CDO->GetIsReplicated());
|
|
401
|
+
Result->SetBoolField(TEXT("replicateMovement"), CDO->IsReplicatingMovement());
|
|
402
|
+
Result->SetBoolField(TEXT("alwaysRelevant"), CDO->bAlwaysRelevant);
|
|
403
|
+
Result->SetBoolField(TEXT("onlyRelevantToOwner"), CDO->bOnlyRelevantToOwner);
|
|
404
|
+
Result->SetNumberField(TEXT("netUpdateFrequency"), CDO->GetNetUpdateFrequency());
|
|
405
|
+
Result->SetNumberField(TEXT("netPriority"), CDO->NetPriority);
|
|
406
|
+
Result->SetNumberField(TEXT("netDormancy"), (int32)CDO->NetDormancy);
|
|
407
|
+
|
|
408
|
+
// Iterate all properties on the CDO class looking for replicated ones (CPF_Net flag)
|
|
409
|
+
TArray<TSharedPtr<FJsonValue>> ReplicatedProps;
|
|
410
|
+
for (TFieldIterator<FProperty> PropIt(Blueprint->GeneratedClass); PropIt; ++PropIt)
|
|
411
|
+
{
|
|
412
|
+
FProperty* Property = *PropIt;
|
|
413
|
+
if (!Property) continue;
|
|
414
|
+
|
|
415
|
+
if (Property->HasAnyPropertyFlags(CPF_Net))
|
|
416
|
+
{
|
|
417
|
+
TSharedPtr<FJsonObject> PropObj = MakeShared<FJsonObject>();
|
|
418
|
+
PropObj->SetStringField(TEXT("name"), Property->GetName());
|
|
419
|
+
PropObj->SetStringField(TEXT("type"), Property->GetCPPType());
|
|
420
|
+
PropObj->SetBoolField(TEXT("isRepNotify"), Property->HasAnyPropertyFlags(CPF_RepNotify));
|
|
421
|
+
|
|
422
|
+
// Determine replication condition from the blueprint variable description
|
|
423
|
+
FString ConditionStr = TEXT("COND_None");
|
|
424
|
+
for (const FBPVariableDescription& Var : Blueprint->NewVariables)
|
|
425
|
+
{
|
|
426
|
+
if (Var.VarName == Property->GetFName())
|
|
427
|
+
{
|
|
428
|
+
switch (Var.ReplicationCondition)
|
|
429
|
+
{
|
|
430
|
+
case COND_None: ConditionStr = TEXT("COND_None"); break;
|
|
431
|
+
case COND_InitialOnly: ConditionStr = TEXT("COND_InitialOnly"); break;
|
|
432
|
+
case COND_OwnerOnly: ConditionStr = TEXT("COND_OwnerOnly"); break;
|
|
433
|
+
case COND_SkipOwner: ConditionStr = TEXT("COND_SkipOwner"); break;
|
|
434
|
+
case COND_SimulatedOnly: ConditionStr = TEXT("COND_SimulatedOnly"); break;
|
|
435
|
+
case COND_AutonomousOnly: ConditionStr = TEXT("COND_AutonomousOnly"); break;
|
|
436
|
+
case COND_SimulatedOrPhysics: ConditionStr = TEXT("COND_SimulatedOrPhysics"); break;
|
|
437
|
+
case COND_InitialOrOwner: ConditionStr = TEXT("COND_InitialOrOwner"); break;
|
|
438
|
+
case COND_Custom: ConditionStr = TEXT("COND_Custom"); break;
|
|
439
|
+
case COND_ReplayOrOwner: ConditionStr = TEXT("COND_ReplayOrOwner"); break;
|
|
440
|
+
case COND_ReplayOnly: ConditionStr = TEXT("COND_ReplayOnly"); break;
|
|
441
|
+
case COND_SkipReplay: ConditionStr = TEXT("COND_SkipReplay"); break;
|
|
442
|
+
case COND_Dynamic: ConditionStr = TEXT("COND_Dynamic"); break;
|
|
443
|
+
case COND_Never: ConditionStr = TEXT("COND_Never"); break;
|
|
444
|
+
default: ConditionStr = TEXT("Unknown"); break;
|
|
445
|
+
}
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
PropObj->SetStringField(TEXT("replicationCondition"), ConditionStr);
|
|
450
|
+
|
|
451
|
+
// Rep notify function name
|
|
452
|
+
if (Property->HasAnyPropertyFlags(CPF_RepNotify) && Property->RepNotifyFunc != NAME_None)
|
|
453
|
+
{
|
|
454
|
+
PropObj->SetStringField(TEXT("repNotifyFunc"), Property->RepNotifyFunc.ToString());
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
ReplicatedProps.Add(MakeShared<FJsonValueObject>(PropObj));
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
Result->SetArrayField(TEXT("replicatedProperties"), ReplicatedProps);
|
|
462
|
+
Result->SetNumberField(TEXT("replicatedPropertyCount"), ReplicatedProps.Num());
|
|
463
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
464
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetOwnerOnlyRelevant(const TSharedPtr<FJsonObject>& Params)
|
|
468
|
+
{
|
|
469
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
470
|
+
|
|
471
|
+
FString BlueprintPath;
|
|
472
|
+
if (!Params->TryGetStringField(TEXT("blueprintPath"), BlueprintPath))
|
|
473
|
+
{
|
|
474
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'blueprintPath' parameter"));
|
|
475
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
476
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
AActor* CDO = LoadBlueprintCDO(BlueprintPath, Result);
|
|
480
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
481
|
+
|
|
482
|
+
bool bOnlyRelevantToOwner = false;
|
|
483
|
+
Params->TryGetBoolField(TEXT("onlyRelevantToOwner"), bOnlyRelevantToOwner);
|
|
484
|
+
CDO->bOnlyRelevantToOwner = bOnlyRelevantToOwner;
|
|
485
|
+
|
|
486
|
+
UBlueprint* Blueprint = LoadObject<UBlueprint>(nullptr, *BlueprintPath);
|
|
487
|
+
SaveBlueprint(Blueprint);
|
|
488
|
+
|
|
489
|
+
Result->SetStringField(TEXT("blueprintPath"), BlueprintPath);
|
|
490
|
+
Result->SetBoolField(TEXT("onlyRelevantToOwner"), bOnlyRelevantToOwner);
|
|
491
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
492
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::SetNetLoadOnClient(const TSharedPtr<FJsonObject>& Params)
|
|
496
|
+
{
|
|
497
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
498
|
+
AActor* CDO = LoadBlueprintCDO(Params->GetStringField(TEXT("blueprintPath")), Result);
|
|
499
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
500
|
+
|
|
501
|
+
bool bLoadOnClient = true;
|
|
502
|
+
Params->TryGetBoolField(TEXT("loadOnClient"), bLoadOnClient);
|
|
503
|
+
|
|
504
|
+
FProperty* Prop = CDO->GetClass()->FindPropertyByName(TEXT("bNetLoadOnClient"));
|
|
505
|
+
if (Prop)
|
|
506
|
+
{
|
|
507
|
+
bool* ValPtr = Prop->ContainerPtrToValuePtr<bool>(CDO);
|
|
508
|
+
if (ValPtr)
|
|
509
|
+
{
|
|
510
|
+
*ValPtr = bLoadOnClient;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
UBlueprint* BP = Cast<UBlueprint>(UEditorAssetLibrary::LoadAsset(Params->GetStringField(TEXT("blueprintPath"))));
|
|
515
|
+
if (BP) SaveBlueprint(BP);
|
|
516
|
+
|
|
517
|
+
Result->SetStringField(TEXT("blueprintPath"), Params->GetStringField(TEXT("blueprintPath")));
|
|
518
|
+
Result->SetBoolField(TEXT("loadOnClient"), bLoadOnClient);
|
|
519
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
520
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
TSharedPtr<FJsonValue> FNetworkingHandlers::ConfigureNetCullDistance(const TSharedPtr<FJsonObject>& Params)
|
|
524
|
+
{
|
|
525
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
526
|
+
AActor* CDO = LoadBlueprintCDO(Params->GetStringField(TEXT("blueprintPath")), Result);
|
|
527
|
+
if (!CDO) return MakeShared<FJsonValueObject>(Result);
|
|
528
|
+
|
|
529
|
+
double Distance = 225000000.0;
|
|
530
|
+
Params->TryGetNumberField(TEXT("netCullDistanceSquared"), Distance);
|
|
531
|
+
|
|
532
|
+
FProperty* Prop = CDO->GetClass()->FindPropertyByName(TEXT("NetCullDistanceSquared"));
|
|
533
|
+
if (Prop)
|
|
534
|
+
{
|
|
535
|
+
FFloatProperty* FloatProp = CastField<FFloatProperty>(Prop);
|
|
536
|
+
FDoubleProperty* DoubleProp = CastField<FDoubleProperty>(Prop);
|
|
537
|
+
if (FloatProp)
|
|
538
|
+
{
|
|
539
|
+
FloatProp->SetPropertyValue_InContainer(CDO, static_cast<float>(Distance));
|
|
540
|
+
}
|
|
541
|
+
else if (DoubleProp)
|
|
542
|
+
{
|
|
543
|
+
DoubleProp->SetPropertyValue_InContainer(CDO, Distance);
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
UBlueprint* BP = Cast<UBlueprint>(UEditorAssetLibrary::LoadAsset(Params->GetStringField(TEXT("blueprintPath"))));
|
|
548
|
+
if (BP) SaveBlueprint(BP);
|
|
549
|
+
|
|
550
|
+
Result->SetStringField(TEXT("blueprintPath"), Params->GetStringField(TEXT("blueprintPath")));
|
|
551
|
+
Result->SetNumberField(TEXT("netCullDistanceSquared"), Distance);
|
|
552
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
553
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
554
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#include "CoreMinimal.h"
|
|
4
|
+
#include "Dom/JsonValue.h"
|
|
5
|
+
#include "Dom/JsonObject.h"
|
|
6
|
+
|
|
7
|
+
class FNetworkingHandlers
|
|
8
|
+
{
|
|
9
|
+
public:
|
|
10
|
+
static void RegisterHandlers(class FMCPHandlerRegistry& Registry);
|
|
11
|
+
|
|
12
|
+
private:
|
|
13
|
+
static TSharedPtr<FJsonValue> GetNetworkingInfo(const TSharedPtr<FJsonObject>& Params);
|
|
14
|
+
static TSharedPtr<FJsonValue> SetReplicates(const TSharedPtr<FJsonObject>& Params);
|
|
15
|
+
static TSharedPtr<FJsonValue> ConfigureNetUpdateFrequency(const TSharedPtr<FJsonObject>& Params);
|
|
16
|
+
static TSharedPtr<FJsonValue> SetNetDormancy(const TSharedPtr<FJsonObject>& Params);
|
|
17
|
+
static TSharedPtr<FJsonValue> SetAlwaysRelevant(const TSharedPtr<FJsonObject>& Params);
|
|
18
|
+
static TSharedPtr<FJsonValue> SetNetPriority(const TSharedPtr<FJsonObject>& Params);
|
|
19
|
+
static TSharedPtr<FJsonValue> SetReplicateMovement(const TSharedPtr<FJsonObject>& Params);
|
|
20
|
+
static TSharedPtr<FJsonValue> SetVariableReplication(const TSharedPtr<FJsonObject>& Params);
|
|
21
|
+
static TSharedPtr<FJsonValue> GetReplicationInfo(const TSharedPtr<FJsonObject>& Params);
|
|
22
|
+
static TSharedPtr<FJsonValue> SetOwnerOnlyRelevant(const TSharedPtr<FJsonObject>& Params);
|
|
23
|
+
static TSharedPtr<FJsonValue> SetNetLoadOnClient(const TSharedPtr<FJsonObject>& Params);
|
|
24
|
+
static TSharedPtr<FJsonValue> ConfigureNetCullDistance(const TSharedPtr<FJsonObject>& Params);
|
|
25
|
+
|
|
26
|
+
// Helper to load blueprint CDO as AActor
|
|
27
|
+
static AActor* LoadBlueprintCDO(const FString& BlueprintPath, TSharedPtr<FJsonObject>& OutResult);
|
|
28
|
+
static void SaveBlueprint(UBlueprint* Blueprint);
|
|
29
|
+
};
|