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"
|
2025-07-22 15:06:16 +08:00
|
|
|
|
#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;
|
2025-07-22 15:06:16 +08:00
|
|
|
|
case ESkillEffectType::EnhanceFishRod:
|
2025-07-22 10:57:27 +08:00
|
|
|
|
skillEffect = NewObject<USkillEffect>(this, USkillEffect_EnhanceFishRod::StaticClass());
|
|
|
|
|
|
break;
|
2025-07-22 15:06:16 +08:00
|
|
|
|
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;
|
2025-07-22 15:06:16 +08:00
|
|
|
|
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
|
|
|
|
}
|
2025-09-04 17:45:29 +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()
|
|
|
|
|
|
{
|
2025-09-16 14:18:15 +08:00
|
|
|
|
//剩余次数无限制 或者 剩余次数大于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
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-16 14:18:15 +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
|
|
|
|
{
|
2025-09-16 14:18:15 +08:00
|
|
|
|
RemainingTime -= deltaTime * SkillData->Speed;
|
|
|
|
|
|
RemainingTime = FMath::Max(RemainingTime, 0);
|
2025-06-18 10:07:14 +08:00
|
|
|
|
}
|
2025-09-16 14:18:15 +08:00
|
|
|
|
|
|
|
|
|
|
if (SkillExecuteAble() )
|
2025-06-18 10:07:14 +08:00
|
|
|
|
{
|
2025-09-16 14:18:15 +08:00
|
|
|
|
ExecuteSkill();
|
2025-06-18 10:07:14 +08:00
|
|
|
|
}
|
2025-09-16 14:18:15 +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;
|
|
|
|
|
|
}
|