181 lines
4.7 KiB
C++
181 lines
4.7 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
|
|
#include "SkillEffect.h"
|
|
|
|
#include "AsyncTreeDifferences.h"
|
|
#include "Skill.h"
|
|
#include "SkillManager.h"
|
|
|
|
|
|
void USkillEffect::InitSkillEffect(class USkill* skill, FSkillEffectData data)
|
|
{
|
|
this->OwnerSkill = skill;
|
|
this->effectData = data;
|
|
}
|
|
|
|
// Add default functionality here for any ISkillEffect functions that are not pure virtual.
|
|
void USkillEffect::Execute(const FSkillContext& context)
|
|
{
|
|
TArray<UObject*> targets= GetApplyTargets(context);
|
|
FString strTargets;
|
|
for (auto target: targets)
|
|
{
|
|
if (target->GetClass()->IsChildOf(APawnWithSkill::StaticClass()))
|
|
{
|
|
strTargets += (Cast<APawnWithSkill>(target))->GetActorNameOrLabel() +"|" ;
|
|
}
|
|
else
|
|
{
|
|
strTargets += (Cast<USkill>(target))->GetSkillData()->SkillName.ToString() + "|" ;
|
|
}
|
|
|
|
}
|
|
const UEnum* EnumPtr = StaticEnum<ESkillEffectType>();
|
|
FString type = EnumPtr->GetNameStringByValue(static_cast<int64>(effectData.EffectType)) ;
|
|
|
|
UE_LOG(LogTemp, Warning, TEXT("技能:%s 拥有者: %s 目标: %s 效果: %s")
|
|
, *OwnerSkill->GetSkillData()->SkillName.ToString()
|
|
,*OwnerSkill->GetOwner()->GetActorNameOrLabel()
|
|
,*strTargets
|
|
, *( GetSkillEffectDes()));
|
|
}
|
|
|
|
void USkillEffect::Cancel(const FSkillContext& context)
|
|
{
|
|
}
|
|
|
|
void USkillEffect::EffectEnded(const FSkillContext& context)
|
|
{
|
|
}
|
|
|
|
TArray<UObject*> USkillEffect::GetApplyTargets(const FSkillContext& context)
|
|
{
|
|
TArray<UObject*> result;
|
|
switch (effectData.SkillSelecter.SelecterType)
|
|
{
|
|
case EEffectTargetType::Target:
|
|
{
|
|
//目标是敌人
|
|
result.Add(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
|
|
break;;
|
|
}
|
|
case EEffectTargetType::Self:
|
|
{
|
|
//目标是敌人
|
|
result.Add(OwnerSkill->GetOwner());
|
|
break;;
|
|
}
|
|
case EEffectTargetType::TargetSkill:
|
|
{
|
|
TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
|
|
if (effectData.SkillSelecter.bAll)
|
|
{
|
|
result.Append(Skills);
|
|
}
|
|
else
|
|
{
|
|
int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
|
|
for (int i = 0; i < TargetNum; i++)
|
|
{
|
|
int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
|
|
result.Add(Skills[randomIndex]);
|
|
Skills.RemoveAt(randomIndex);
|
|
}
|
|
}
|
|
break;;
|
|
}
|
|
case EEffectTargetType::SelfSkill:
|
|
{
|
|
TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner());
|
|
if (effectData.SkillSelecter.bAll)
|
|
{
|
|
result.Append(Skills);
|
|
}
|
|
else
|
|
{
|
|
int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
|
|
for (int i = 0; i < TargetNum; i++)
|
|
{
|
|
int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
|
|
result.Add(Skills[randomIndex]);
|
|
Skills.RemoveAt(randomIndex);
|
|
}
|
|
}
|
|
break;;
|
|
}
|
|
case EEffectTargetType::AroundSkill:
|
|
{
|
|
TArray<USkill*> aroundSkills = context.SkillManager->GetSkillsAround(context.OwnerSkill);
|
|
for (auto skill: aroundSkills)
|
|
{
|
|
result.Add(skill);
|
|
}
|
|
break;
|
|
}
|
|
case EEffectTargetType::SelfSkillType:
|
|
{
|
|
//筛选指定类型的技能
|
|
TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(OwnerSkill->GetOwner());
|
|
for (int i = Skills.Num() - 1; i >= 0; i--)
|
|
{
|
|
if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType))
|
|
{
|
|
Skills.RemoveAt(i);
|
|
}
|
|
}
|
|
|
|
if (effectData.SkillSelecter.bAll)
|
|
{
|
|
result.Append(Skills);
|
|
}
|
|
else
|
|
{
|
|
int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
|
|
for (int i = 0; i < TargetNum; i++)
|
|
{
|
|
int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
|
|
result.Add(Skills[randomIndex]);
|
|
Skills.RemoveAt(randomIndex);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case EEffectTargetType::TargetSkillType:
|
|
{
|
|
//筛选指定类型的技能
|
|
TArray<USkill*> Skills = context.SkillManager->GetSkillsByOwner(context.SkillManager->GetEnemyPawn(OwnerSkill->GetOwner()));
|
|
for (int i = Skills.Num() - 1; i >= 0; i--)
|
|
{
|
|
if (!Skills[i]->GetSkillData()->SkillTypes.Contains(effectData.SkillSelecter.SkillType))
|
|
{
|
|
Skills.RemoveAt(i);
|
|
}
|
|
}
|
|
|
|
if (effectData.SkillSelecter.bAll)
|
|
{
|
|
result.Append(Skills);
|
|
}
|
|
else
|
|
{
|
|
int TargetNum = FMath::Min(effectData.SkillSelecter.MaxEffectTargetNum, Skills.Num());
|
|
for (int i = 0; i < TargetNum; i++)
|
|
{
|
|
int randomIndex = FMath::RandRange(0, Skills.Num() - 1);
|
|
result.Add(Skills[randomIndex]);
|
|
Skills.RemoveAt(randomIndex);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
FString USkillEffect::GetSkillEffectDes()
|
|
{
|
|
return FString();
|
|
}
|
|
|