So If ever someone have the same issues, or is asking for the same question, I’ve finally went the weapon have 2 meshes. 1 for ThirdPerson, and 1 for FirstPerson. I then, attach the Firstperson one when is locally controlled ( just for optimization I guess).
Combat Component.cpp:
void UCombatComponent::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(UCombatComponent, EquippedWeapon);
}
void UCombatComponent::ClientEquippedWeaponOnMesh() const
{
if (EquippedWeapon && Character)
{
if (Character->IsLocallyControlled())
{
if (const USkeletalMeshSocket* HandSocket = Character->GetFirstPersonMesh()->GetSocketByName(EquippedWeapon->GetHandSocketName()))
{
EquippedWeapon->AttachToComponent(Character->GetFirstPersonMesh(), FAttachmentTransformRules::SnapToTargetNotIncludingScale, EquippedWeapon->GetHandSocketName());
}
}
}
}
void UCombatComponent::OnRep_EquippedWeapon()
{
ClientEquippedWeaponOnMesh();
}
UFUNCTION()
void ClientEquippedWeaponOnMesh() const;
UFUNCTION()
void OnRep_EquippedWeapon();
UPROPERTY(ReplicatedUsing= OnRep_EquippedWeapon)
AWeapon* EquippedWeapon;
Weapon.h
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
USkeletalMeshComponent* WeaponMesh;
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
USkeletalMeshComponent* FirstPersonWeaponMesh;
UPROPERTY(VisibleAnywhere, Category = "Weapon Properties")
USkeletalMeshComponent* ThirdPersonWeaponMesh;
Weapon.cpp
AWeapon::AWeapon()
{
bReplicates = true;
InitializeWeaponMesh();
}
void AWeapon::InitializeWeaponMesh()
{
WeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("WeaponMesh"));
FirstPersonWeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FirstPersonWeaponMesh"));
FirstPersonWeaponMesh->SetupAttachment(RootComponent);
FirstPersonWeaponMesh->SetOnlyOwnerSee(true); // Only visible to owning player
ThirdPersonWeaponMesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("ThirdPersonWeaponMesh"));
ThirdPersonWeaponMesh->SetupAttachment(RootComponent);
ThirdPersonWeaponMesh->SetOwnerNoSee(true); // Not visible to owning player
FirstPersonWeaponMesh->SetSkeletalMesh(WeaponMesh->GetSkeletalMeshAsset());
ThirdPersonWeaponMesh->SetSkeletalMesh(WeaponMesh->GetSkeletalMeshAsset());
SetRootComponent(WeaponMesh);
WeaponMesh->SetCollisionResponseToAllChannels(ECR_Block);
WeaponMesh->SetCollisionResponseToChannel(ECC_Pawn, ECR_Ignore);
WeaponMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
}