How to attach weapon to different mesh on replicated server

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);
    }
1 Like