Network Object doesn't work when connected to character

Ok so in my game characters can use a shield to deflect objects being shot at them. The shield has a script on it that detects a collision with an object with a tag of "ball". When it does detect it, calls an RPC method which then plays a sound, deducts health from the shield and so on.

The shield works perfectly fine if I leave it as a separate object in my game. It syncs fine across the network. Whenever I use the exact same shield on a player it doesn't do anything at all. The collider works because it blocks objects, but it doesn't call any of the methods. Below is my script, does anyone know what the issue could be?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using VRTK;

[RequireComponent(typeof(AudioSource))]
public class ShieldHealth_Basic : Photon.PunBehaviour
{

    public int shieldImpacts = 0;
    public int health = 3;
	public GameObject[] shieldHealthDisplay; 
    public GameObject shield;
    public AudioClip impactAudio;
    public AudioClip depletedAudio;
    public VRTK_ControllerEvents eventScript;
	private bool shieldActive = false;
	private AudioSource aud;


    // Use this for initialization
    void Start()
    {
        shield.SetActive(shieldActive);
        aud = GetComponent<AudioSource>();
         eventScript.TriggerTouchStart += new ControllerInteractionEventHandler(EnableShield);
         eventScript.TriggerTouchEnd += new ControllerInteractionEventHandler(EnableShield);
      
   }

	void OnCollisionEnter (Collision col)
	{
		if(col.gameObject.CompareTag("Ball"))
		{
			photonView.RPC("ShieldImpact", PhotonTargets.AllBuffered);
			//ShieldImpact();
		}
	}

  
    [PunRPC]
    void ShieldImpact()
    {
        if ((health-1) <= 0)
        {
			aud.PlayOneShot(depletedAudio);
			health = 0;
			shieldHealthDisplay[health].SetActive(false);
			gameObject.GetComponent<MeshCollider>().enabled = false;
			Invoke("ShieldDown", 2f);
			
        }
        else
        {
            aud.PlayOneShot(impactAudio);
            health--;
			shieldHealthDisplay[health].SetActive(false);
        }
    }

	void ShieldDown ()
	{
		
		shield.SetActive(false);
        Invoke("RegenShield", 3f);
	}

    public void EnableShield (object sender, ControllerInteractionEventArgs e)
    {
        if(health > 0)
        {
        shieldActive = !shieldActive;
          shield.SetActive(shieldActive);
        }
    }

    void RegenShield ()
    {
        health = 3;
        shieldHealthDisplay[0].SetActive(true);
        shieldHealthDisplay[1].SetActive(true);
        shieldHealthDisplay[2].SetActive(true);
        gameObject.GetComponent<MeshCollider>().enabled = true;
        shield.SetActive(true);
           
    }
}