Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void AMasterProjectile::OnBounce(const FHitResult& ImpactResult, const FVector& ImpactVelocity)
- {
- if(IsValid(ImpactResult.PhysMaterial.Get()) && Role == ROLE_Authority)
- {
- FString HitMat = ImpactResult.PhysMaterial.Get()->GetName();
- LastRecordedLocation = ImpactResult.ImpactPoint;
- GEngine->AddOnScreenDebugMessage(-1, 1.0, FColor::Red, *HitMat);
- if ((HitMat == "PHYSM_Steel" || HitMat == "PHYSM_Concrete" || HitMat == "PHYSM_Wood"))
- {
- Namestring = HitMat;
- FVector EndPoint = ((ImpactVelocity.GetSafeNormal(0.0001)) * 500.0f) + ImpactResult.ImpactPoint;
- FVector Startpoint = ImpactResult.ImpactPoint;
- //hit Hit for upcoming logic calculations
- TArray<FHitResult> TraceHit;
- FCollisionQueryParams CollisionParms;
- CollisionParms.bReturnPhysicalMaterial = true;
- TArray<TEnumAsByte<EObjectTypeQuery>> TraceObjectTypes;
- TraceObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
- TraceObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_Pawn));
- TraceObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldDynamic));
- UKismetSystemLibrary::LineTraceMultiForObjects(GetWorld(), EndPoint, Startpoint, TraceObjectTypes, false, TArray<AActor*>(),
- EDrawDebugTrace::ForDuration, TraceHit, true, FColor::Orange, FColor::Black, 2.0f);
- if (TraceHit.Num() != -1)
- {
- FString HitPhysMat = TraceHit.Last().PhysMaterial.Get()->GetName();
- FName HitMaterialName = FName(*HitPhysMat);
- static const FString ContextString(TEXT("Player attack montage CONTEXT"));
- FWeaponData* PenData = BulletPenData->FindRow<FWeaponData>(HitMaterialName, ContextString, true);
- if (PenData)
- {
- FVector Impact = LastRecordedLocation - TraceHit.Last().ImpactPoint;
- float Density = PenData->Density;
- float HitThickness;
- LastdataPillar = TraceHit.Last().ImpactPoint;
- HitThickness = Impact.Size();
- float maxpen = ((((ProjectileMass / Density) * PenetratorLength) * (ImpactVelocity.Size() / 100.0f) / 1000.0f) / 10.0f );
- bool CanPen = maxpen > HitThickness;
- if (CanPen)
- {
- FVector newVelocity = ((maxpen - HitThickness) / maxpen) * ImpactVelocity;
- FActorSpawnParameters Spawninfo;
- Spawninfo.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
- AMasterProjectile* Projectile = GetWorld()->SpawnActor<AMasterProjectile>(TraceHit.Last().ImpactPoint , GetActorRotation(), Spawninfo);
- if (Projectile)
- {
- Projectile->LastPoistion = TraceHit.Last().ImpactPoint;
- Projectile->ProjectileMovement->Velocity = newVelocity;
- Projectile->ProjectileMovement->UpdateComponentVelocity();
- LastdataPillar = newVelocity;
- FString PrintLogData = newVelocity.ToString();
- UE_LOG(LogTemp, Warning, TEXT("CaPen"));
- Destroy();
- }
- }
- else
- {
- UE_LOG(LogTemp, Warning, TEXT("CantPen"));
- Destroy();
- }
- }
- }
- }
- }
- else
- {
- UE_LOG(LogTemp, Warning, TEXT("NoPhysMat"));
- Destroy();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement