ue-mcp 1.0.72 → 1.0.73
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/dist/tool-counts.json +2 -2
- package/dist/tools/gameplay.js +3 -2
- package/dist/tools/gameplay.js.map +1 -1
- package/dist/ue-mcp.default.yml +1 -1
- package/package.json +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp +18 -6
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GameplayHandlers.cpp +96 -3
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/GasHandlers.cpp +132 -25
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/NiagaraHandlers.cpp +5 -4
package/dist/tool-counts.json
CHANGED
package/dist/tools/gameplay.js
CHANGED
|
@@ -36,7 +36,7 @@ export const gameplayTool = categoryTool("gameplay", "Gameplay systems: physics,
|
|
|
36
36
|
create_eqs_query: bp("Create EQS query. Params: name, packagePath?", "create_eqs_query"),
|
|
37
37
|
list_eqs_queries: bp("List EQS queries. Params: directory?", "list_eqs_queries"),
|
|
38
38
|
add_perception: bp("Add AIPerceptionComponent. Params: blueprintPath, senses?", "add_perception_component"),
|
|
39
|
-
configure_sense: bp("
|
|
39
|
+
configure_sense: bp("Add + configure an AI perception sense config on the blueprint's AIPerceptionComponent. Params: blueprintPath, senseType (Sight|Hearing|Damage|Touch|Team|Prediction|Blueprint), settings? ({SightRadius: ...}), componentName?", "configure_ai_perception_sense"),
|
|
40
40
|
create_state_tree: bp("Create StateTree. Params: name, packagePath?", "create_state_tree"),
|
|
41
41
|
list_state_trees: bp("List StateTrees. Params: directory?", "list_state_trees"),
|
|
42
42
|
add_state_tree_component: bp("Add StateTreeComponent. Params: blueprintPath", "add_state_tree_component"),
|
|
@@ -93,7 +93,8 @@ export const gameplayTool = categoryTool("gameplay", "Gameplay systems: physics,
|
|
|
93
93
|
instanceProperties: z.record(z.unknown()).optional().describe("Property writes to apply to a freshly-spawned behavior instance"),
|
|
94
94
|
senses: z.array(z.string()).optional(),
|
|
95
95
|
senseType: z.string().optional(),
|
|
96
|
-
settings: z.record(z.unknown()).optional(),
|
|
96
|
+
settings: z.record(z.unknown()).optional().describe("configure_sense: per-sense property writes (e.g. {SightRadius: 1500})"),
|
|
97
|
+
componentName: z.string().optional().describe("configure_sense: target AIPerceptionComponent name (default: first found)"),
|
|
97
98
|
parentClass: z.string().optional(),
|
|
98
99
|
defaults: z.record(z.string()).optional(),
|
|
99
100
|
gameModePath: z.string().optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gameplay.js","sourceRoot":"","sources":["../../src/tools/gameplay.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gameplay.js","sourceRoot":"","sources":["../../src/tools/gameplay.ts"],"names":[],"mappings":"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"}
|
package/dist/ue-mcp.default.yml
CHANGED
|
@@ -2766,7 +2766,7 @@ tasks:
|
|
|
2766
2766
|
gameplay.configure_sense:
|
|
2767
2767
|
class_path: ue-mcp.bridge
|
|
2768
2768
|
group: gameplay
|
|
2769
|
-
description: "
|
|
2769
|
+
description: "Add + configure an AI perception sense config on the blueprint's AIPerceptionComponent. Params: blueprintPath, senseType (Sight|Hearing|Damage|Touch|Team|Prediction|Blueprint), settings? ({SightRadius: ...}), componentName?"
|
|
2770
2770
|
options:
|
|
2771
2771
|
method: configure_ai_perception_sense
|
|
2772
2772
|
gameplay.create_state_tree:
|
package/package.json
CHANGED
package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/AnimationHandlers_Sequence.cpp
CHANGED
|
@@ -666,19 +666,31 @@ TSharedPtr<FJsonValue> FAnimationHandlers::ListAnimModifiers(const TSharedPtr<FJ
|
|
|
666
666
|
if (!Seq) return MCPError(FString::Printf(TEXT("AnimSequence not found: %s"), *AssetPath));
|
|
667
667
|
|
|
668
668
|
TArray<TSharedPtr<FJsonValue>> Arr;
|
|
669
|
-
//
|
|
670
|
-
//
|
|
671
|
-
|
|
669
|
+
// AppliedAnimationModifiers is an editor-only TArray<UAnimationModifier*> on the
|
|
670
|
+
// AnimSequence. Enumerate it via reflection (portable across module linkage):
|
|
671
|
+
// each element is an instanced UAnimationModifier subobject.
|
|
672
|
+
FArrayProperty* ModifiersProp = CastField<FArrayProperty>(
|
|
673
|
+
Seq->GetClass()->FindPropertyByName(TEXT("AppliedAnimationModifiers")));
|
|
672
674
|
if (ModifiersProp)
|
|
673
675
|
{
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
676
|
+
FObjectPropertyBase* ElemProp = CastField<FObjectPropertyBase>(ModifiersProp->Inner);
|
|
677
|
+
FScriptArrayHelper Helper(ModifiersProp, ModifiersProp->ContainerPtrToValuePtr<void>(Seq));
|
|
678
|
+
for (int32 i = 0; i < Helper.Num(); ++i)
|
|
679
|
+
{
|
|
680
|
+
UObject* Modifier = ElemProp ? ElemProp->GetObjectPropertyValue(Helper.GetRawPtr(i)) : nullptr;
|
|
681
|
+
if (!Modifier) continue;
|
|
682
|
+
TSharedPtr<FJsonObject> M = MakeShared<FJsonObject>();
|
|
683
|
+
M->SetStringField(TEXT("class"), Modifier->GetClass()->GetName());
|
|
684
|
+
M->SetStringField(TEXT("classPath"), Modifier->GetClass()->GetPathName());
|
|
685
|
+
M->SetStringField(TEXT("name"), Modifier->GetName());
|
|
686
|
+
Arr.Add(MakeShared<FJsonValueObject>(M));
|
|
687
|
+
}
|
|
677
688
|
}
|
|
678
689
|
|
|
679
690
|
TSharedPtr<FJsonObject> Result = MCPSuccess();
|
|
680
691
|
Result->SetStringField(TEXT("assetPath"), AssetPath);
|
|
681
692
|
Result->SetArrayField(TEXT("modifiers"), Arr);
|
|
693
|
+
Result->SetNumberField(TEXT("count"), Arr.Num());
|
|
682
694
|
return MCPResult(Result);
|
|
683
695
|
}
|
|
684
696
|
|
|
@@ -1590,19 +1590,112 @@ TSharedPtr<FJsonValue> FGameplayHandlers::ConfigureAiPerceptionSense(const TShar
|
|
|
1590
1590
|
SenseMap.Add(TEXT("Damage"), TEXT("AISenseConfig_Damage"));
|
|
1591
1591
|
SenseMap.Add(TEXT("Touch"), TEXT("AISenseConfig_Touch"));
|
|
1592
1592
|
SenseMap.Add(TEXT("Team"), TEXT("AISenseConfig_Team"));
|
|
1593
|
+
SenseMap.Add(TEXT("Prediction"), TEXT("AISenseConfig_Prediction"));
|
|
1594
|
+
SenseMap.Add(TEXT("Blueprint"), TEXT("AISenseConfig_Blueprint"));
|
|
1593
1595
|
|
|
1594
1596
|
FString* SenseClassName = SenseMap.Find(SenseType);
|
|
1595
1597
|
if (!SenseClassName)
|
|
1596
1598
|
{
|
|
1597
|
-
return MCPError(FString::Printf(TEXT("Unknown sense type: %s. Available: Sight, Hearing, Damage, Touch, Team"), *SenseType));
|
|
1599
|
+
return MCPError(FString::Printf(TEXT("Unknown sense type: %s. Available: Sight, Hearing, Damage, Touch, Team, Prediction, Blueprint"), *SenseType));
|
|
1598
1600
|
}
|
|
1599
1601
|
|
|
1602
|
+
UClass* SenseCfgClass = FindObject<UClass>(nullptr, *FString::Printf(TEXT("/Script/AIModule.%s"), **SenseClassName));
|
|
1603
|
+
if (!SenseCfgClass)
|
|
1604
|
+
{
|
|
1605
|
+
return MCPError(FString::Printf(TEXT("Sense config class not found: %s. Enable AIModule."), **SenseClassName));
|
|
1606
|
+
}
|
|
1607
|
+
|
|
1608
|
+
UBlueprint* BP = Cast<UBlueprint>(UEditorAssetLibrary::LoadAsset(BPPath));
|
|
1609
|
+
if (!BP) return MCPError(FString::Printf(TEXT("Blueprint not found: %s"), *BPPath));
|
|
1610
|
+
|
|
1611
|
+
// Locate the AIPerceptionComponent template on the construction script.
|
|
1612
|
+
UClass* PercClass = FindObject<UClass>(nullptr, TEXT("/Script/AIModule.AIPerceptionComponent"));
|
|
1613
|
+
const FString CompName = OptionalString(Params, TEXT("componentName"));
|
|
1614
|
+
UObject* PercTemplate = nullptr;
|
|
1615
|
+
FString ResolvedComp;
|
|
1616
|
+
if (BP->SimpleConstructionScript)
|
|
1617
|
+
{
|
|
1618
|
+
for (USCS_Node* N : BP->SimpleConstructionScript->GetAllNodes())
|
|
1619
|
+
{
|
|
1620
|
+
if (!N || !N->ComponentTemplate) continue;
|
|
1621
|
+
const bool bIsPerc = PercClass
|
|
1622
|
+
? N->ComponentTemplate->IsA(PercClass)
|
|
1623
|
+
: N->ComponentTemplate->GetClass()->GetName().Contains(TEXT("AIPerception"));
|
|
1624
|
+
if (!bIsPerc) continue;
|
|
1625
|
+
if (!CompName.IsEmpty() && N->GetVariableName() != FName(*CompName)) continue;
|
|
1626
|
+
PercTemplate = N->ComponentTemplate;
|
|
1627
|
+
ResolvedComp = N->GetVariableName().ToString();
|
|
1628
|
+
break;
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
if (!PercTemplate)
|
|
1632
|
+
{
|
|
1633
|
+
return MCPError(TEXT("No AIPerceptionComponent on the blueprint - run add_perception_component first"));
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
// Add the sense config to SensesConfig via reflection (avoids linking AIModule
|
|
1637
|
+
// headers and matches what the editor's '+' button does).
|
|
1638
|
+
FArrayProperty* SensesProp = CastField<FArrayProperty>(PercTemplate->GetClass()->FindPropertyByName(TEXT("SensesConfig")));
|
|
1639
|
+
FObjectPropertyBase* ElemProp = SensesProp ? CastField<FObjectPropertyBase>(SensesProp->Inner) : nullptr;
|
|
1640
|
+
if (!SensesProp || !ElemProp)
|
|
1641
|
+
{
|
|
1642
|
+
return MCPError(TEXT("SensesConfig object-array property not found on AIPerceptionComponent (engine drift)"));
|
|
1643
|
+
}
|
|
1644
|
+
|
|
1645
|
+
FScriptArrayHelper Helper(SensesProp, SensesProp->ContainerPtrToValuePtr<void>(PercTemplate));
|
|
1646
|
+
for (int32 i = 0; i < Helper.Num(); ++i)
|
|
1647
|
+
{
|
|
1648
|
+
UObject* Existing = ElemProp->GetObjectPropertyValue(Helper.GetRawPtr(i));
|
|
1649
|
+
if (Existing && Existing->GetClass() == SenseCfgClass)
|
|
1650
|
+
{
|
|
1651
|
+
auto Ex = MCPSuccess();
|
|
1652
|
+
MCPSetExisted(Ex);
|
|
1653
|
+
Ex->SetStringField(TEXT("blueprintPath"), BPPath);
|
|
1654
|
+
Ex->SetStringField(TEXT("component"), ResolvedComp);
|
|
1655
|
+
Ex->SetStringField(TEXT("senseType"), SenseType);
|
|
1656
|
+
Ex->SetStringField(TEXT("senseConfig"), SenseCfgClass->GetName());
|
|
1657
|
+
return MCPResult(Ex);
|
|
1658
|
+
}
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
UObject* Cfg = NewObject<UObject>(PercTemplate, SenseCfgClass, NAME_None, RF_Transactional);
|
|
1662
|
+
const int32 NewIdx = Helper.AddValue();
|
|
1663
|
+
ElemProp->SetObjectPropertyValue(Helper.GetRawPtr(NewIdx), Cfg);
|
|
1664
|
+
|
|
1665
|
+
// Optional per-sense tuning (e.g. { "SightRadius": 1500 }).
|
|
1666
|
+
TArray<FString> AppliedProps;
|
|
1667
|
+
const TSharedPtr<FJsonObject>* PropsObj = nullptr;
|
|
1668
|
+
if (Params->TryGetObjectField(TEXT("settings"), PropsObj) && PropsObj && (*PropsObj).IsValid())
|
|
1669
|
+
{
|
|
1670
|
+
for (const auto& KV : (*PropsObj)->Values)
|
|
1671
|
+
{
|
|
1672
|
+
FProperty* P = Cfg->GetClass()->FindPropertyByName(FName(*KV.Key));
|
|
1673
|
+
if (!P) continue;
|
|
1674
|
+
FString PErr;
|
|
1675
|
+
if (MCPJsonProperty::SetJsonOnProperty(P, P->ContainerPtrToValuePtr<void>(Cfg), KV.Value, PErr))
|
|
1676
|
+
{
|
|
1677
|
+
AppliedProps.Add(KV.Key);
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1682
|
+
FKismetEditorUtilities::CompileBlueprint(BP);
|
|
1683
|
+
SaveAssetPackage(BP);
|
|
1684
|
+
|
|
1600
1685
|
auto Result = MCPSuccess();
|
|
1686
|
+
MCPSetCreated(Result);
|
|
1601
1687
|
Result->SetStringField(TEXT("blueprintPath"), BPPath);
|
|
1688
|
+
Result->SetStringField(TEXT("component"), ResolvedComp);
|
|
1602
1689
|
Result->SetStringField(TEXT("senseType"), SenseType);
|
|
1603
|
-
Result->SetStringField(TEXT("
|
|
1604
|
-
|
|
1690
|
+
Result->SetStringField(TEXT("senseConfig"), Cfg->GetClass()->GetName());
|
|
1691
|
+
if (AppliedProps.Num() > 0)
|
|
1692
|
+
{
|
|
1693
|
+
TArray<TSharedPtr<FJsonValue>> A;
|
|
1694
|
+
for (const FString& S : AppliedProps) A.Add(MakeShared<FJsonValueString>(S));
|
|
1695
|
+
Result->SetArrayField(TEXT("appliedProperties"), A);
|
|
1696
|
+
}
|
|
1605
1697
|
|
|
1698
|
+
// Rollback: removing the sense again isn't a first-class action; report intent.
|
|
1606
1699
|
return MCPResult(Result);
|
|
1607
1700
|
}
|
|
1608
1701
|
|
|
@@ -24,6 +24,37 @@
|
|
|
24
24
|
#include "AbilitySystemComponent.h"
|
|
25
25
|
#include "AttributeSet.h"
|
|
26
26
|
#include "Engine/DataTable.h"
|
|
27
|
+
#include "GameplayEffect.h"
|
|
28
|
+
#include "GameplayEffectTypes.h"
|
|
29
|
+
#include "ScalableFloat.h"
|
|
30
|
+
#include "GameplayTagsManager.h"
|
|
31
|
+
|
|
32
|
+
// Resolve a FGameplayAttribute by name across every loaded AttributeSet
|
|
33
|
+
// subclass. Accepts a bare property name ("Health") or a qualified
|
|
34
|
+
// "SetClassSubstring.Attribute". Returns an invalid attribute on miss.
|
|
35
|
+
static FGameplayAttribute FindGameplayAttributeByName(const FString& Name)
|
|
36
|
+
{
|
|
37
|
+
FString SetFilter, AttrName = Name;
|
|
38
|
+
if (Name.Contains(TEXT(".")))
|
|
39
|
+
{
|
|
40
|
+
Name.Split(TEXT("."), &SetFilter, &AttrName);
|
|
41
|
+
}
|
|
42
|
+
for (TObjectIterator<UClass> It; It; ++It)
|
|
43
|
+
{
|
|
44
|
+
UClass* C = *It;
|
|
45
|
+
if (C == UAttributeSet::StaticClass() || !C->IsChildOf(UAttributeSet::StaticClass())) continue;
|
|
46
|
+
if (!SetFilter.IsEmpty() && !C->GetName().Contains(SetFilter)) continue;
|
|
47
|
+
for (TFieldIterator<FProperty> P(C); P; ++P)
|
|
48
|
+
{
|
|
49
|
+
FStructProperty* SP = CastField<FStructProperty>(*P);
|
|
50
|
+
if (SP && SP->Struct == FGameplayAttributeData::StaticStruct() && SP->GetName() == AttrName)
|
|
51
|
+
{
|
|
52
|
+
return FGameplayAttribute(SP);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return FGameplayAttribute();
|
|
57
|
+
}
|
|
27
58
|
|
|
28
59
|
void FGasHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
29
60
|
{
|
|
@@ -327,38 +358,70 @@ TSharedPtr<FJsonValue> FGasHandlers::SetAbilityTags(const TSharedPtr<FJsonObject
|
|
|
327
358
|
UObject* CDO = LoadBlueprintCDO<UObject>(AbilityPath, CdoErr);
|
|
328
359
|
if (!CDO) return CdoErr;
|
|
329
360
|
|
|
330
|
-
|
|
361
|
+
// param name -> FGameplayTagContainer UPROPERTY on UGameplayAbility.
|
|
362
|
+
const TArray<TPair<FString, FString>> TagMap = {
|
|
363
|
+
{TEXT("ability_tags"), TEXT("AbilityTags")},
|
|
364
|
+
{TEXT("cancel_abilities_with_tag"), TEXT("CancelAbilitiesWithTag")},
|
|
365
|
+
{TEXT("block_abilities_with_tag"), TEXT("BlockAbilitiesWithTag")},
|
|
366
|
+
{TEXT("activation_required_tags"), TEXT("ActivationRequiredTags")},
|
|
367
|
+
{TEXT("activation_blocked_tags"), TEXT("ActivationBlockedTags")},
|
|
368
|
+
};
|
|
331
369
|
|
|
332
|
-
|
|
333
|
-
TArray<FString>
|
|
334
|
-
|
|
370
|
+
TSharedPtr<FJsonObject> Applied = MakeShared<FJsonObject>();
|
|
371
|
+
TArray<FString> Unsupported;
|
|
372
|
+
bool bAnyApplied = false;
|
|
335
373
|
|
|
336
|
-
for (
|
|
374
|
+
for (const TPair<FString, FString>& Entry : TagMap)
|
|
337
375
|
{
|
|
338
|
-
const TArray<TSharedPtr<FJsonValue>>* TagArray;
|
|
339
|
-
if (Params->TryGetArrayField(*
|
|
376
|
+
const TArray<TSharedPtr<FJsonValue>>* TagArray = nullptr;
|
|
377
|
+
if (!Params->TryGetArrayField(*Entry.Key, TagArray) || !TagArray) continue;
|
|
378
|
+
|
|
379
|
+
FStructProperty* Prop = CastField<FStructProperty>(CDO->GetClass()->FindPropertyByName(*Entry.Value));
|
|
380
|
+
if (!Prop || Prop->Struct != FGameplayTagContainer::StaticStruct())
|
|
381
|
+
{
|
|
382
|
+
// Engine-version drift (e.g. AbilityTags deprecated): report, don't fake.
|
|
383
|
+
Unsupported.Add(Entry.Value);
|
|
384
|
+
continue;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
FGameplayTagContainer* Container = Prop->ContainerPtrToValuePtr<FGameplayTagContainer>(CDO);
|
|
388
|
+
Container->Reset();
|
|
389
|
+
TArray<TSharedPtr<FJsonValue>> Wrote;
|
|
390
|
+
for (const TSharedPtr<FJsonValue>& TagVal : *TagArray)
|
|
340
391
|
{
|
|
341
|
-
|
|
342
|
-
if (
|
|
392
|
+
FString TagStr;
|
|
393
|
+
if (!TagVal.IsValid() || !TagVal->TryGetString(TagStr)) continue;
|
|
394
|
+
const FGameplayTag Tag = FGameplayTag::RequestGameplayTag(FName(*TagStr), /*ErrorIfNotFound*/ false);
|
|
395
|
+
if (Tag.IsValid())
|
|
343
396
|
{
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
AddedTags.Add(MakeShared<FJsonValueString>(TagStr));
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
TagsSet->SetArrayField(ParamNames[i], AddedTags);
|
|
397
|
+
Container->AddTag(Tag);
|
|
398
|
+
Wrote.Add(MakeShared<FJsonValueString>(TagStr));
|
|
399
|
+
}
|
|
400
|
+
else
|
|
401
|
+
{
|
|
402
|
+
Wrote.Add(MakeShared<FJsonValueString>(TagStr + TEXT(" (unregistered tag - skipped)")));
|
|
354
403
|
}
|
|
355
404
|
}
|
|
405
|
+
Applied->SetArrayField(Entry.Key, Wrote);
|
|
406
|
+
bAnyApplied = true;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
if (bAnyApplied)
|
|
410
|
+
{
|
|
411
|
+
CDO->MarkPackageDirty();
|
|
412
|
+
SaveAssetPackage(CDO);
|
|
356
413
|
}
|
|
357
414
|
|
|
358
415
|
auto Result = MCPSuccess();
|
|
416
|
+
MCPSetUpdated(Result);
|
|
359
417
|
Result->SetStringField(TEXT("abilityPath"), AbilityPath);
|
|
360
|
-
Result->SetObjectField(TEXT("
|
|
361
|
-
|
|
418
|
+
Result->SetObjectField(TEXT("applied"), Applied);
|
|
419
|
+
if (Unsupported.Num() > 0)
|
|
420
|
+
{
|
|
421
|
+
TArray<TSharedPtr<FJsonValue>> U;
|
|
422
|
+
for (const FString& S : Unsupported) U.Add(MakeShared<FJsonValueString>(S));
|
|
423
|
+
Result->SetArrayField(TEXT("unsupportedProperties"), U);
|
|
424
|
+
}
|
|
362
425
|
return MCPResult(Result);
|
|
363
426
|
}
|
|
364
427
|
|
|
@@ -370,15 +433,59 @@ TSharedPtr<FJsonValue> FGasHandlers::SetEffectModifier(const TSharedPtr<FJsonObj
|
|
|
370
433
|
FString Attribute;
|
|
371
434
|
if (auto Err = RequireString(Params, TEXT("attribute"), Attribute)) return Err;
|
|
372
435
|
|
|
373
|
-
FString Operation = OptionalString(Params, TEXT("operation"), TEXT("Additive"));
|
|
374
|
-
double Magnitude = OptionalNumber(Params, TEXT("magnitude"), 0.0);
|
|
436
|
+
const FString Operation = OptionalString(Params, TEXT("operation"), TEXT("Additive"));
|
|
437
|
+
const double Magnitude = OptionalNumber(Params, TEXT("magnitude"), 0.0);
|
|
438
|
+
|
|
439
|
+
TSharedPtr<FJsonValue> CdoErr;
|
|
440
|
+
UGameplayEffect* GE = LoadBlueprintCDO<UGameplayEffect>(EffectPath, CdoErr);
|
|
441
|
+
if (!GE) return CdoErr;
|
|
442
|
+
|
|
443
|
+
const FGameplayAttribute GAttr = FindGameplayAttributeByName(Attribute);
|
|
444
|
+
if (!GAttr.IsValid())
|
|
445
|
+
{
|
|
446
|
+
return MCPError(FString::Printf(
|
|
447
|
+
TEXT("Attribute not found: %s. Use 'SetName.Attribute' (or a unique attribute name); the AttributeSet must be compiled/loaded."), *Attribute));
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
const FString Op = Operation.ToLower();
|
|
451
|
+
EGameplayModOp::Type ModOp;
|
|
452
|
+
if (Op == TEXT("additive") || Op == TEXT("add")) ModOp = EGameplayModOp::Additive;
|
|
453
|
+
else if (Op == TEXT("multiplicative") || Op == TEXT("multiply") || Op == TEXT("multiplicitive")) ModOp = EGameplayModOp::Multiplicitive;
|
|
454
|
+
else if (Op == TEXT("division") || Op == TEXT("divide")) ModOp = EGameplayModOp::Division;
|
|
455
|
+
else if (Op == TEXT("override")) ModOp = EGameplayModOp::Override;
|
|
456
|
+
else return MCPError(FString::Printf(TEXT("Unknown operation '%s' (Additive|Multiplicative|Division|Override)"), *Operation));
|
|
457
|
+
|
|
458
|
+
// Update an existing modifier for the same attribute+op, else append one.
|
|
459
|
+
bool bUpdated = false;
|
|
460
|
+
for (FGameplayModifierInfo& M : GE->Modifiers)
|
|
461
|
+
{
|
|
462
|
+
if (M.Attribute == GAttr && M.ModifierOp == ModOp)
|
|
463
|
+
{
|
|
464
|
+
M.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(static_cast<float>(Magnitude)));
|
|
465
|
+
bUpdated = true;
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
if (!bUpdated)
|
|
470
|
+
{
|
|
471
|
+
FGameplayModifierInfo ModInfo;
|
|
472
|
+
ModInfo.Attribute = GAttr;
|
|
473
|
+
ModInfo.ModifierOp = ModOp;
|
|
474
|
+
ModInfo.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(static_cast<float>(Magnitude)));
|
|
475
|
+
GE->Modifiers.Add(ModInfo);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
GE->MarkPackageDirty();
|
|
479
|
+
SaveAssetPackage(GE);
|
|
375
480
|
|
|
376
481
|
auto Result = MCPSuccess();
|
|
482
|
+
MCPSetUpdated(Result);
|
|
377
483
|
Result->SetStringField(TEXT("effectPath"), EffectPath);
|
|
378
|
-
Result->SetStringField(TEXT("attribute"),
|
|
484
|
+
Result->SetStringField(TEXT("attribute"), GAttr.GetName());
|
|
379
485
|
Result->SetStringField(TEXT("operation"), Operation);
|
|
380
486
|
Result->SetNumberField(TEXT("magnitude"), Magnitude);
|
|
381
|
-
Result->
|
|
487
|
+
Result->SetBoolField(TEXT("replacedExisting"), bUpdated);
|
|
488
|
+
Result->SetNumberField(TEXT("modifierCount"), GE->Modifiers.Num());
|
|
382
489
|
return MCPResult(Result);
|
|
383
490
|
}
|
|
384
491
|
|
|
@@ -589,12 +589,13 @@ TSharedPtr<FJsonValue> FNiagaraHandlers::SetEmitterProperty(const TSharedPtr<FJs
|
|
|
589
589
|
bool bSet = false;
|
|
590
590
|
if (PropName.Equals(TEXT("enabled"), ESearchCase::IgnoreCase))
|
|
591
591
|
{
|
|
592
|
-
|
|
593
|
-
// Use mutable access pattern
|
|
592
|
+
const bool bEnabled = Value.ToBool();
|
|
594
593
|
System->Modify();
|
|
595
|
-
//
|
|
594
|
+
// GetEmitterHandles() is const; the editor mutates via a non-const handle.
|
|
595
|
+
FNiagaraEmitterHandle& MutableHandle = const_cast<FNiagaraEmitterHandle&>(Handles[TargetIdx]);
|
|
596
|
+
MutableHandle.SetIsEnabled(bEnabled, *System, /*bRecompileIfChanged*/ true);
|
|
596
597
|
bSet = true;
|
|
597
|
-
Result->
|
|
598
|
+
Result->SetBoolField(TEXT("enabled"), bEnabled);
|
|
598
599
|
}
|
|
599
600
|
|
|
600
601
|
// Try reflection on the EmitterData's properties
|