179 - Client-Side Predicting Reloading

This commit is contained in:
Kingsmedia 2022-05-26 17:09:25 +02:00
parent 58a06d4366
commit 249dfa84f7
5 changed files with 31 additions and 12 deletions

View File

@ -74,6 +74,10 @@ void UBlasterAnimInstance::NativeUpdateAnimation(float DeltaTime)
} }
bUseFABRIK = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied; 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(); bUseAimOffsets = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied && !BlasterCharacter->GetDisableGameplay();
bTransformRightHand = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied && !BlasterCharacter->GetDisableGameplay(); bTransformRightHand = BlasterCharacter->GetCombatState() == ECombatState::ECS_Unoccupied && !BlasterCharacter->GetDisableGameplay();
} }

View File

@ -809,3 +809,9 @@ ECombatState ABlasterCharacter::GetCombatState() const
if (Combat == nullptr) return ECombatState::ECS_MAX; if (Combat == nullptr) return ECombatState::ECS_MAX;
return Combat->CombatState; return Combat->CombatState;
} }
bool ABlasterCharacter::IsLocallyReloading()
{
if (Combat == nullptr) return false;
return Combat->bLocallyReloading;
}

View File

@ -237,4 +237,5 @@ public:
FORCEINLINE bool GetDisableGameplay() const { return bDisableGameplay; } FORCEINLINE bool GetDisableGameplay() const { return bDisableGameplay; }
FORCEINLINE UAnimMontage* GetReloadMontage() const { return ReloadMontage; } FORCEINLINE UAnimMontage* GetReloadMontage() const { return ReloadMontage; }
FORCEINLINE UStaticMeshComponent* GetAttachedGrenade() const { return AttachedGrenade; } FORCEINLINE UStaticMeshComponent* GetAttachedGrenade() const { return AttachedGrenade; }
bool IsLocallyReloading();
}; };

View File

@ -387,18 +387,14 @@ void UCombatComponent::ReloadEmptyWeapon()
void UCombatComponent::Reload() void UCombatComponent::Reload()
{ {
if (CarriedAmmo > 0 && CombatState == ECombatState::ECS_Unoccupied) if (CarriedAmmo > 0 && CombatState == ECombatState::ECS_Unoccupied && PrimaryWeapon && !PrimaryWeapon->IsFull() && !bLocallyReloading)
{ {
ServerReload(); ServerReload();
HandleReload();
bLocallyReloading = true;
} }
} }
void UCombatComponent::DropWeapons()
{
if (PrimaryWeapon) PrimaryWeapon->Dropped();
if (SecondaryWeapon) SecondaryWeapon->Dropped();
}
void UCombatComponent::ServerReload_Implementation() void UCombatComponent::ServerReload_Implementation()
{ {
if (Character == nullptr || PrimaryWeapon == nullptr) return; if (Character == nullptr || PrimaryWeapon == nullptr) return;
@ -407,12 +403,13 @@ void UCombatComponent::ServerReload_Implementation()
if (PrimaryWeapon->GetAmmo() == PrimaryWeapon->GetMagCapacity()) return; if (PrimaryWeapon->GetAmmo() == PrimaryWeapon->GetMagCapacity()) return;
CombatState = ECombatState::ECS_Reloading; CombatState = ECombatState::ECS_Reloading;
HandleReload(); if (!Character->IsLocallyControlled()) HandleReload();
} }
void UCombatComponent::FinishedReloading() void UCombatComponent::FinishedReloading()
{ {
if (Character == nullptr) return; if (Character == nullptr) return;
bLocallyReloading = false;
if (Character->HasAuthority()) if (Character->HasAuthority())
{ {
CombatState = ECombatState::ECS_Unoccupied; 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() void UCombatComponent::UpdateAmmoValues()
{ {
if (Character == nullptr || PrimaryWeapon == nullptr) return; if (Character == nullptr || PrimaryWeapon == nullptr) return;
@ -516,7 +519,7 @@ void UCombatComponent::OnRep_CombatState()
switch (CombatState) switch (CombatState)
{ {
case ECombatState::ECS_Reloading: case ECombatState::ECS_Reloading:
HandleReload(); if (Character && !Character->IsLocallyControlled()) HandleReload();
break; break;
case ECombatState::ECS_Unoccupied: case ECombatState::ECS_Unoccupied:
if (bFireButtonPressed) if (bFireButtonPressed)
@ -537,7 +540,10 @@ void UCombatComponent::OnRep_CombatState()
void UCombatComponent::HandleReload() void UCombatComponent::HandleReload()
{ {
Character->PlayReloadMontage(); if (Character)
{
Character->PlayReloadMontage();
}
} }
int32 UCombatComponent::AmountToReload() int32 UCombatComponent::AmountToReload()
@ -784,6 +790,7 @@ bool UCombatComponent::CanFire()
{ {
if (PrimaryWeapon == nullptr) return false; if (PrimaryWeapon == nullptr) return false;
if (PrimaryWeapon->IsEmpty()) return false; if (PrimaryWeapon->IsEmpty()) return false;
if (bLocallyReloading) return false;
if (!bCanFire) return false; if (!bCanFire) return false;
if (CombatState == ECombatState::ECS_Reloading && PrimaryWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun) return true; if (CombatState == ECombatState::ECS_Reloading && PrimaryWeapon->GetWeaponType() == EWeaponType::EWT_Shotgun) return true;
return CombatState == ECombatState::ECS_Unoccupied; return CombatState == ECombatState::ECS_Unoccupied;

View File

@ -47,6 +47,7 @@ public:
void PickupAmmo(EWeaponType WeaponType, int32 AmmoAmount); void PickupAmmo(EWeaponType WeaponType, int32 AmmoAmount);
bool bLocallyReloading = false;
protected: protected:
virtual void BeginPlay() override; virtual void BeginPlay() override;
void SetAiming(bool bIsAiming); void SetAiming(bool bIsAiming);