Developer settings and combat data
This page covers the configuration objects an attack reads as it moves from a request into EffectContext and then into an attack result. Runtime flow is in Combat Flow and attack results and Attack definitions and requests.
UGCS_DeveloperSettings
A project-level UDeveloperSettings with Config=Game. Its Details name is Generic Combat System Developer Settings. Read it with the Blueprint node Get GCS Developer Settings or UGCS_DeveloperSettings::Get(). It only exposes two global lookup / debug switches. It does not own Combat Flow, processors, or attack tables.
Field | Purpose | When to change | Misconfiguration |
|---|---|---|---|
| Component tag used to find the character’s main skeletal mesh. Default | The character mesh is tagged something other than | A mismatched tag makes melee / bullet socket origins fall back to the actor origin or a null component. |
| Debug switch that turns off affiliation filtering so cross-team damage and lock-on are allowed. | Local tests for friendly fire or training dummies. | Leaving it on in default ini makes |
After edits, check [/Script/GenericCombatSystem.GCS_DeveloperSettings] in DefaultGame.ini. The character mesh tag must match this value.
FGCS_AttackDefinition
A Data Table row (display name GCS Attack Definition). Melee requests, bullet definitions, and the function library all read “what to apply on hit” from here. Lifecycle: authored in a table → a request or bullet carries the row handle → applying a GE writes the handle into FGCS_ContextPayload_Combat → Combat Flow / processors read it back.
TargetEffectClass and TargetEffectContainer are not exclusive. When both are valid they apply independently, and the handle is written into each spec’s EffectContext. AttackTags are appended as dynamic AssetTags. SetByCallerMagnitudes only writes entries whose Value > 0.
Field | Purpose | When to change | Misconfiguration |
|---|---|---|---|
| Describes the attack (melee/ranged, slash/strike). | Processors or tag relationships branch on attack type. | An empty container leaves Cue / Event processors matching only other aggregated tags. |
| Fills SetByCaller on the spec. | Damage scales, force factors. | Entries with |
| Soft-referenced GE class applied to the hit target. | One hit changes one attribute set, such as health. | An unloaded soft reference never builds that GE. |
| Level for that GE. Default 1. Values | Scaling with ability level. | |
| A GGA effect container applied alongside | Damage plus a status, or when a TargetingPreset picks targets. | An invalid container leaves only the single GE. Both empty means the hit has no settlement GE. |
| Cue tags to execute on the target. | Hit flashes, material pulses. | A non-empty list replaces the built-in GameplayCue processor’s own cue list. |
| Knockback distance (cm) and multiplier. Defaults 100 / 1. Multiplier ClampMin=1. | A project processor or hit-react ability reads knockback from the definition. | The plugin has no built-in knockback processor. Numbers alone do not move the target. |
| Hit-stall seconds. | Heavy hits that freeze animation. | Project code must read it. Changing the field does nothing without a reader. |
| Hit animation play-rate factor. Clamped 0.1–0.9, default 0.1. | Slow-mo with the stall. | Same as above: definition payload only. |
| C++ | Native code adds fields to the row. | Blueprint cannot read this struct. |
| Blueprint | Designers add custom row data. | The wrong struct type makes |
Melee stores the row handle on UGCS_AttackRequest_Melee. Ranged hangs the same row on FGCS_BulletDefinition.AttackDefinition. The bullet system builds GEs on the authority and calls AddAttackHandleToGameplayEffectSpec.
Attack requests
UGCS_AttackRequest_Base is an Abstract, Const, DefaultToInstanced, EditInlineNew UObject. The base GetAttackDefinitionHandle is empty; concrete types must supply a row handle. GetAttackDefinition() reads the table and returns a default empty definition when the row is invalid.
UGCS_AttackRequest_Melee
An animation window or Collision Trace Task carries this request while the window is active. TracesToControl decides which traces start and stop; AttackDefinitionHandle points at an FGCS_AttackDefinition row.
Field | Purpose | When to change | Misconfiguration |
|---|---|---|---|
| Trace tags this window controls. | One weapon has blade and tip traces. | Tags that do not match |
| Attack-definition row used after a hit. | One row per melee move. | An empty handle leaves GEs without combat context, so processors read an empty definition. |
UGCS_AttackRequest_Bullet
A bullet request also decides spawn origin, aim, and whether a lock is required. GetTargetingTransform, GetWeaponTargetingSourceLocation, and GetPawnTargetingSourceLocation can be overridden. Socket fields hide when the source is CameraTowardsFocus. AI or non-locally-controlled shots spawn on the authority and skip local trajectory prediction.
Field | Purpose | When to change | Misconfiguration |
|---|---|---|---|
| Bullet-definition row. | One row per ammo type. | An empty handle or wrong row struct never spawns a bullet. |
| Where the launch transform comes from. Default | Muzzle follows the hand, camera, or lock-on. | |
| Tag used to find the source component. | The mesh is not the default component. | |
| Character or weapon socket. Missing sockets fall back to the source location. | Muzzle, bowstring. | A typo spawns from the hand or weapon origin and looks like “shots go wide.” |
| Extra offset on the source location. | Nudge the muzzle forward. | A large offset can spawn inside the shooter’s collision. |
| Whether a locked target is required. | Lock-on shots, guided attacks. | When true, an empty |
| A targeting preset used only for this shot. | A one-off search that does not use the pawn’s targeting component. | An empty preset plus |
GetAttackDefinitionHandle forwards to the bullet definition’s AttackDefinition. Settlement GEs still come from that row, not from a second copy on the request.
FGCS_AttackResult
One result produced by Combat Flow after an attribute PostGameplayEffectExecute (and after a local predicted execute when the predictive-execute component is present). Authoritative results replicate through the FGCS_AttackResultContainer FastArray. Predicted results stay local until a matching PredictionKey arrives and sets bWasPredicated.
Field | Purpose | When it appears | Misconfiguration |
|---|---|---|---|
| Optional object related to the attack. | Project flow attaches a process object. | The pointer may be invalid after replication. Do not treat it as authoritative state. |
| GE context that carries the combat payload, hit result, and causer. | Every result built from an attribute callback. | If the attack-definition handle was never written, processors read an empty definition. |
| Aggregated source / target tags. | Processors with tag requirements. | Empty source tags make Event / Cue processors with a query never match. |
| Local: whether this result was consumed. Not replicated. | A processor or project mark “already used.” | Consumed results do not enter processors again. |
| Local: the replicated result matched a local prediction via PredictionKey. Not replicated. | After a predicted hit lines up with authority. | When true, LocalPredicted processors do not run a second time. |
| Local: this entry arrived through the FastArray. Not replicated. | After the client receives an authoritative entry. | ServerOnly processors skip it. |
The container has a size cap (default 10 on the component). It is a history buffer, not an authoring asset. Base HandleGameplayEffectExecute is empty. A project Combat Flow must fill the result from the attribute callback and call RegisterAttackResult.
FGCS_ContextPayload_Combat
Combat payload attached to a GGA EffectContext. The function library writes table and row names when applying an attack definition. The predictive-execute component writes PredictionKey and bIsPredictingContext. Ability System Globals must be the GGA class, or this payload is never allocated.
Field | Purpose | When it is written | Misconfiguration |
|---|---|---|---|
| The spec is executing locally as a prediction. | When the predictive-execute component runs on AutonomousProxy. | Default / ServerOnly processors skip it. |
| Pairs a local predicted result with the replicated authority result. | Predictive-execute | Without it, the replicated result cannot set |
| Attack-definition table and row. | | Applying a GE without the function library leaves processors with no definition. |
| Bullet-definition table and row. | When a bullet builds its GE. | Empty on melee results is normal. |
| Tags appended while applying the GE, for example from an MMC. | Flow PreApply or a calculation class. | The Event processor merges them into Instigator Tags. |
| Tagged floats. The Cue processor can read Raw / Normalized Magnitude by tag. | Settlement writes a damage magnitude. | A mismatched Magnitude tag on the Cue yields 0. |
SetTaggedValue / GetTaggedValue overwrite or read by tag. A missing value returns 0.
UGCS_AbilityActionSetSettings
A DataAsset (display name GCS Ability Action Set). It is not Developer Settings and not a character component. QueryAbilityActionsByContext on the combat entity typically hands the current weapon or ability context to this asset and receives the montage and optional Cost GE for this move.
SelectBestAbilityActions(SourceTags, TargetTags, AbilityTags, OutActions) picks the first ActionSets entry whose AbilityTag MatchesAny(AbilityTags). It then walks Layered; the first layer whose Source and Target queries both match supplies Actions. Otherwise it falls back to that set’s default Actions. No AbilityTag match returns false.
FGCS_AbilityAction
Field | Purpose | When to change | Misconfiguration |
|---|---|---|---|
| | One row per move. | An empty montage can still be selected, so the ability fires with no animation. |
| Playback rate. Default 1. | Fast / slow versions of the same montage. | A very low rate stretches the Trace window and looks like a lingering hitbox. |
| Cost GE applied when this action is chosen. | Different moves spend different stamina. | Pairing this with the ability’s own Cost GE spends twice. |
| C++ | Native fields on the action. | There is no Blueprint InstancedStruct on this field. |
The same struct also has StartSection, bStopWhenAbilityEnds, and root-motion scale. Layered overrides default Actions with Source / Target TagQueries, which fits “play a different montage against an airborne target.”
UGCS_GEComponent_PredictivelyExecute
An Effect Component on an instant Gameplay Effect. When AutonomousProxy applies the effect locally, it writes the current PredictionKey into the combat payload, sets bIsPredictingContext, then calls PredictivelyExecuteEffectSpec. Local attribute callbacks therefore enter Combat Flow and produce a predicted FGCS_AttackResult.
Field | Purpose | When to enable | Misconfiguration |
|---|---|---|---|
| Also predict Cue execution with the effect. | Hit flashes that must appear immediately. | The Cue processor still needs |
Local bullet prediction only predicts trajectory and presentation. It does not use this GE path. For local melee hit feedback, add this component to the target Instant GE and keep processors on the matching ExecutePolicy. See Processors and combat hooks.