void UStatsManager::UpdateModStats(TArray<AMod*>& mods) { //clear the mods array for (int32 i = 0; i < (int32)EStat::ES_Max; i++) modStats[i] = 0.f; if (mods.Num() <= 0) return; for (AMod* mod : mods) { for (int32 i = 0; i < (int32)EStat::ES_Max; i++) { if (i == (int32)EStat::ES_AtkSp) modStats[i] += (GetCurrentValueForStat(EStat::ES_AtkSp) / 100.f) * mod->deltaStats[i]; else modStats[i] += mod->deltaStats[i]; } } }
void UStatsManager::CharacterLevelUp() { baseStats[(int32)EStat::ES_HP] += GetCurrentValueForStat(EStat::ES_HPPL); health += GetCurrentValueForStat(EStat::ES_HPPL); baseStats[(int32)EStat::ES_Flare] += GetCurrentValueForStat(EStat::ES_FlarePL); flare += GetCurrentValueForStat(EStat::ES_FlarePL); baseStats[(int32)EStat::ES_HPRegen] += GetCurrentValueForStat(EStat::ES_HPRegenPL); baseStats[(int32)EStat::ES_FlareRegen] += GetCurrentValueForStat(EStat::ES_FlareRegenPL); baseStats[(int32)EStat::ES_SpAtk] += GetCurrentValueForStat(EStat::ES_SpAtkPL); baseStats[(int32)EStat::ES_Atk] += GetCurrentValueForStat(EStat::ES_AtkPL); baseStats[(int32)EStat::ES_Def] += GetCurrentValueForStat(EStat::ES_DefPL); baseStats[(int32)EStat::ES_SpDef] += GetCurrentValueForStat(EStat::ES_SpDefPL); baseStats[(int32)EStat::ES_AtkSp] += GetCurrentValueForStat(EStat::ES_AtkSpPL); }
void UStatsManager::SetMaxFlare() { flare = GetCurrentValueForStat(EStat::ES_Flare); }
void UStatsManager::SetMaxHealth() { health = GetCurrentValueForStat(EStat::ES_HP) + bonusStats[(uint16)EStat::ES_HP]; }
void ATurret::TargetOutofRange() { if (!IsValid(this)) return; TArray<FHitResult> hits; FVector start = GetActorLocation(); FVector end = start; end.Z += 5.f; TArray<AGameCharacter*> possibleTargets; GetWorld()->SweepMultiByChannel(hits, start, end, GetActorRotation().Quaternion(), ECC_Visibility, FCollisionShape::MakeSphere(GetCurrentValueForStat(EStat::ES_AARange))); for (FHitResult hit : hits) { AGameCharacter* gc = Cast<AGameCharacter>(hit.GetActor()); if (IsValid(gc) && gc->IsAlive() && GetTeamIndex() != gc->GetTeamIndex()) possibleTargets.AddUnique(gc); } //first aggro any minions first for (AGameCharacter* gc : possibleTargets) { if (gc->IsA(AMinionCharacter::StaticClass())) { SetCurrentTarget(gc); StartAutoAttack(); return; } } //then aggro an objective if we can for (AGameCharacter* gc : possibleTargets) { if (gc->IsA(ARealmObjective::StaticClass())) { SetCurrentTarget(gc); StartAutoAttack(); return; } } //lastly aggro any mythos for (AGameCharacter* gc : possibleTargets) { if (gc->IsA(APlayerCharacter::StaticClass())) { SetCurrentTarget(gc); StartAutoAttack(); return; } } StopAutoAttack(); }
void ATurret::TargetOutofRange() { float leastDistance = -1.f; int32 leastInd = -1; if (!IsValid(this)) return; inRangeTargets.Empty(); for (TActorIterator<AGameCharacter> chritr(GetWorld()); chritr; ++chritr) { AGameCharacter* gc = *chritr; if (IsValid(gc) && gc->IsAlive() && gc != this && gc->GetTeamIndex() != GetTeamIndex()) { float dist = (gc->GetActorLocation() - GetActorLocation()).Size(); if (dist <= GetCurrentValueForStat(EStat::ES_AARange)) inRangeTargets.AddUnique(gc); } } //if we should priortize Mythos AGameCharacter* otherTarget = nullptr; for (int32 i = 0; i < inRangeTargets.Num(); i++) { if (inRangeTargets[i]->IsA(AMinionCharacter::StaticClass())) continue; float distanceSq = (inRangeTargets[i]->GetActorLocation() - GetActorLocation()).SizeSquared2D(); if (!inRangeTargets[i]->IsAlive() || distanceSq > FMath::Square(710.f)) { inRangeTargets.RemoveAt(i); continue; } if (leastDistance == -1.f) { leastDistance = distanceSq; leastInd = i; continue; } if (distanceSq < leastDistance) { leastDistance = distanceSq; leastInd = i; } } if (bPrioritizeMythos) { if (leastInd >= 0) { currentTarget = inRangeTargets[leastInd]; StartAutoAttack(); return; } } else { if (leastInd >= 0) otherTarget = inRangeTargets[leastInd]; } leastDistance = -1.f; leastInd = -1; for (int32 i = 0; i < inRangeTargets.Num(); i++) { if (!inRangeTargets[i]->IsA(AMinionCharacter::StaticClass())) continue; float distanceSq = (inRangeTargets[i]->GetActorLocation() - GetActorLocation()).SizeSquared2D(); if (!inRangeTargets[i]->IsAlive() || distanceSq > FMath::Square(710.f)) { inRangeTargets.RemoveAt(i); continue; } if (leastDistance == -1.f) { leastDistance = distanceSq; leastInd = i; continue; } if (distanceSq < leastDistance) { leastDistance = distanceSq; leastInd = i; } } if (leastInd >= 0) { currentTarget = inRangeTargets[leastInd]; StartAutoAttack(); return; } if (otherTarget) { currentTarget = otherTarget; StartAutoAttack(); } else { currentTarget = nullptr; StopAutoAttack(); } }