199 lines
5.2 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 16:28:21 +08:00
if (SkillData->AuraTriggerConfig.Condition != EAuraTriggerCondition::None)
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
}
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-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-07-15 16:52:32 +08:00
//剩余次数无限制或者拥有者没有被韧性眩晕
2025-09-02 17:26:50 +08:00
return (RemainingEndurance >0 || RemainingEndurance == -1 )
&& Owner->CurrentTenacity > 0 && SkillData->triggerType == ESkillTriggerType::ActiveSkill;
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-09-01 11:54:05 +08:00
RemainingTime -= deltaTime * SkillData->Speed;
2025-07-15 16:52:32 +08:00
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)
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-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-03 17:05:00 +08:00
2025-06-18 10:07:14 +08:00
class APawnWithSkill* USkill::GetOwner()
{
return Owner;
}