From a38547ce5bd510fea3246c77a981b918a83c94df Mon Sep 17 00:00:00 2001 From: Kingsmedia Date: Tue, 24 May 2022 12:46:30 +0200 Subject: [PATCH] 166 - Secondary Weapon --- .../Mesh/SK_EpicCharacter_Skeleton.uasset | Bin 47264 -> 47867 bytes .../Blaster/Character/BlasterAnimInstance.cpp | 2 +- Source/Blaster/Character/BlasterCharacter.cpp | 54 +++-- Source/Blaster/Character/BlasterCharacter.h | 2 +- Source/Blaster/Components/CombatComponent.cpp | 198 +++++++++++------- Source/Blaster/Components/CombatComponent.h | 27 ++- Source/Blaster/Weapon/Weapon.cpp | 9 +- 7 files changed, 175 insertions(+), 117 deletions(-) diff --git a/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Skeleton.uasset b/Content/Assets/LearningKit_Games/Assets/Characters/Character/Mesh/SK_EpicCharacter_Skeleton.uasset index 76e8702057d8bc407a3260f2accbc6af8264acd8..f49ef554d339efab719fe75577a0d286379abb4a 100644 GIT binary patch literal 47867 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 YFvjocGj(^s34+6e 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 c@#sWL+#pS7eQAlpsGetCharacterMovement()->IsFalling(); bIsAccelerating = BlasterCharacter->GetCharacterMovement()->GetCurrentAcceleration().Size() > 0.f ? true : false; bWeaponEquipped = BlasterCharacter->IsWeaponEquipped(); - EquippedWeapon = BlasterCharacter->GetEquippedWeapon(); + EquippedWeapon = BlasterCharacter->GetPrimaryWeapon(); bIsCrouched = BlasterCharacter->bIsCrouched; bAiming = BlasterCharacter->IsAiming(); TurningInPlace = BlasterCharacter->GetTurningInPlace(); diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 2503653..c1b5568 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -84,9 +84,9 @@ void ABlasterCharacter::OnRep_ReplicatedMovement() void ABlasterCharacter::Eliminated() { - if (Combat && Combat->EquippedWeapon) + if (Combat && Combat->PrimaryWeapon) { - Combat->EquippedWeapon->Dropped(); + Combat->PrimaryWeapon->Dropped(); } MulticastEliminated(); GetWorldTimerManager().SetTimer( @@ -146,7 +146,7 @@ void ABlasterCharacter::MulticastEliminated_Implementation() GetActorLocation() ); } - if (IsLocallyControlled() && GetEquippedWeapon() && GetEquippedWeapon()->IsSniper() && IsAiming()) + if (IsLocallyControlled() && GetPrimaryWeapon() && GetPrimaryWeapon()->IsSniper() && IsAiming()) { ShowSniperScopeWidget(false); } @@ -173,9 +173,9 @@ void ABlasterCharacter::Destroyed() ABlasterGameMode* BlasterGameMode = Cast(UGameplayStatics::GetGameMode(this)); bool bMatchNotInProgress = BlasterGameMode && BlasterGameMode->GetMatchState() != MatchState::InProgress; - if (Combat && Combat->EquippedWeapon && bMatchNotInProgress) + if (Combat && Combat->PrimaryWeapon && bMatchNotInProgress) { - Combat->EquippedWeapon->Destroy(); + Combat->PrimaryWeapon->Destroy(); } } @@ -267,7 +267,7 @@ void ABlasterCharacter::PostInitializeComponents() void ABlasterCharacter::PlayFireMontage(bool bAiming) { - if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return; + if (Combat == nullptr || Combat->PrimaryWeapon == nullptr) return; UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); if (AnimInstance && FireWeaponMontage) @@ -281,7 +281,7 @@ void ABlasterCharacter::PlayFireMontage(bool bAiming) void ABlasterCharacter::PlayReloadMontage() { - if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return; + if (Combat == nullptr || Combat->PrimaryWeapon == nullptr) return; UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); if (AnimInstance && ReloadMontage) @@ -289,7 +289,7 @@ void ABlasterCharacter::PlayReloadMontage() AnimInstance->Montage_Play(ReloadMontage); FName SectionName; - switch (Combat->EquippedWeapon->GetWeaponType()) + switch (Combat->PrimaryWeapon->GetWeaponType()) { case EWeaponType::EWT_AssaultRifle: SectionName = FName("Rifle"); @@ -341,7 +341,7 @@ void ABlasterCharacter::PlayThrowGrenadeMontage() void ABlasterCharacter::PlayHitReactMontage() { - if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return; + if (Combat == nullptr || Combat->PrimaryWeapon == nullptr) return; UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance(); if (AnimInstance && HitReactMontage) @@ -429,20 +429,16 @@ void ABlasterCharacter::EquipButtonPressed() if (bDisableGameplay) return; if (Combat) { - if (HasAuthority()) - { - Combat->EquipWeapon(OverlappingWeapon); - } - else - { - ServerEquipButtonPressed(); - } + ServerEquipButtonPressed(); } } void ABlasterCharacter::ServerEquipButtonPressed_Implementation() { - EquipButtonPressed(); + if (Combat) + { + Combat->EquipWeapon(OverlappingWeapon); + } } void ABlasterCharacter::CrouchButtonPressed() @@ -502,7 +498,7 @@ float ABlasterCharacter::CalculateSpeed() void ABlasterCharacter::AimOffset(float DeltaTime) { - if (Combat && Combat->EquippedWeapon == nullptr) return; + if (Combat && Combat->PrimaryWeapon == nullptr) return; float Speed = CalculateSpeed(); bool bIsInAir = GetCharacterMovement()->IsFalling(); @@ -545,7 +541,7 @@ void ABlasterCharacter::CalculateAO_Pitch() void ABlasterCharacter::SimProxiesTurn() { - if (Combat == nullptr || Combat->EquippedWeapon == nullptr) return; + if (Combat == nullptr || Combat->PrimaryWeapon == nullptr) return; bRotateRootBone = false; float Speed = CalculateSpeed(); if (Speed > 0.f) @@ -637,17 +633,17 @@ void ABlasterCharacter::HideCameraIfCharacterClose() if ((FollowCamera->GetComponentLocation() - GetActorLocation()).Size() < CameraThreshold) { GetMesh()->SetVisibility(false); - if (Combat && Combat->EquippedWeapon && Combat->EquippedWeapon->GetWeaponMesh()) + if (Combat && Combat->PrimaryWeapon && Combat->PrimaryWeapon->GetWeaponMesh()) { - Combat->EquippedWeapon->GetWeaponMesh()->bOwnerNoSee = true; + Combat->PrimaryWeapon->GetWeaponMesh()->bOwnerNoSee = true; } } else { GetMesh()->SetVisibility(true); - if (Combat && Combat->EquippedWeapon && Combat->EquippedWeapon->GetWeaponMesh()) + if (Combat && Combat->PrimaryWeapon && Combat->PrimaryWeapon->GetWeaponMesh()) { - Combat->EquippedWeapon->GetWeaponMesh()->bOwnerNoSee = false; + Combat->PrimaryWeapon->GetWeaponMesh()->bOwnerNoSee = false; } } } @@ -691,10 +687,10 @@ void ABlasterCharacter::UpdateHUDShield() void ABlasterCharacter::UpdateHUDAmmo() { BlasterPlayerController = BlasterPlayerController == nullptr ? Cast(Controller) : BlasterPlayerController; - if (BlasterPlayerController && Combat && Combat->EquippedWeapon) + if (BlasterPlayerController && Combat && Combat->PrimaryWeapon) { BlasterPlayerController->SetHUDCarriedAmmo(Combat->CarriedAmmo); - BlasterPlayerController->SetHUDWeaponAmmo(Combat->EquippedWeapon->GetAmmo()); + BlasterPlayerController->SetHUDWeaponAmmo(Combat->PrimaryWeapon->GetAmmo()); } } @@ -775,7 +771,7 @@ void ABlasterCharacter::OnRep_OverlappingWeapon(AWeapon* LastWeapon) bool ABlasterCharacter::IsWeaponEquipped() { - return Combat && Combat->EquippedWeapon; + return Combat && Combat->PrimaryWeapon; } bool ABlasterCharacter::IsAiming() @@ -783,10 +779,10 @@ bool ABlasterCharacter::IsAiming() return Combat && Combat->bAiming; } -AWeapon* ABlasterCharacter::GetEquippedWeapon() +AWeapon* ABlasterCharacter::GetPrimaryWeapon() { if (Combat == nullptr) return nullptr; - return Combat->EquippedWeapon; + return Combat->PrimaryWeapon; } FVector ABlasterCharacter::GetHitTarget() const diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index 5e257fb..f12c88c 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -219,7 +219,7 @@ public: bool IsAiming(); FORCEINLINE float GetAO_Yaw() const { return AO_Yaw; } FORCEINLINE float GetAO_Pitch() const { return AO_Pitch; } - AWeapon* GetEquippedWeapon(); + AWeapon* GetPrimaryWeapon(); FORCEINLINE ETurningInPlace GetTurningInPlace() const { return TurningInPlace; } FVector GetHitTarget() const; FORCEINLINE UCameraComponent* GetFollowCamera() const { return FollowCamera; } diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index 8e9aeb9..7f97456 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -24,7 +24,8 @@ void UCombatComponent::GetLifetimeReplicatedProps(TArray& Out { Super::GetLifetimeReplicatedProps(OutLifetimeProps); - DOREPLIFETIME(UCombatComponent, EquippedWeapon); + DOREPLIFETIME(UCombatComponent, PrimaryWeapon); + DOREPLIFETIME(UCombatComponent, SecondaryWeapon); DOREPLIFETIME(UCombatComponent, bAiming); DOREPLIFETIME_CONDITION(UCombatComponent, CarriedAmmo, COND_OwnerOnly); DOREPLIFETIME(UCombatComponent, CombatState); @@ -38,7 +39,7 @@ void UCombatComponent::PickupAmmo(EWeaponType WeaponType, int32 AmmoAmount) CarriedAmmoMap[WeaponType] = FMath::Clamp(CarriedAmmoMap[WeaponType] + AmmoAmount, 0, MaxCarriedAmmo); UpdateCarriedAmmo(); } - if (EquippedWeapon && EquippedWeapon->IsEmpty() && EquippedWeapon->GetWeaponType() == WeaponType) + if (PrimaryWeapon && PrimaryWeapon->IsEmpty() && PrimaryWeapon->GetWeaponType() == WeaponType) { Reload(); } @@ -82,7 +83,7 @@ void UCombatComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActo void UCombatComponent::FireButtonPressed(bool bPressed) { bFireButtonPressed = bPressed; - if (bFireButtonPressed && EquippedWeapon) + if (bFireButtonPressed && PrimaryWeapon) { Fire(); } @@ -102,7 +103,7 @@ void UCombatComponent::Fire() { bCanFire = false; ServerFire(HitTarget); - if (EquippedWeapon) + if (PrimaryWeapon) { CrosshairShootingFactor = .75f; } @@ -112,20 +113,20 @@ void UCombatComponent::Fire() void UCombatComponent::StartFireTimer() { - if (EquippedWeapon == nullptr || Character == nullptr) return; + if (PrimaryWeapon == nullptr || Character == nullptr) return; Character->GetWorldTimerManager().SetTimer( FireTimer, this, &UCombatComponent::FireTimerFinished, - EquippedWeapon->FireDelay + PrimaryWeapon->FireDelay ); } void UCombatComponent::FireTimerFinished() { - if (EquippedWeapon == nullptr) return; + if (PrimaryWeapon == nullptr) return; bCanFire = true; - if (bFireButtonPressed && EquippedWeapon->bAutomatic) + if (bFireButtonPressed && PrimaryWeapon->bAutomatic) { Fire(); } @@ -139,18 +140,18 @@ void UCombatComponent::ServerFire_Implementation(const FVector_NetQuantize& Trac void UCombatComponent::MulticastFire_Implementation(const FVector_NetQuantize& TraceHitTarget) { - if (EquippedWeapon == nullptr) return; - if (Character && CombatState == ECombatState::ECS_Reloading && EquippedWeapon->IsShotgun()) + if (PrimaryWeapon == nullptr) return; + if (Character && CombatState == ECombatState::ECS_Reloading && PrimaryWeapon->IsShotgun()) { Character->PlayFireMontage(bAiming); - EquippedWeapon->Fire(TraceHitTarget); + PrimaryWeapon->Fire(TraceHitTarget); CombatState = ECombatState::ECS_Unoccupied; return; } if (Character && CombatState == ECombatState::ECS_Unoccupied) { Character->PlayFireMontage(bAiming); - EquippedWeapon->Fire(TraceHitTarget); + PrimaryWeapon->Fire(TraceHitTarget); } } @@ -158,26 +159,51 @@ void UCombatComponent::EquipWeapon(AWeapon* WeaponToEquip) { if (Character == nullptr || WeaponToEquip == nullptr) return; if (CombatState != ECombatState::ECS_Unoccupied) return; - - DropEquippedWeapon(); - EquippedWeapon = WeaponToEquip; - EquippedWeapon->SetWeaponState(EWeaponState::EWS_Equipped); - AttachActorToRightHand(EquippedWeapon); - EquippedWeapon->SetOwner(Character); - EquippedWeapon->SetHUDAmmo(); - UpdateCarriedAmmo(); - PlayEquipWeaponSound(); - ReloadEmptyWeapon(); + + if (PrimaryWeapon != nullptr && SecondaryWeapon == nullptr) + { + EquipSecondaryWeapon(WeaponToEquip); + } + else + { + EquipPrimaryWeapon(WeaponToEquip); + } Character->GetCharacterMovement()->bOrientRotationToMovement = false; Character->bUseControllerRotationYaw = true; } -void UCombatComponent::DropEquippedWeapon() +void UCombatComponent::EquipPrimaryWeapon(AWeapon* WeaponToEquip) { - if (EquippedWeapon) + if (WeaponToEquip == nullptr) return; + + DropPrimaryWeapon(); + PrimaryWeapon = WeaponToEquip; + PrimaryWeapon->SetWeaponState(EWeaponState::EWS_Equipped); + AttachActorToRightHand(PrimaryWeapon); + PrimaryWeapon->SetOwner(Character); + PrimaryWeapon->SetHUDAmmo(); + UpdateCarriedAmmo(); + PlayEquipWeaponSound(PrimaryWeapon); + ReloadEmptyWeapon(); +} + +void UCombatComponent::EquipSecondaryWeapon(AWeapon* WeaponToEquip) +{ + if (WeaponToEquip == nullptr) return; + + SecondaryWeapon = WeaponToEquip; + SecondaryWeapon->SetWeaponState(EWeaponState::EWS_Equipped); + AttachActorToBackpack(WeaponToEquip); + PrimaryWeapon->SetOwner(Character); + PlayEquipWeaponSound(SecondaryWeapon); +} + +void UCombatComponent::DropPrimaryWeapon() +{ + if (PrimaryWeapon) { - EquippedWeapon->Dropped(); + PrimaryWeapon->Dropped(); } } @@ -193,8 +219,8 @@ void UCombatComponent::AttachActorToRightHand(AActor* ActorToAttach) void UCombatComponent::AttachActorToLeftHand(AActor* ActorToAttach) { - if (Character == nullptr || Character->GetMesh() == nullptr || ActorToAttach == nullptr || EquippedWeapon == nullptr) return; - bool bUsePistolSocket = EquippedWeapon->IsPistol() || EquippedWeapon->IsSMG(); + if (Character == nullptr || Character->GetMesh() == nullptr || ActorToAttach == nullptr || PrimaryWeapon == nullptr) return; + bool bUsePistolSocket = PrimaryWeapon->IsPistol() || PrimaryWeapon->IsSMG(); FName SocketName = bUsePistolSocket ? FName("LeftHandPistolSocket") : FName("LeftHandSocket"); const USkeletalMeshSocket* HandSocket = Character->GetMesh()->GetSocketByName(SocketName); if (HandSocket) @@ -203,12 +229,22 @@ void UCombatComponent::AttachActorToLeftHand(AActor* ActorToAttach) } } +void UCombatComponent::AttachActorToBackpack(AActor* ActorToAttach) +{ + if (Character == nullptr || Character->GetMesh() == nullptr|| ActorToAttach == nullptr) return; + const USkeletalMeshSocket* BackpackSocket = Character->GetMesh()->GetSocketByName(FName("BackpackSocket")); + if (BackpackSocket) + { + BackpackSocket->AttachActor(ActorToAttach, Character->GetMesh()); + } +} + void UCombatComponent::UpdateCarriedAmmo() { - if (EquippedWeapon == nullptr) return; - if (CarriedAmmoMap.Contains(EquippedWeapon->GetWeaponType())) + if (PrimaryWeapon == nullptr) return; + if (CarriedAmmoMap.Contains(PrimaryWeapon->GetWeaponType())) { - CarriedAmmo = CarriedAmmoMap[EquippedWeapon->GetWeaponType()]; + CarriedAmmo = CarriedAmmoMap[PrimaryWeapon->GetWeaponType()]; } Controller = Controller == nullptr ? Cast(Character->Controller) : Controller; @@ -218,13 +254,13 @@ void UCombatComponent::UpdateCarriedAmmo() } } -void UCombatComponent::PlayEquipWeaponSound() +void UCombatComponent::PlayEquipWeaponSound(const AWeapon* Weapon) { - if (Character && EquippedWeapon && EquippedWeapon->EquipSound) + if (Character && Weapon && Weapon->EquipSound) { UGameplayStatics::PlaySoundAtLocation( this, - EquippedWeapon->EquipSound, + Weapon->EquipSound, Character->GetActorLocation() ); } @@ -232,7 +268,7 @@ void UCombatComponent::PlayEquipWeaponSound() void UCombatComponent::ReloadEmptyWeapon() { - if (EquippedWeapon && EquippedWeapon->IsEmpty()) + if (PrimaryWeapon && PrimaryWeapon->IsEmpty()) { Reload(); } @@ -248,10 +284,10 @@ void UCombatComponent::Reload() void UCombatComponent::ServerReload_Implementation() { - if (Character == nullptr || EquippedWeapon == nullptr) return; + if (Character == nullptr || PrimaryWeapon == nullptr) return; // return if weapon mag is at max capacity - if (EquippedWeapon->GetAmmo() == EquippedWeapon->GetMagCapacity()) return; + if (PrimaryWeapon->GetAmmo() == PrimaryWeapon->GetMagCapacity()) return; CombatState = ECombatState::ECS_Reloading; HandleReload(); @@ -273,38 +309,38 @@ void UCombatComponent::FinishedReloading() void UCombatComponent::UpdateAmmoValues() { - if (Character == nullptr || EquippedWeapon == nullptr) return; + if (Character == nullptr || PrimaryWeapon == nullptr) return; int32 ReloadAmount = AmountToReload(); - if (CarriedAmmoMap.Contains(EquippedWeapon->GetWeaponType())) + if (CarriedAmmoMap.Contains(PrimaryWeapon->GetWeaponType())) { - CarriedAmmoMap[EquippedWeapon->GetWeaponType()] -= ReloadAmount; - CarriedAmmo = CarriedAmmoMap[EquippedWeapon->GetWeaponType()]; + CarriedAmmoMap[PrimaryWeapon->GetWeaponType()] -= ReloadAmount; + CarriedAmmo = CarriedAmmoMap[PrimaryWeapon->GetWeaponType()]; } Controller = Controller == nullptr ? Cast(Character->Controller) : Controller; if (Controller) { Controller->SetHUDCarriedAmmo(CarriedAmmo); } - EquippedWeapon->AddAmmo(-ReloadAmount); + PrimaryWeapon->AddAmmo(-ReloadAmount); } void UCombatComponent::UpdateShotgunAmmoValues() { - if (Character == nullptr || EquippedWeapon == nullptr) return; + if (Character == nullptr || PrimaryWeapon == nullptr) return; - if (CarriedAmmoMap.Contains(EquippedWeapon->GetWeaponType())) + if (CarriedAmmoMap.Contains(PrimaryWeapon->GetWeaponType())) { - CarriedAmmoMap[EquippedWeapon->GetWeaponType()] -= 1; - CarriedAmmo = CarriedAmmoMap[EquippedWeapon->GetWeaponType()]; + CarriedAmmoMap[PrimaryWeapon->GetWeaponType()] -= 1; + CarriedAmmo = CarriedAmmoMap[PrimaryWeapon->GetWeaponType()]; } Controller = Controller == nullptr ? Cast(Character->Controller) : Controller; if (Controller) { Controller->SetHUDCarriedAmmo(CarriedAmmo); } - EquippedWeapon->AddAmmo(-1); + PrimaryWeapon->AddAmmo(-1); bCanFire = true; - if (EquippedWeapon->IsFull() || CarriedAmmo == 0) + if (PrimaryWeapon->IsFull() || CarriedAmmo == 0) { JumpToShotgunEnd(); } @@ -323,7 +359,7 @@ void UCombatComponent::JumpToShotgunEnd() void UCombatComponent::ThrowGrenadeFinished() { CombatState = ECombatState::ECS_Unoccupied; - AttachActorToRightHand(EquippedWeapon); + AttachActorToRightHand(PrimaryWeapon); } void UCombatComponent::LaunchGrenade() @@ -375,7 +411,7 @@ void UCombatComponent::OnRep_CombatState() if (Character && !Character->IsLocallyControlled()) { Character->PlayThrowGrenadeMontage(); - AttachActorToLeftHand(EquippedWeapon); + AttachActorToLeftHand(PrimaryWeapon); ShowAttachedGrenade(true); } break; @@ -389,12 +425,12 @@ void UCombatComponent::HandleReload() int32 UCombatComponent::AmountToReload() { - if (EquippedWeapon == nullptr) return 0; - int32 RoomInMag = EquippedWeapon->GetMagCapacity() - EquippedWeapon->GetAmmo(); + if (PrimaryWeapon == nullptr) return 0; + int32 RoomInMag = PrimaryWeapon->GetMagCapacity() - PrimaryWeapon->GetAmmo(); - if (CarriedAmmoMap.Contains(EquippedWeapon->GetWeaponType())) + if (CarriedAmmoMap.Contains(PrimaryWeapon->GetWeaponType())) { - int32 AmountCarried = CarriedAmmoMap[EquippedWeapon->GetWeaponType()]; + int32 AmountCarried = CarriedAmmoMap[PrimaryWeapon->GetWeaponType()]; int32 Least = FMath::Min(RoomInMag, AmountCarried); return FMath::Clamp(RoomInMag, 0, Least); } @@ -404,12 +440,12 @@ int32 UCombatComponent::AmountToReload() void UCombatComponent::ThrowGrenade() { if (Grenades == 0) return; - if (CombatState != ECombatState::ECS_Unoccupied || EquippedWeapon == nullptr) return; + if (CombatState != ECombatState::ECS_Unoccupied || PrimaryWeapon == nullptr) return; CombatState = ECombatState::ECS_ThrowingGrenade; if (Character) { Character->PlayThrowGrenadeMontage(); - AttachActorToLeftHand(EquippedWeapon); + AttachActorToLeftHand(PrimaryWeapon); ShowAttachedGrenade(true); } if (Character && !Character->HasAuthority()) @@ -430,7 +466,7 @@ void UCombatComponent::ServerThrowGrenade_Implementation() if (Character) { Character->PlayThrowGrenadeMontage(); - AttachActorToLeftHand(EquippedWeapon); + AttachActorToLeftHand(PrimaryWeapon); ShowAttachedGrenade(true); } Grenades = FMath::Clamp(Grenades -1, 0, MaxGrenades); @@ -459,15 +495,25 @@ void UCombatComponent::ShowAttachedGrenade(bool bShowGrenade) } } -void UCombatComponent::OnRep_EquippedWeapon() +void UCombatComponent::OnRep_PrimaryWeapon() { - if (EquippedWeapon && Character) + if (PrimaryWeapon && Character) { - EquippedWeapon->SetWeaponState(EWeaponState::EWS_Equipped); - AttachActorToRightHand(EquippedWeapon); + PrimaryWeapon->SetWeaponState(EWeaponState::EWS_Equipped); + AttachActorToRightHand(PrimaryWeapon); Character->GetCharacterMovement()->bOrientRotationToMovement = false; Character->bUseControllerRotationYaw = true; - PlayEquipWeaponSound(); + PlayEquipWeaponSound(PrimaryWeapon); + } +} + +void UCombatComponent::OnRep_SecondaryWeapon() +{ + if (SecondaryWeapon && Character) + { + SecondaryWeapon->SetWeaponState(EWeaponState::EWS_Equipped); + AttachActorToBackpack(SecondaryWeapon); + PlayEquipWeaponSound(SecondaryWeapon); } } @@ -530,13 +576,13 @@ void UCombatComponent::SetHUDCrosshairs(float DeltaTime) HUD = HUD == nullptr ? Cast(Controller->GetHUD()) : HUD; if (HUD) { - if (EquippedWeapon) + if (PrimaryWeapon) { - HUDPackage.CrosshairsCenter = EquippedWeapon->CrosshairsCenter; - HUDPackage.CrosshairsLeft = EquippedWeapon->CrosshairsLeft; - HUDPackage.CrosshairsRight = EquippedWeapon->CrosshairsRight; - HUDPackage.CrosshairsBottom = EquippedWeapon->CrosshairsBottom; - HUDPackage.CrosshairsTop = EquippedWeapon->CrosshairsTop; + HUDPackage.CrosshairsCenter = PrimaryWeapon->CrosshairsCenter; + HUDPackage.CrosshairsLeft = PrimaryWeapon->CrosshairsLeft; + HUDPackage.CrosshairsRight = PrimaryWeapon->CrosshairsRight; + HUDPackage.CrosshairsBottom = PrimaryWeapon->CrosshairsBottom; + HUDPackage.CrosshairsTop = PrimaryWeapon->CrosshairsTop; } else { @@ -590,11 +636,11 @@ void UCombatComponent::SetHUDCrosshairs(float DeltaTime) void UCombatComponent::InterpFOV(float DeltaTime) { - if (EquippedWeapon == nullptr) return; + if (PrimaryWeapon == nullptr) return; if (bAiming) { - CurrentFOV = FMath::FInterpTo(CurrentFOV, EquippedWeapon->GetZoomedFOV(), DeltaTime, EquippedWeapon->GetZoomInterpSpeed()); + CurrentFOV = FMath::FInterpTo(CurrentFOV, PrimaryWeapon->GetZoomedFOV(), DeltaTime, PrimaryWeapon->GetZoomInterpSpeed()); } else { @@ -608,14 +654,14 @@ void UCombatComponent::InterpFOV(float DeltaTime) void UCombatComponent::SetAiming(bool bIsAiming) { - if (Character == nullptr || EquippedWeapon == nullptr) return; + if (Character == nullptr || PrimaryWeapon == nullptr) return; bAiming = bIsAiming; ServerSetAiming(bIsAiming); if (Character) { Character->GetCharacterMovement()->MaxWalkSpeed = bIsAiming ? AimWalkSpeed : BaseWalkSpeed; } - if (Character->IsLocallyControlled() && EquippedWeapon->IsSniper()) + if (Character->IsLocallyControlled() && PrimaryWeapon->IsSniper()) { Character->ShowSniperScopeWidget(bIsAiming); } @@ -632,10 +678,10 @@ void UCombatComponent::ServerSetAiming_Implementation(bool bIsAiming) bool UCombatComponent::CanFire() { - if (EquippedWeapon == nullptr) return false; - if (EquippedWeapon->IsEmpty()) return false; + if (PrimaryWeapon == nullptr) return false; + if (PrimaryWeapon->IsEmpty()) return false; if (!bCanFire) return false; - if (CombatState == ECombatState::ECS_Reloading && EquippedWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun) return true; + if (CombatState == ECombatState::ECS_Reloading && PrimaryWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun) return true; return CombatState == ECombatState::ECS_Unoccupied; } @@ -647,8 +693,8 @@ void UCombatComponent::OnRep_CarriedAmmo() Controller->SetHUDCarriedAmmo(CarriedAmmo); } bool bJumpToShotgunEnd = CombatState == ECombatState::ECS_Reloading && - EquippedWeapon != nullptr && - EquippedWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun && + PrimaryWeapon != nullptr && + PrimaryWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun && CarriedAmmo == 0; if (bJumpToShotgunEnd) diff --git a/Source/Blaster/Components/CombatComponent.h b/Source/Blaster/Components/CombatComponent.h index a023908..02cf909 100644 --- a/Source/Blaster/Components/CombatComponent.h +++ b/Source/Blaster/Components/CombatComponent.h @@ -55,7 +55,10 @@ protected: void ServerSetAiming(bool bIsAiming); UFUNCTION() - void OnRep_EquippedWeapon(); + void OnRep_PrimaryWeapon(); + UFUNCTION() + void OnRep_SecondaryWeapon(); + void Fire(); UFUNCTION(Server, Reliable) @@ -82,23 +85,31 @@ protected: UPROPERTY(EditAnywhere) TSubclassOf GrenadeClass; - void DropEquippedWeapon(); + void DropPrimaryWeapon(); void AttachActorToRightHand(AActor* ActorToAttach); void AttachActorToLeftHand(AActor* ActorToAttach); + void AttachActorToBackpack(AActor* ActorToAttach); void UpdateCarriedAmmo(); - void PlayEquipWeaponSound(); + void PlayEquipWeaponSound(const AWeapon* Weapon); void ReloadEmptyWeapon(); void ShowAttachedGrenade(bool bShowGrenade); + void EquipPrimaryWeapon(AWeapon* WeaponToEquip); + void EquipSecondaryWeapon(AWeapon* WeaponToEquip); private: UPROPERTY() - class ABlasterCharacter* Character; + ABlasterCharacter* Character; + UPROPERTY() class ABlasterPlayerController* Controller; - UPROPERTY() - class ABlasterHUD* HUD; - UPROPERTY(ReplicatedUsing=OnRep_EquippedWeapon) - class AWeapon* EquippedWeapon; + UPROPERTY() + ABlasterHUD* HUD; + + UPROPERTY(ReplicatedUsing=OnRep_PrimaryWeapon) + AWeapon* PrimaryWeapon; + + UPROPERTY(ReplicatedUsing=OnRep_SecondaryWeapon) + AWeapon* SecondaryWeapon; UPROPERTY(Replicated) bool bAiming; diff --git a/Source/Blaster/Weapon/Weapon.cpp b/Source/Blaster/Weapon/Weapon.cpp index 674a3b9..fff9b8c 100644 --- a/Source/Blaster/Weapon/Weapon.cpp +++ b/Source/Blaster/Weapon/Weapon.cpp @@ -105,9 +105,14 @@ void AWeapon::OnRep_Owner() { OwnerCharacter = nullptr; OwnerController = nullptr; - } else + } + else { - SetHUDAmmo(); + OwnerCharacter = OwnerCharacter == nullptr ? Cast(Owner) : OwnerCharacter; + if (OwnerCharacter && OwnerCharacter->GetPrimaryWeapon() && OwnerCharacter->GetPrimaryWeapon() == this) + { + SetHUDAmmo(); + } } }