// Copyright (c) Extra Life Studios, LLC. All rights reserved.
#include "ablAbilityComponent.h"
#include "ablAbility.h"
#include "ablAbilityInstance.h"
#include "ablAbilityUtilities.h"
#include "AbleCorePrivate.h"
#include "ablSettings.h"
#include "ablAbilityUtilities.h"
#include "Animation/AnimNode_AbilityAnimPlayer.h"
#include "Engine/ActorChannel.h"
#include "Engine/World.h"
#include "GameFramework/Pawn.h"
#include "Misc/ScopeLock.h"
#if WITH_EDITOR
#include "FXSystem.h"
#endif
#include "Net/UnrealNetwork.h"
#define LOCTEXT_NAMESPACE "AbleCore"
FAblAbilityCooldown::FAblAbilityCooldown()
: Ability(nullptr),
Context(nullptr),
CurrentTime(0.0f),
CooldownTime(1.0f)
{
}
FAblAbilityCooldown::FAblAbilityCooldown(const UAblAbility& InAbility, const UAblAbilityContext& InContext)
: Ability(nullptr),
Context(nullptr),
CurrentTime(0.0f),
CooldownTime(1.0f)
{
Ability = &InAbility;
Context = &InContext;
CooldownTime = Ability->GetCooldown(Context);
}
void FAblAbilityCooldown::Update(float DeltaTime)
{
if (Ability && Context && !Ability->CanCacheCooldown())
{
CooldownTime = Ability->GetCooldown(Context);
}
CurrentTime += DeltaTime;
}
UAblAbilityComponent::UAblAbilityComponent(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer),
m_ActiveAbilityInstance(),
m_PassivesDirty(false),
m_ClientPredictionKey(0),
m_AbilityAnimationNode(nullptr),
m_ServerPredictionKey(0)
{
PrimaryComponentTick.TickGroup = TG_DuringPhysics;
PrimaryComponentTick.bStartWithTickEnabled = false;
PrimaryComponentTick.bCanEverTick = true;
bTickInEditor = true;
SetIsReplicatedByDefault(true);
m_Settings = GetDefault<UAbleSettings>(UAbleSettings::StaticClass());
m_LocallyPredictedAbilities.Reserve(ABLE_ABILITY_PREDICTION_RING_SIZE);
m_LocallyPredictedAbilities.AddDefaulted(ABLE_ABILITY_PREDICTION_RING_SIZE);
}
void UAblAbilityComponent::BeginPlay()
{
m_TagContainer.AppendTags(m_AutoApplyTags);
Super::BeginPlay();
}
void UAblAbilityComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
if (m_ActiveAbilityInstance.IsValid())
{
m_ActiveAbilityInstance.StopAbility();
}
m_ActiveAbilityInstance.Reset();
m_ActiveAbilityResult = EAblAbilityTaskResult::Successful;
for (FAblAbilityInstance& PassiveInstance : m_PassiveAbilityInstances)
{
if (PassiveInstance.IsValid())
{
PassiveInstance.StopAbility();
}
}
m_PassiveAbilityInstances.Empty();
Super::EndPlay(EndPlayReason);
}
void UAblAbilityComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
DECLARE_SCOPE_CYCLE_COUNTER(TEXT("AblAbilityComponent::TickComponent"), STAT_AblAbilityComponent_TickComponent, STATGROUP_Able);
// Do our cooldowns first (if we're Async this will give it a bit of time to go ahead and start running).
if (m_ActiveCooldowns.Num() > 0)
{
// Go ahead and fire off our cooldown update first.
if (UAbleSettings::IsAsyncEnabled() && m_Settings->GetAllowAsyncCooldownUpdate())
{
TGraphTask<FAsyncAbilityCooldownUpdaterTask>::CreateTask().ConstructAndDispatchWhenReady(this, DeltaTime);
}
else
{
UpdateCooldowns(DeltaTime);
}
}
bool ActiveChanged = false;
bool PassivesChanged = false;
// Check the status of our Active, we only do this on our authoritative client, or if we're locally controlled for local simulation purposes.
if (m_ActiveAbilityInstance.IsValid() &&
(IsAuthoritative() || IsOwnerLocallyControlled()))
{
// Have to turn this on to prevent Users from apparently canceling the Ability that is finishing... (Seems like an extreme case, but whatever).
m_IsProcessingUpdate = true;
// Check for done...
if (m_ActiveAbilityInstance.IsIterationDone())
{
if (m_ActiveAbilityInstance.IsDone())
{
if (m_Settings->GetLogVerbose())
{
UE_LOG(LogAble, Warning, TEXT("[%s] TickComponent [%s] IsDone, Queueing cancel."),
*FAbleLogHelper::GetWorldName(GetOwner()->GetWorld()),
*m_ActiveAbilityInstance.GetAbility().GetDisplayName());
}
m_PendingCancels.Add(FAblPendingCancelContext(m_ActiveAbilityInstance.GetAbilityNameHash(), EAblAbilityTaskResult::Successful));
ActiveChanged = true;
}
else
{
m_ActiveAbilityInstance.ResetForNextIteration();
}
}
// Check for Channeling...
if (!ActiveChanged && m_ActiveAbilityInstance.IsChanneled())
{
if (m_ActiveAbilityInstance.CheckChannelConditions() == EAblConditionResults::ACR_Failed)
{
m_ActiveAbilityResult = m_ActiveAbilityInstance.GetChannelFailureResult();
if (m_Settings->GetLogVerbose())
{
UE_LOG(LogAble, Warning, TEXT("[%s] TickComponent [%s] Channel Condition Failure [%s], Queueing cancel."),
*FAbleLogHelper::GetWorldName(GetOwner()->GetWorld()),
*(m_ActiveAbilityInstance.GetAbility().GetDisplayName()),
*FAbleLogHelper::GetTaskResultEnumAsString(m_ActiveAbilityResult));
}
if (!IsAuthoritative() && m_ActiveAbilityInstance.RequiresServerNotificationOfChannelFailure())
{
ServerCancelAbility(m_ActiveAbilityInstance.GetAbilityNameHash(), m_ActiveAbilityInstance.GetChannelFailureResult());
}
m_PendingCancels.Add(FAblPendingCancelContext(m_ActiveAbilityInstance.GetAbilityNameHash(), m_ActiveAbilityInstance.GetChannelFailureResult()));
ActiveChanged = true;
}
}
m_IsProcessingUpdate = false;
}
int32 PrePendingPassiveCount = m_PassiveAbilityInstances.Num();
// Handle any Pending cancels.
HandlePendingCancels();
#if WITH_EDITOR
if (ActiveChanged && m_ActiveAbilityInstance.IsValid())
{
UE_LOG(LogAble, Warning, TEXT("Killed Active Ability manually after it failed to cancel."));
m_ActiveAbilityInstance.Reset();
}
#endif
bool ActiveWasValid = m_ActiveAbilityInstance.IsValid();
// Handle any Pending abilities.
HandlePendingContexts();
ActiveChanged |= ActiveWasValid != m_ActiveAbilityInstance.IsValid();
PassivesChanged |= m_PassivesDirty;
// Try and process our Async targeting queue..
TArray<UAblAbilityContext*> RemovalList;
for (TArray<UAblAbilityContext*>::TIterator ItAsync = m_AsyncContexts.CreateIterator(); ItAsync; ++ItAsync)
{
EAblAbilityStartResult StartResult = InternalStartAbility((*ItAsync));
if (StartResult != EAblAbilityStartResult::AsyncProcessing)
{
// We got some result (either pass or fail), remove this from further processing.
RemovalList.Add(*ItAsync);
if ((*ItAsync)->GetAbility()->IsPassive())
{
PassivesChanged = true;
}
else
{
ActiveChanged = true;
}
}
}
for (UAblAbilityContext* ToRemove : RemovalList)
{
m_AsyncContexts.Remove(ToRemove);
}
m_IsProcessingUpdate = true;
// Update our Active
if (m_ActiveAbilityInstance.IsValid())
{
// Process update (or launch a task to do it).
InternalUpdateAbility(&m_ActiveAbilityInstance, DeltaTime * m_ActiveAbilityInstance.GetPlayRate());
}
// Update Passives
FAblAbilityInstance* Passive = nullptr;
for (int i = 0; i < m_PassiveAbilityInstances.Num(); ++i)
{
Passive = &m_PassiveAbilityInstances[i];
if (Passive->IsValid())
{
bool PassiveFinished = false;
if (Passive->IsChanneled() && (IsAuthoritative() || IsOwnerLocallyControlled()))
{
if (Passive->CheckChannelConditions() == EAblConditionResults::ACR_Failed)
{
UE_LOG(LogAble, Warning, TEXT("[%s] TickComponent [%s] Channel Condition Failure [%s]"),
*FAbleLogHelper::GetWorldName(GetOwner()->GetWorld()),
*(Passive->GetAbility().GetDisplayName()),
*FAbleLogHelper::GetTaskResultEnumAsString(Passive->GetChannelFailureResult()));
CancelAbility(&Passive->GetAbility(), Passive->GetChannelFailureResult());
continue;
}
}
if (Passive->IsIterationDone() && (IsAuthoritative() || IsOwnerLocallyControlled()))
{
if (Passive->IsDone())
{
if (m_Settings->GetLogVerbose())
{
UE_LOG(LogAble,
没有合适的资源?快使用搜索试试~ 我知道了~
UE 技能插件able 支持最新版本 5.3 方便找资源
共300个文件
h:109个
cpp:106个
png:67个
需积分: 0 0 下载量 4 浏览量
2023-11-07
21:35:14
上传
评论
收藏 733KB ZIP 举报
温馨提示
able 插件
资源推荐
资源详情
资源评论
收起资源包目录
UE 技能插件able 支持最新版本 5.3 方便找资源 (300个子文件)
ablAbilityComponent.cpp 59KB
ablAbilityEditor.cpp 53KB
SAbilityPropertyBinding.cpp 29KB
ablAbilityInstance.cpp 26KB
ablCollisionQueryTypes.cpp 26KB
ablAbility.cpp 25KB
SAbilityTimeline.cpp 24KB
ablPlayAnimationTask.cpp 22KB
IAblAbilityTask.cpp 20KB
ablCollisionSweepTypes.cpp 17KB
SAbilityTimelineTrack.cpp 17KB
ablTargetingFilters.cpp 16KB
ablTargetingCone.cpp 15KB
ablPlayParticleEffectTask.cpp 15KB
SAbilityEditorToolbar.cpp 15KB
ablCollisionFilters.cpp 14KB
ablMoveToTask.cpp 13KB
ablAbilityDebug.cpp 13KB
ablAbilityContext.cpp 13KB
ablRayCastQueryTask.cpp 12KB
SAbilityTaskPicker.cpp 12KB
ablAbilityEditorViewportClient.cpp 12KB
ablAbilityBlueprintFactory.cpp 11KB
ablPlaySoundTask.cpp 11KB
AbleStyle.cpp 11KB
ablOverlapWatcherTask.cpp 11KB
ablSetShaderParameterTask.cpp 11KB
ablCollisionQueryTask.cpp 10KB
ablAbilityTaskValidator.cpp 10KB
ablSpawnActorTask.cpp 10KB
ablCollisionSweepTask.cpp 10KB
SAbilityTimelineScrubPanel.cpp 9KB
ablDamageEventTask.cpp 9KB
ablBranchTask.cpp 9KB
SAbilityPropertyViewers.cpp 9KB
AnimNode_AbilityAnimPlayer.cpp 9KB
SAbilityGenericAssetShortcut.cpp 9KB
SAbilityDetailView.cpp 9KB
ablJumpToTask.cpp 8KB
SAbilityValidatorResultsDlg.cpp 7KB
ablAbilityEditorModes.cpp 7KB
SAbilityTimelineStatus.cpp 7KB
ablTargetingBox.cpp 7KB
ablAbilityTypes.cpp 7KB
SAbilityViewportToolbar.cpp 7KB
ablSetCollisionChannelResponseTask.cpp 6KB
BTDecorator_IsInAbilityRange.cpp 6KB
ablCustomTask.cpp 6KB
SAbilityPreviewAssetClassDlg.cpp 6KB
SAbilitySelectPreviewAssetDlg.cpp 6KB
ablBranchCondition.cpp 6KB
ablTurnToTask.cpp 6KB
ablSubSystem.cpp 6KB
SAbilityAnimationSelector.cpp 6KB
ablChannelingConditions.cpp 6KB
ablIgnoreInputTask.cpp 5KB
SAbilityPropertyDlgs.cpp 5KB
BTTask_PlayAbility.cpp 5KB
ablAbilityValidator.cpp 5KB
AbleEditor.cpp 5KB
ablAbilityBlueprintLibrary.cpp 5KB
ablPlayCameraShakeTask.cpp 5KB
ablPlayAbilityTask.cpp 5KB
ablTargetingMisc.cpp 5KB
AnimGraphNode_AbilityAnimPlayer.cpp 5KB
ablCancelAbilityTask.cpp 5KB
ablTargetingRaycast.cpp 5KB
AblAbilityTaskDetails.cpp 5KB
ablTargetingCapsule.cpp 5KB
ablPlayForcedFeedbackTask.cpp 4KB
ablTargetingSphere.cpp 4KB
SAbilityViewport.cpp 4KB
ablSetCollisionChannelTask.cpp 4KB
ablAbilityEditorCommands.cpp 4KB
ablAbilityUtilities.cpp 4KB
ablSetGameplayTagTask.cpp 4KB
BTDecorator_HasActivePassiveAbility.cpp 4KB
BTDecorator_IsAbilityOnCooldown.cpp 4KB
ablPossessionTask.cpp 3KB
ablCheckConditionTask.cpp 3KB
AssetTypeActions_ablAbilityBlueprint.cpp 3KB
BTTask_StopAbility.cpp 3KB
ablTargetingBase.cpp 3KB
ablPlayParticleEffectParams.cpp 2KB
ablModifyContextTask.cpp 2KB
ablRemoveGameplayTagTask.cpp 2KB
BTDecorator_IsPlayingAbility.cpp 2KB
ablCustomEventTask.cpp 2KB
ablAbilityEditorAddTaskHandlers.cpp 2KB
AblAbilityThumbnailRenderer.cpp 2KB
ablSetShaderParameterValue.cpp 2KB
BTTask_FindTarget.cpp 2KB
AbleEditorEventManager.cpp 1KB
AblAbilityEditorSettings.cpp 1KB
ablChannelingBase.cpp 1KB
ablSettings.cpp 1KB
ablAbilityBlueprint.cpp 1KB
ablValidation.cpp 1KB
ablAbilityGraphSchema.cpp 1KB
Able.cpp 664B
共 300 条
- 1
- 2
- 3
资源评论
萌新翁小军
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功