diff --git a/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset b/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset index 6a0cfe4..70ff3a1 100644 Binary files a/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset and b/Content/Blueprints/Character/Animation/BlasterAnimBP.uasset differ diff --git a/Source/Blaster/Character/BlasterAnimInstance.cpp b/Source/Blaster/Character/BlasterAnimInstance.cpp index 678cbc2..9119c50 100644 --- a/Source/Blaster/Character/BlasterAnimInstance.cpp +++ b/Source/Blaster/Character/BlasterAnimInstance.cpp @@ -58,11 +58,18 @@ void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaSeconds) if (bWeaponEquipped && EquippedWeapon && EquippedWeapon->GetWeaponMesh() && BlasterCharacter->GetMesh()) { - LeftHandTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("LeftHandSocket"), ERelativeTransformSpace::RTS_World); + LeftHandTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("LeftHandSocket"), RTS_World); FVector OutPosition; FRotator OutRotation; BlasterCharacter->GetMesh()->TransformToBoneSpace(FName("hand_r"), LeftHandTransform.GetLocation(), FRotator::ZeroRotator, OutPosition, OutRotation); LeftHandTransform.SetLocation(OutPosition); LeftHandTransform.SetRotation(FQuat(OutRotation)); + + if (BlasterCharacter->IsLocallyControlled()) + { + bLocallyControlled = true; + const FTransform RightHandTransform = EquippedWeapon->GetWeaponMesh()->GetSocketTransform(FName("Hand_R"), RTS_World); + RightHandRotation = UKismetMathLibrary::FindLookAtRotation(RightHandTransform.GetLocation(), RightHandTransform.GetLocation() + (RightHandTransform.GetLocation() - BlasterCharacter->GetHitTarget())); + } } } diff --git a/Source/Blaster/Character/BlasterAnimInstance.h b/Source/Blaster/Character/BlasterAnimInstance.h index d0bf75d..d22e717 100644 --- a/Source/Blaster/Character/BlasterAnimInstance.h +++ b/Source/Blaster/Character/BlasterAnimInstance.h @@ -66,4 +66,10 @@ private: UPROPERTY(BlueprintReadOnly, Category="Movement", meta=(AllowPrivateAccess = "true")) ETurningInPlace TurningInPlace; + + UPROPERTY(BlueprintReadOnly, Category="Movement", meta=(AllowPrivateAccess = "true")) + FRotator RightHandRotation; + + UPROPERTY(BlueprintReadOnly, Category="Movement", meta=(AllowPrivateAccess = "true")) + bool bLocallyControlled; }; diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index a55b381..2f07e21 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -323,6 +323,13 @@ AWeapon* ABlasterCharacter::GetEquippedWeapon() return Combat->EquippedWeapon; } +FVector ABlasterCharacter::GetHitTarget() const +{ + if (Combat == nullptr) return FVector(); + + return Combat->HitTarget; +} + void ABlasterCharacter::OnRep_OverlappingWeapon(AWeapon* LastWeapon) { if (OverlappingWeapon) diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index bb6cf57..8a08089 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -76,4 +76,5 @@ public: FORCEINLINE float GetAO_Pitch() const { return AO_Pitch; }; AWeapon* GetEquippedWeapon(); FORCEINLINE ETurningInPlace GetTurningInPlace() const { return TurningInPlace; }; + FVector GetHitTarget() const; }; diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index 1928a2a..d1ff252 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -43,6 +43,13 @@ void UCombatComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActo Super::TickComponent(DeltaTime, TickType, ThisTickFunction); SetHUDCrosshairs(DeltaTime); + + if (Character && Character->IsLocallyControlled()) + { + FHitResult HitResult; + TraceUnderCrosshairs(HitResult); + HitTarget = HitResult.ImpactPoint; + } } void UCombatComponent::SetHUDCrosshairs(float DeltaTime) @@ -167,6 +174,8 @@ void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult) End, ECollisionChannel::ECC_Visibility ); + + if (!TraceHitResult.bBlockingHit) TraceHitResult.ImpactPoint = End; } } diff --git a/Source/Blaster/Components/CombatComponent.h b/Source/Blaster/Components/CombatComponent.h index 9cb07b4..d674704 100644 --- a/Source/Blaster/Components/CombatComponent.h +++ b/Source/Blaster/Components/CombatComponent.h @@ -69,4 +69,6 @@ private: float CrosshairVelocityFactor; float CrosshairInAirFactor; + + FVector HitTarget; };