diff --git a/Source/Blaster/Character/BlasterAnimInstance.cpp b/Source/Blaster/Character/BlasterAnimInstance.cpp index 61a0b19..4425da8 100644 --- a/Source/Blaster/Character/BlasterAnimInstance.cpp +++ b/Source/Blaster/Character/BlasterAnimInstance.cpp @@ -74,6 +74,10 @@ void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaTime) } bUseFABRIK = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied; + if (BlasterCharacter->IsLocallyControlled() && BlasterCharacter->GetCombatState() != ECombatState::ECS_ThrowingGrenade) + { + bUseFABRIK = !BlasterCharacter->IsLocallyReloading(); + } bUseAimOffsets = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied && !BlasterCharacter->GetDisableGameplay(); bTransformRightHand = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied && !BlasterCharacter->GetDisableGameplay(); } diff --git a/Source/Blaster/Character/BlasterCharacter.cpp b/Source/Blaster/Character/BlasterCharacter.cpp index 654483c..2151281 100644 --- a/Source/Blaster/Character/BlasterCharacter.cpp +++ b/Source/Blaster/Character/BlasterCharacter.cpp @@ -808,4 +808,10 @@ ECombatState ABlasterCharacter::GetCombatState() const { if (Combat == nullptr) return ECombatState::ECS_MAX; return Combat->CombatState; -} \ No newline at end of file +} + +bool ABlasterCharacter::IsLocallyReloading() +{ + if (Combat == nullptr) return false; + return Combat->bLocallyReloading; +} diff --git a/Source/Blaster/Character/BlasterCharacter.h b/Source/Blaster/Character/BlasterCharacter.h index f12c88c..648dba9 100644 --- a/Source/Blaster/Character/BlasterCharacter.h +++ b/Source/Blaster/Character/BlasterCharacter.h @@ -237,4 +237,5 @@ public: FORCEINLINE bool GetDisableGameplay() const { return bDisableGameplay; } FORCEINLINE UAnimMontage* GetReloadMontage() const { return ReloadMontage; } FORCEINLINE UStaticMeshComponent* GetAttachedGrenade() const { return AttachedGrenade; } + bool IsLocallyReloading(); }; diff --git a/Source/Blaster/Components/CombatComponent.cpp b/Source/Blaster/Components/CombatComponent.cpp index 7427e1c..b205257 100644 --- a/Source/Blaster/Components/CombatComponent.cpp +++ b/Source/Blaster/Components/CombatComponent.cpp @@ -387,18 +387,14 @@ void UCombatComponent::ReloadEmptyWeapon() void UCombatComponent::Reload() { - if (CarriedAmmo > 0 && CombatState == ECombatState::ECS_Unoccupied) + if (CarriedAmmo > 0 && CombatState == ECombatState::ECS_Unoccupied && PrimaryWeapon && !PrimaryWeapon->IsFull() && !bLocallyReloading) { ServerReload(); + HandleReload(); + bLocallyReloading = true; } } -void UCombatComponent::DropWeapons() -{ - if (PrimaryWeapon) PrimaryWeapon->Dropped(); - if (SecondaryWeapon) SecondaryWeapon->Dropped(); -} - void UCombatComponent::ServerReload_Implementation() { if (Character == nullptr || PrimaryWeapon == nullptr) return; @@ -407,12 +403,13 @@ void UCombatComponent::ServerReload_Implementation() if (PrimaryWeapon->GetAmmo() == PrimaryWeapon->GetMagCapacity()) return; CombatState = ECombatState::ECS_Reloading; - HandleReload(); + if (!Character->IsLocallyControlled()) HandleReload(); } void UCombatComponent::FinishedReloading() { if (Character == nullptr) return; + bLocallyReloading = false; if (Character->HasAuthority()) { CombatState = ECombatState::ECS_Unoccupied; @@ -424,6 +421,12 @@ void UCombatComponent::FinishedReloading() } } +void UCombatComponent::DropWeapons() +{ + if (PrimaryWeapon) PrimaryWeapon->Dropped(); + if (SecondaryWeapon) SecondaryWeapon->Dropped(); +} + void UCombatComponent::UpdateAmmoValues() { if (Character == nullptr || PrimaryWeapon == nullptr) return; @@ -516,7 +519,7 @@ void UCombatComponent::OnRep_CombatState() switch (CombatState) { case ECombatState::ECS_Reloading: - HandleReload(); + if (Character && !Character->IsLocallyControlled()) HandleReload(); break; case ECombatState::ECS_Unoccupied: if (bFireButtonPressed) @@ -537,7 +540,10 @@ void UCombatComponent::OnRep_CombatState() void UCombatComponent::HandleReload() { - Character->PlayReloadMontage(); + if (Character) + { + Character->PlayReloadMontage(); + } } int32 UCombatComponent::AmountToReload() @@ -784,6 +790,7 @@ bool UCombatComponent::CanFire() { if (PrimaryWeapon == nullptr) return false; if (PrimaryWeapon->IsEmpty()) return false; + if (bLocallyReloading) return false; if (!bCanFire) return false; if (CombatState == ECombatState::ECS_Reloading && PrimaryWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun) return true; return CombatState == ECombatState::ECS_Unoccupied; diff --git a/Source/Blaster/Components/CombatComponent.h b/Source/Blaster/Components/CombatComponent.h index 54444a5..2239f3c 100644 --- a/Source/Blaster/Components/CombatComponent.h +++ b/Source/Blaster/Components/CombatComponent.h @@ -46,7 +46,8 @@ public: void ServerLaunchGrenade(const FVector_NetQuantize& Target); void PickupAmmo(EWeaponType WeaponType, int32 AmmoAmount); - + + bool bLocallyReloading = false; protected: virtual void BeginPlay() override; void SetAiming(bool bIsAiming);