BertaGASCompanionExt
BertaGASCompanionExt is an optional Unreal Engine 5.8 Runtime/Editor extension for projects already using GAS Companion. It is disabled by default and does not replace, fork, or modify GAS Companion.
Setup
Install a licensed copy of GAS Companion at BertaDevKitHost/Plugins/GASCompanion/, then enable BertaDevKit, GAS Companion, Targeting System, and BertaGASCompanionExt. The local GAS Companion directory is ignored and must never be committed.
Runtime diagnostics
- Build GSC Ability Activation Report returns an explicit success result plus a structured, deterministic report for one Actor and exact Ability class. It combines native BertaDevKit cooldown/cost/activation checks with grant, active, Enhanced Input binding, and public Ability Queue state.
- Build Ability Readiness Report inspects every exact granted spec on the Actor's local ASC in deterministic class-path/spec-handle order. Each entry reuses the single-ability checks, preserves simultaneous cost/cooldown/activation blockers, reports active state, input binding, and current queue eligibility, and provides full and Problems Only text. It never activates, commits, queues, or otherwise mutates an ability.
- Build Effective Loadout Snapshot reports the local ASC's granted abilities, active Gameplay Effects, spawned Attribute Sets, and effective owned Gameplay Tags. It is an on-demand read-only snapshot with no Tick or world scan; on a networked game it represents only state currently known by that local ASC.
UBertaGSCTraceComponentrecords publicUGSCCoreComponentevents without Tick.StartTracing,StopTracing,ClearTrace,GetTraceEvents, andDumpTraceToTextmanage a bounded buffer with optional logging. AttributeOldValueis marked known only when a prior value was observed in the current trace; the first observation is formatted asOld=unknown. Explicit old stack counts remain known.UBertaGSCAbilityQueueInputBridgeComponentnever observes global ability failures. CallReportInputDrivenFailureonly from the handler of the supplied Enhanced Input action, immediately after that handler's activation attempt fails. The bridge verifies the action againstUGSCAbilityInputBindingComponent's current public runtime binding, queue state, and allow-list before forwarding. It listens toUGSCCoreComponent::OnInitAbilityActorInfoso auto-start waits for and rebinds to PlayerState or Pawn ASCs. Ability-end reconciliation is deferred one frame and is allowed only for a failure the bridge itself submitted, so native GSC handling wins without making unrelated queue state the bridge's responsibility.
GAS Companion does not expose a public delegate from its private Enhanced Input activation handler carrying a failed attempt's provenance. Consequently the bridge cannot safely integrate automatically with that private handler: projects needing this compatibility path must use an explicit input handler that calls ReportInputDrivenFailure. AI, Gameplay Event, and programmatic activation failures are intentionally ignored unless a caller violates that explicit API precondition.
Provenance confidence
Loadout provenance never comes from matching runtime classes against static Ability Set contents:
- Proven means the snapshot displays direct runtime evidence. For abilities this is a populated
FGameplayAbilitySpec::SourceObjectand/or the active Gameplay Effect handle that UE's ASC explicitly links to that exact spec. For active effects it is the effect context's recorded instigator, effect causer, or source object. The evidence text names exactly what was observed; aSourceObjectis not relabeled as an Ability Set grant. - Inferred is available in the structured model for callers that add a defensible correlation, but the stock snapshot does not manufacture inferred origins.
- Unknown means the public runtime APIs do not expose sufficient source evidence. This is expected for many direct/dynamic grants, spawned Attribute Sets, and owned tag counts. GAS does not publicly split an effective tag count into loose-tag and Gameplay-Effect contributions.
GSC's public FGSCAbilitySetHandle carries handles when the granting caller retains it, but GSC does not expose a public runtime registry mapping the ASC's current items back to Ability Sets or Game Features. Therefore the inspector does not claim Granted by AbilitySet or Granted by GameFeature without project-owned evidence.
Editor validation and tag search
UBertaGSCAbilitySetValidator integrates with Data Validation and consumes the same findings as the contract auditor instead of duplicating checks. It reports exact Ability Set entries for unresolved or non-instantiable classes, invalid levels, broken Input Actions, unresolved configured InitializationData, exact duplicate grants, and conflicting same-ability mappings. Shared Input Actions across different abilities are warnings because GAS Companion supports ability stacks for one action. The local GSC public headers explicitly constrain InitializationData with RowStructure=/Script/GameplayAbilities.AttributeMetaData, so configured tables are validated against FAttributeMetaData.
UBertaGSCContractAuditLibrary::AuditAsset is an Editor-only, read-only audit for one UGSCAbilitySet, GSC Add Abilities/Input Mapping action, or UGameFeatureData. A Game Feature Data audit traverses its public GSC actions and reports broken references, exact duplicates, conflicting levels/input configuration, repeated Ability Sets, direct-versus-Ability-Set overlap, and Input Actions not mapped by a GSC mapping action in the same asset. Missing same-asset mappings are warnings with explicit evidence that another project system may supply them; they are not reported as proof of failure. Duplicate Input Mapping Context severity accounts for UE 5.8 registration tracking. Findings have stable keys and deterministic Error/Warning/Info ordering. The API intentionally audits a concrete asset rather than adding a speculative whole-project scan or custom UI.
The generic UBertaGameplayTagUsageFinder lives in BertaDevKitEditor and has no GAS Companion dependency. Call it from an Editor Utility Blueprint or C++ with selected-assets, explicit-root, or Whole Project scope. The existing C++ enum identifiers remain ExplicitGameRoot and WholeGame for Blueprint compatibility, but their displayed names and behavior cover mounted project content roots: /Game, project content plugins, and mounted project Game Feature Plugins, without scanning arbitrary Engine content. Large scans show cancelable progress. The return value is false when canceled or when candidate assets fail to load, while partial results remain available and OutSummary reports Status=PartialCanceled or Status=PartialLoadFailures plus candidate, processed, loaded, failed, skipped, and result counts. Load failures are aggregated and observable without one log per result.
Targeting
UBertaGSCTargetType_DebugProxydelegates to another configured GSC TargetType and preserves its results while optionally logging and drawing new hits/actors.UBertaGSCTargetType_TargetingPresetexecutes a UE 5.8UTargetingPresetthrough the supported immediate request path, converts native hit/actor results, avoids duplicates, and releases the request handle synchronously.
Manual verification
Use /Game/Maps/DebugMap in a project with GAS Companion enabled. These checks require Unreal Editor and are intentionally not run by automated repository work.
- Activation report: grant a known Ability, bind an Input Action, configure cooldown/cost and an Ability Queue window, then call Build GSC Ability Activation Report before, during, and after activation. Confirm grant level, active state, failure tags, timing, binding, queue state, and summary.
- Readiness Matrix: use an Actor with multiple granted abilities: one Ready, one Active, one on cooldown, one without enough cost, one tag-blocked, and one Enhanced Input binding. Inspect with the queue open and closed. Confirm all simultaneous blockers, deterministic ordering, aggregate counts, and Problems Only filtering.
- Effective Loadout: inspect direct, Ability Set, Game Feature, and dynamic ability grants plus an active Gameplay Effect, Attribute Set, loose Gameplay Tag, and GE-granted Gameplay Tag. Confirm effective state is present and every origin without direct runtime evidence says
Unknown; reject any apparent Ability Set/Game Feature attribution based only on matching classes. - Contract Audit: audit valid and broken assets containing an unresolved soft reference, exact duplicate grant, conflicting level, shared input, repeated Ability Set reference, and direct-plus-Ability-Set overlap. Confirm Error/Warning/Info severity, exact property/evidence paths, deterministic output, and the
FAttributeMetaDatatable-row contract. - Live Trace: add
UBertaGSCTraceComponent, callStartTracing, exercise ability activation/end/failure/commit, cooldowns, effects, stacks/timing, tags, and attributes, then inspectGetTraceEventsandDumpTraceToText. Confirm the first attribute observation saysOld=unknown; subsequent observations use only the last actually observed value, including across clamps and non-additive modifiers. Repeated Start/Stop andClearTracemust reset that history without duplicate events; reducingMaximumEventCountmust retain only the newest entries. - Queue bridge: test ASC in Character and PlayerState on server and owning client. From an explicit Enhanced Input handler, report a failed bound ability during an open queue and confirm it queues and activates exactly once. Confirm closed queue, disallowed ability, mismatched action, and AI/code/Gameplay Event failures never forward. Repeat after respawn, repossession, and PlayerState replication; auto-start must wait for and rebind to the current ASC. Simulated proxies must remain passive unless explicitly driven.
- Ability Set validation: validate assets with valid, broken, and wrong-row-structure configured
InitializationData; errors must report the asset and exactGrantedAttributesindex. Also confirm normal valid/invalid Ability, Attribute, Effect, Input Action, level, and duplicate cases remain read-only. - Gameplay Tag usages: search
/Game, a project content plugin, and a mounted Game Feature Plugin. Cancel a Whole Project scan and confirm partial results/counts, then force or observe a load failure and confirm the aggregated warning. Confirm direct tags, containers, queries, nested structs, arrays, sets, maps, nested package-owned UObjects, and Blueprint CDO defaults; compare Exact and ParentOrChild modes and check deterministic ordering. - Target debug proxy: create a Blueprint subclass, configure a non-proxy
InnerTargetType, enable log/draw, and use it in a GSC Effect Container. Confirm target results match the inner TargetType exactly and diagnostics show only produced results. Verify null and recursive configuration fail safely. - Targeting preset adapter: configure a synchronous
UTargetingPreset, use the adapter in a GSC Effect Container, and confirm selected native targets receive the effects once. Test empty results and missing preset; neither should mutate gameplay state or leak a request.