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;
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();
}

View File

@ -809,3 +809,9 @@ ECombatState ABlasterCharacter::GetCombatState() const
if (Combat == nullptr) return ECombatState::ECS_MAX;
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 UAnimMontage* GetReloadMontage() const { return ReloadMontage; }
FORCEINLINE UStaticMeshComponent* GetAttachedGrenade() const { return AttachedGrenade; }
bool IsLocallyReloading();
};

View File

@ -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)
@ -536,9 +539,12 @@ void UCombatComponent::OnRep_CombatState()
}
void UCombatComponent::HandleReload()
{
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;

View File

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