---
# System prepended metadata

title: Untitled

---

* Config.AimingStanceContainer <--- UConfigObj_AimingStanceContainer extends UConfigObj_Parent
* Config.AimingStance          <--- UConfigObj_AimingStance extends UConfigObj
    * TurnRate
    * LookAtYaw
* FAimingStanceRequirements
    * AimingStance Tag
    * RequirementTagList
    * Potential other logic if necessary beyond just tags

* Config.AimingStanceContainer
    * Config.AimingStance.Default
        * TurnRate = 90
        * LookAtYaw = 5
    * Config.AimingStance.Falling
    * Config.AimingStance.Cover
    * Config.AimingStance.ADS
    * Config.AimingStance.ADS.Cover
    * AimingStanceRequirements
        * Entry
            * AimingStanceConfigTag = Config.AimingStance.ADS.Cover
            * Requires = Character.Status.ADS, Character.Status.Cover
            * Ignores = Character.Status.Downed
        * Entry
            * AimingStanceConfigTag = Config.AimingStance.ADS
            * Requires = Character.Status.ADS
            * Ignores = Character.Status.Downed

```
struct FAimingStanceRequirements
{
    UPROPERTY(EditDefaultsOnly, Category=Config, meta=(Categories="Config.AimingStance", RequiredConfig))
    FGameplayTag AimingStanceTag;
    
    UPROPERTY(EditDefaultsOnly, Category=Config)
    FGameplayTagRequirements StanceTagRequirements;
}

class UConfigObj_AimingStanceContainer : public UConfigObj_Parent
{
public:

    static FGameplayTag DefaultAimingStanceTag;
    UConfigObj_AimingStanceContainer()
    {
        REGISTER_CONFIG_OBJ(...)
        
        REGISTER_REQUIRED_CONFIG_TAG(DefaultAimingStanceTag, UConfigObj_AimingStanceContainer::StaticClass(), "Config.AimingStance.Default")
        
    }
    UConfigObj_AimingStance* GetBestAimingStance(AAPCharacter* Character) const
    {
        IterateThroughAimingStanceRequirements
        FGameplayTag AimingConfigTagToUse = first matching
        if found
           return GetConfigObj<UConfigObj_AimingStance>(AimingConfigTagToUse)
       else
           return GetConfigObj<UConfigObj_AimingStance>(DefaultAimingStanceTag)
    }
    
private:
    UPROPERTY(EditDefaultsOnly, Category=Config, meta=(RequiredConfig))    //Might or might not be necessary to put RequiredConfigHere
    FAimingStanceRequirements AimingStanceRequirements;
}
```


// Leaving tags


* Stance.ADS
    * LeavingTags: 
        * Gun.Special ->
* Stance.HipFiring.Special
    * Gun.Special
* Stance.HipFiring

* Stance.HumanShield.ADS
    * Character.Status.HumanShield
    * Character.Status.ADS
    * LeavingTags
        * Character.AnimStance.Aiming.Lingering -> 2 seconds
* Stance.HumanShield.Hipfire
    * Character.Status.HumanShield
    * AND
    * (Character.Status.Aiming OR Character.AnimStance.Aiming.Lingering)
* Stance.HumanShield
    * Character.Status.HumanShield
* Stance.ADS
    * Character.Status.ADS
    * LeavingTags
        * Character.AnimStance.Aiming.Lingering -> 2 seconds
* Stance.Hipfire.RocketLauncher
    * Gun.RocketLauncher
    * (Character.Status.Aiming OR Character.AnimStance.Aiming.Lingering)
* Stance.Hipfire
    * (Character.Status.Aiming OR Character.AnimStance.Aiming.Lingering)

Requirements by a FGameplayTagQuery

UCPGAbilitySystemComponent->ApplyLooseTagWithDuration but maybe I should create my own
AddLooseGameplayTag or RemoveLooseGameplayTag

SubConfigObject for LeavingTags on each specific Stance