117 lines
2.9 KiB
C++
117 lines
2.9 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "Skill.h"
|
|
|
|
#include "SkillEffects/SkillEffect_Charge.h"
|
|
#include "SkillEffects/SkillEffect_Damage.h"
|
|
#include "SkillEffects/SkillEffect_Heal.h"
|
|
#include "SkillEffects/SkillEffect_ModifyCD.h"
|
|
#include "SkillEffects/SkillEffect_ModifySpeed.h"
|
|
#include "SkillEffects/SkillEffect_SER.h"
|
|
|
|
void USkill::InitSkill(APawnWithSkill* owner, USkillManager* skillManager, FSkillData skillData)
|
|
{
|
|
this->Owner = owner;
|
|
this->SkillManager = skillManager;
|
|
this->SkillData = skillData;
|
|
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;
|
|
}
|
|
if (IsValid(skillEffect))
|
|
{
|
|
skillEffect->InitSkillEffect(this, effectData);
|
|
this->SkillEffects.Add(skillEffect);
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
bool USkill::SkillTickAble()
|
|
{
|
|
//剩余次数无限制或者拥有者没有被韧性眩晕
|
|
return (RemainingEndurance >0 || RemainingEndurance == -1) && Owner->CurrentTenacity > 0;
|
|
}
|
|
|
|
void USkill::TickSkill(float deltaTime)
|
|
{
|
|
if (SkillTickAble())
|
|
RemainingTime -= deltaTime * SkillData.Speed;
|
|
if (RemainingTime <= 0 )
|
|
{
|
|
RemainingTime = 0;
|
|
if (RemainingEndurance >0)
|
|
--RemainingEndurance;
|
|
FSkillContext context;
|
|
context.Self = Owner;
|
|
context.SkillManager = SkillManager;
|
|
for (auto Effect: SkillEffects)
|
|
{
|
|
Effect->Execute(context);
|
|
}
|
|
RemainingTime = SkillData.CD;
|
|
}
|
|
if (RemainingEndurance == 0)
|
|
{
|
|
for (auto Effect: SkillEffects)
|
|
{
|
|
Effect->EffectEnded();
|
|
}
|
|
}
|
|
}
|
|
|
|
FString USkill::GetSkillName() const
|
|
{
|
|
return SkillData.SkillName.ToString();;
|
|
}
|
|
|
|
FSkillData& USkill::GetSkillData()
|
|
{
|
|
return SkillData;
|
|
}
|
|
|
|
void USkill::SetSkillData(FSkillData data)
|
|
{
|
|
SkillData = data;
|
|
OnSkillUpdate.Broadcast();
|
|
}
|
|
|
|
void USkill::ApplyRemainingTimeOffset(int timeOffset)
|
|
{
|
|
this->RemainingTime += timeOffset;
|
|
}
|
|
|
|
void USkill::ApplyRemainingRemainingEnduranceOffset(int Offset)
|
|
{
|
|
if (SkillData.Endurance != -1)
|
|
this->RemainingEndurance = FMath::Max(this->RemainingEndurance + Offset, SkillData.Endurance);
|
|
}
|
|
|
|
class APawnWithSkill* USkill::GetOwner()
|
|
{
|
|
return Owner;
|
|
}
|