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;
|
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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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();
|
||||||
};
|
};
|
||||||
|
|
|
@ -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()
|
||||||
{
|
{
|
||||||
|
if (Character)
|
||||||
|
{
|
||||||
Character->PlayReloadMontage();
|
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue