스태미나 무제한 아이템 개발
- 특정 시간동안 스태미나 무제한 버프 (Modifier : Override)
- "Buff.StaminaBoost" 태그 부착
```
UEGItem_StaminaBoostEffect::UEGItem_StaminaBoostEffect()
:BoostDuration(10.0f)
{
DurationPolicy = EGameplayEffectDurationType::HasDuration;
DurationMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(BoostDuration));
FGameplayModifierInfo StaminaModifier;
StaminaModifier.ModifierOp = EGameplayModOp::Override;
StaminaModifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(100.f));
StaminaModifier.Attribute = UEGCharacterAttributeSet::GetStaminaAttribute();
Modifiers.Add(StaminaModifier);
UTargetTagsGameplayEffectComponent* TargetTags = CreateDefaultSubobject<UTargetTagsGameplayEffectComponent>(TEXT("TargetTags"));
FInheritedTagContainer TagChanges = TargetTags->GetConfiguredTargetTagChanges();
TagChanges.Added.AddTag(FGameplayTag::RequestGameplayTag(FName("Buff.StaminaBoost")));
TargetTags->SetAndApplyTargetTagChanges(TagChanges);
GEComponents.Add(TargetTags);
}
```
다른 플레이어를 몇 초동안 강제로 점프시키는 아이템 개발
void AEGItem_ForceJump::OnPickUp_Implementation(AActor* PickUpActor)
{
if (HasAuthority())
{
for (TActorIterator<AEGChickenCharacter> It(GetWorld()); It; ++It)
{
AEGChickenCharacter* OtherCharacter = *It;
if (OtherCharacter && OtherCharacter != PickUpActor)
{
if (UAbilitySystemComponent* ASC = UAbilitySystemGlobals::GetAbilitySystemComponentFromActor(OtherCharacter))
{
FGameplayAbilitySpec Spec = FGameplayAbilitySpec(ForceJumpAbilityClass, 1, INDEX_NONE);
FGameplayAbilitySpecHandle Handle = ASC->GiveAbility(Spec);
if (Handle.IsValid())
{
ASC->TryActivateAbility(Handle);
}
}
}
}
}
Super::OnPickUp_Implementation(PickUpActor);
}
UEGItem_ForceJumpAbility::UEGItem_ForceJumpAbility()
{
...
NetExecutionPolicy = EGameplayAbilityNetExecutionPolicy::LocalPredicted;
}
void UEGItem_ForceJumpAbility::ActivateAbility(...)
{
...
// 서버 및 Predict을 진행하는 클라이언트에서 실행
if (HasAuthorityOrPredictionKey(ActorInfo, &ActivationInfo))
{
GetWorld()->GetTimerManager().SetTimer(
JumpTimerHandle,
FTimerDelegate::CreateUObject(this, &ThisClass::ForceJump, Character),
JumpInterval,
true);
GetWorld()->GetTimerManager().SetTimer(
DurationTimerHandle,
this,
&ThisClass::OnDurationFinished,
AbilityDuration,
false);
}
}