diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 748b7b1..5fb2d4d 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -86,6 +86,7 @@ void ABlasterCharacter::Tick(float DeltaTime) Super::Tick(DeltaTime); AimOffset(DeltaTime); + HideCameraIfCharacterClose(); } void ABlasterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) @@ -290,6 +291,26 @@ void ABlasterCharacter::TurnInPlace(float DeltaTime) } } +void ABlasterCharacter::HideCameraIfCharacterClose() +{ + if (!IsLocallyControlled()) return; + if((FollowCamera->GetComponentLocation() - GetActorLocation()).Size() < CameraThreshold) + { + GetMesh()->SetVisibility(false); + if (Combat && Combat->EquippedWeapon && Combat->EquippedWeapon->GetWeaponMesh()) + { + Combat->EquippedWeapon->GetWeaponMesh()->bOwnerNoSee = true; + } + } else + { + GetMesh()->SetVisibility(true); + if (Combat && Combat->EquippedWeapon && Combat->EquippedWeapon->GetWeaponMesh()) + { + Combat->EquippedWeapon->GetWeaponMesh()->bOwnerNoSee = false; + } + } +} + void ABlasterCharacter::SetOverlappingWeapon(AWeapon* Weapon) { if (OverlappingWeapon) diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 5408e32..0beb957 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -69,6 +69,12 @@ private: UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* FireWeaponMontage; + + void HideCameraIfCharacterClose(); + + UPROPERTY(EditAnywhere) + float CameraThreshold = 200.f; + public: void SetOverlappingWeapon(AWeapon* Weapon); bool IsWeaponEquipped(); diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index a67db98..ca2039d 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -211,6 +211,11 @@ void UCombatComponent::TraceUnderCrosshairs(FHitResult& TraceHitResult) if (bScreenToWorld) { FVector Start = CrosshairWorldPosition; + if (Character) + { + float DistanceToCharacter = (Character->GetActorLocation() - Start).Size(); + Start += CrosshairWorldDirection * (DistanceToCharacter + 60.f); + } FVector End = Start + CrosshairWorldDirection * TRACE_LENGTH; GetWorld()->LineTraceSingleByChannel(