179 - Client-Side Predicting Reloading
This commit is contained in:
parent
58a06d4366
commit
249dfa84f7
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
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;
|
||||
|
|
|
@ -47,6 +47,7 @@ public:
|
|||
|
||||
void PickupAmmo(EWeaponType WeaponType, int32 AmmoAmount);
|
||||
|
||||
bool bLocallyReloading = false;
|
||||
protected:
|
||||
virtual void BeginPlay() override;
|
||||
void SetAiming(bool bIsAiming);
|
||||
|
|
Loading…
Reference in New Issue