169 lines
4.5 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-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-07-21 17:59:58 +08:00
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData, FIntPoint BagPos)
2025-06-18 10:07:14 +08:00
{
this->Owner = owner;
this->SkillManager = skillManager;
this->SkillData = skillData;
2025-07-21 17:59:58 +08:00
this->BagPosition = BagPos;
2025-06-18 10:07:14 +08:00
this->RemainingTime = SkillData.CD;
this->RemainingEndurance = SkillData.Endurance;
for (auto effectData: skillData.SkillEffects)
{
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-07-22 10:57:27 +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()
{
if (!SkillData.bActiveSkill)
{
2025-07-22 11:16:55 +08:00
if (SkillData.SkillTrigger)
2025-07-22 10:57:27 +08:00
{
2025-07-22 11:16:55 +08:00
USkillTrigger* SkillTrigger = NewObject<USkillTrigger>(this, SkillData.SkillTrigger);
2025-07-22 10:57:27 +08:00
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
SkillTrigger->Init(context);
}
else
{
2025-07-22 18:06:10 +08:00
//UE_LOG(LogTemp, Warning, TEXT("没有Trigger的被动技能直接触发"));
2025-07-22 10:57:27 +08:00
ExecuteSkill();
}
2025-07-21 17:00:29 +08:00
}
}
2025-06-23 10:29:35 +08:00
bool USkill::SkillTickAble()
{
2025-07-15 16:52:32 +08:00
//剩余次数无限制或者拥有者没有被韧性眩晕
2025-07-21 17:00:29 +08:00
return (RemainingEndurance >0 || RemainingEndurance == -1 ) && Owner->CurrentTenacity > 0 && SkillData.bActiveSkill;
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())
RemainingTime -= deltaTime * SkillData.Speed;
if (RemainingTime <= 0 )
2025-06-18 10:07:14 +08:00
{
2025-07-21 17:00:29 +08:00
ExecuteSkill();
2025-06-18 10:07:14 +08:00
}
if (RemainingEndurance == 0)
{
2025-07-22 18:06:10 +08:00
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
2025-06-18 10:07:14 +08:00
for (auto Effect: SkillEffects)
{
2025-07-22 18:06:10 +08:00
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)
--RemainingEndurance;
FSkillContext context;
context.OwnerSkill = this;
context.SkillManager = SkillManager;
for (auto Effect: SkillEffects)
{
Effect->Execute(context);
}
RemainingTime = SkillData.CD;
OnSkillExecute.Broadcast(SkillData.SkillName.ToString());
}
2025-06-18 10:07:14 +08:00
FString USkill::GetSkillName() const
{
return SkillData.SkillName.ToString();;
}
FSkillData& USkill::GetSkillData()
{
return SkillData;
}
2025-07-21 17:59:58 +08:00
FIntPoint USkill::GetBagPos()
{
return BagPosition;
}
2025-06-18 10:07:14 +08:00
void USkill::SetSkillData(FSkillData data)
{
SkillData = data;
OnSkillUpdate.Broadcast();
}
void USkill::ApplyRemainingTimeOffset(int timeOffset)
{
this->RemainingTime += timeOffset;
}
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
{
2025-06-23 13:52:35 +08:00
if (SkillData.Endurance != -1)
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData.Endurance);
2025-06-18 10:07:14 +08:00
}
class APawnWithSkill* USkill::GetOwner()
{
return Owner;
}