241 lines
6.3 KiB
C++
Raw Normal View History

2025-06-18 10:07:14 +08:00
// Fill out your copyright notice in the Description page of Project Settings.
#include "Skill.h"
2025-09-02 17:26:50 +08:00
#include "InputTriggers.h"
2025-07-21 17:00:29 +08:00
#include "SkillTrigger.h"
2025-06-18 10:07:14 +08:00
#include "SkillEffects/SkillEffect_Charge.h"
#include "SkillEffects/SkillEffect_Damage.h"
2025-07-22 18:06:10 +08:00
#include "SkillEffects/SkillEffect_DamageReduce.h"
2025-07-22 10:57:27 +08:00
#include "SkillEffects/SkillEffect_EnhanceFishRod.h"
#include "SkillEffects/SkillEffect_EnhanceSkill.h"
2025-06-18 10:07:14 +08:00
#include "SkillEffects/SkillEffect_Heal.h"
#include "SkillEffects/SkillEffect_ModifyCD.h"
#include "SkillEffects/SkillEffect_ModifySpeed.h"
#include "SkillEffects/SkillEffect_SER.h"
2025-09-01 11:54:05 +08:00
void USkill::InitSkill(class APawnWithSkill* owner, USkillManager* skillManager, const FPlacedSkillInfo& PlacedSkill)
2025-06-18 10:07:14 +08:00
{
this->Owner = owner;
this->SkillManager = skillManager;
2025-09-01 11:54:05 +08:00
this->SkillData = PlacedSkill.SkillAsset;
this->BagPosition = FIntPoint(PlacedSkill.PositionX, PlacedSkill.PositionY);
this->RemainingTime = SkillData->CD;
this->RemainingEndurance = SkillData->Endurance;
for (auto effectData: SkillData->SkillEffects)
2025-06-18 10:07:14 +08:00
{
USkillEffect* skillEffect = nullptr ;
switch (effectData.EffectType)
{
case ESkillEffectType::Damage:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_Damage::StaticClass());
break;
case ESkillEffectType::Heal:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_Heal::StaticClass());
break;
case ESkillEffectType::ModifyCooldown:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifyCD::StaticClass());
break;
case ESkillEffectType::Charge:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_Charge::StaticClass());
break;
case ESkillEffectType::ModifySpeed:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_ModifySpeed::StaticClass());
break;
case ESkillEffectType::SkillEnduranceRestore:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_SER::StaticClass());
break;
case ESkillEffectType::EnhanceFishRod:
2025-07-22 10:57:27 +08:00
skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
break;
case ESkillEffectType::EnhanceSkill:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceSkill::StaticClass());
break;
2025-07-22 18:06:10 +08:00
case ESkillEffectType::DamageReduce:
skillEffect = NewObject<USkillEffect>(this, USkillEffect_DamageReduce::StaticClass());
break;
default:
2025-09-01 11:54:05 +08:00
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
UE_LOG(LogTemp, Error, TEXT("没有配置 %s类型的Skill Effect"), *EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)))
2025-06-18 10:07:14 +08:00
}
if (IsValid(skillEffect))
{
skillEffect->InitSkillEffect(this, effectData);
this->SkillEffects.Add(skillEffect);
}
}
}
2025-07-21 17:00:29 +08:00
void USkill::InitSkillTrigger()
{
2025-09-02 17:26:50 +08:00
switch (SkillData->triggerType)
2025-07-21 17:00:29 +08:00
{
2025-09-02 17:26:50 +08:00
case ESkillTriggerType::PassiveSkill:
2025-07-22 10:57:27 +08:00
{
2025-09-03 16:28:21 +08:00
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this);
2025-07-22 10:57:27 +08:00
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
2025-09-03 16:28:21 +08:00
SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig);
break;
2025-07-22 10:57:27 +08:00
}
2025-09-03 16:28:21 +08:00
2025-09-02 17:26:50 +08:00
case ESkillTriggerType::AuraSkill:
2025-09-03 13:24:19 +08:00
{
2025-09-03 16:28:21 +08:00
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this);
2025-09-03 13:24:19 +08:00
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
2025-09-03 16:28:21 +08:00
SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig);
2025-09-03 13:24:19 +08:00
}
// if (SkillData->AuraTriggerConfig.Condition != EAuraTriggerCondition::None)
// {
// USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this);
// FSkillContext context;
// context.OwnerSkill = this;
// context.SkillManager = SkillManager;
// SkillTrigger->Init(context, SkillData->PassiveTriggerConfig, SkillData->AuraTriggerConfig);
// }
// else
// {
// //UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能直接触发"));
// ExecuteSkill();
// }
2025-09-03 13:24:19 +08:00
2025-09-02 17:26:50 +08:00
break;
2025-07-21 17:00:29 +08:00
}
}
2025-09-03 17:05:00 +08:00
2025-06-23 10:29:35 +08:00
bool USkill::SkillTickAble()
{
//剩余次数无限制 或者 剩余次数大于0次并且拥有者没有被韧性眩晕
return (RemainingEndurance == -1 || RemainingEndurance >= 0 )
2025-09-02 17:26:50 +08:00
&& Owner->CurrentTenacity > 0 && SkillData->triggerType == ESkillTriggerType::ActiveSkill;
2025-09-01 11:54:05 +08:00
}
bool USkill::SkillExecuteAble()
{
return (RemainingEndurance == -1 || RemainingEndurance > 0 ) && RemainingTime <= 0;
}
2025-09-01 11:54:05 +08:00
FIntPoint USkill::GetSkillSize()
{
return GetSkillSizeValue(SkillData->SkillSize);
2025-06-23 10:29:35 +08:00
}
2025-06-18 10:07:14 +08:00
void USkill::TickSkill(float deltaTime)
{
2025-07-15 16:52:32 +08:00
if (SkillTickAble())
2025-06-18 10:07:14 +08:00
{
RemainingTime -= deltaTime * SkillData->Speed;
RemainingTime = FMath::Max(RemainingTime, 0);
2025-06-18 10:07:14 +08:00
}
if (SkillExecuteAble() )
2025-06-18 10:07:14 +08:00
{
ExecuteSkill();
2025-06-18 10:07:14 +08:00
}
// if (RemainingEndurance == 0)
// {
// FSkillContext context;
// context.OwnerSkill = this;
// context.SkillManager = SkillManager;
// for (auto Effect: SkillEffects)
// {
// Effect->EffectEnded(context);
// }
// }
2025-06-18 10:07:14 +08:00
}
2025-07-21 17:00:29 +08:00
void USkill::ExecuteSkill()
{
RemainingTime = 0;
if (RemainingEndurance >0)
2025-09-03 17:05:00 +08:00
{
ApplyRemainingEnduranceOffset(-1);
}
2025-07-21 17:00:29 +08:00
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Execute(context);
}
2025-09-01 11:54:05 +08:00
RemainingTime = SkillData->CD;
OnSkillExecute.Broadcast(SkillData->SkillName.ToString());
2025-07-21 17:00:29 +08:00
}
2025-09-03 17:23:01 +08:00
void USkill::CancelSkill()
{
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Cancel(context);
}
}
2025-06-18 10:07:14 +08:00
FString USkill::GetSkillName() const
{
2025-09-01 11:54:05 +08:00
return SkillData->SkillName.ToString();;
2025-06-18 10:07:14 +08:00
}
2025-09-01 11:54:05 +08:00
TObjectPtr<USkillAsset> USkill::GetSkillData()
2025-06-18 10:07:14 +08:00
{
return SkillData;
}
2025-07-21 17:59:58 +08:00
FIntPoint USkill::GetBagPos()
{
return BagPosition;
}
2025-09-01 11:54:05 +08:00
void USkill::SetSkillData(TObjectPtr<USkillAsset> data)
2025-06-18 10:07:14 +08:00
{
SkillData = data;
OnSkillUpdate.Broadcast();
}
void USkill::ApplyRemainingTimeOffset(int timeOffset)
{
this->RemainingTime += timeOffset;
}
2025-09-03 17:05:00 +08:00
void USkill::ApplyRemainingEnduranceOffset(int Offset)
2025-06-18 10:07:14 +08:00
{
2025-09-01 11:54:05 +08:00
if (SkillData->Endurance != -1)
2025-09-03 17:05:00 +08:00
{
RemainingEndurance = FMath::Clamp( RemainingEndurance + Offset, 0, SkillData->Endurance);
OnSkillEnduranceChange.Broadcast(Offset);
}
2025-06-18 10:07:14 +08:00
}
2025-09-04 11:28:29 +08:00
FTimerHandle TimerHandle;
void USkill::ApplySkillSpeed(float offset, float duration)
{
OnSkillSpeedChanged.Broadcast(offset < 0 ? true: false, duration);
GetSkillData()->Speed += offset;
GetWorld()->GetTimerManager().SetTimer(TimerHandle, [&]()
{
UE_LOG(LogTemp, Log, TEXT("取消CD充能效果"));
GetSkillData()->Speed = 1;
}, duration, false); // 单次触发
}
2025-09-03 17:05:00 +08:00
2025-06-18 10:07:14 +08:00
class APawnWithSkill* USkill::GetOwner()
{
return Owner;
}