Why are new players receiving Cached InterestGroup 0 Events, but not cached InterestGroup 1+ Events

I have a basic test setup allowing players to join rooms, be partitioned in to groups, and RaiseEvents targeted at other players in the same group. Players can trigger events with InterestGroup set to their own group or 0, and both types are set to AddToRoomCache.

After adding some players, sending events I join with some more players. Because the raised events are all cached I would expect them to receive all the relevant events, however newly joined players only receive the events sent to InterestGroup 0, not ones that match their interest group.

Below is the code for this test setup.

public class NetworkConnectTest : MonoBehaviour
{
    void Start ()
    {
        PhotonNetwork.ConnectUsingSettings("0.1");
    }

    void OnJoinedLobby()
    {
        PhotonNetwork.JoinOrCreateRoom("RoomName", new RoomOptions(), TypedLobby.Default);
    }

    void OnJoinedRoom()
    {
        var group = PhotonNetwork.player.ID % 2 == 0 ? 1 : 2;
        var enabledGroups = new[] { group };
        var disabledGroups = new[] { 3, 4 };
        PhotonNetwork.SetSendingEnabled(enabledGroups, disabledGroups);
        PhotonNetwork.SetReceivingEnabled(enabledGroups, disabledGroups);

        var go = PhotonNetwork.Instantiate("MultiPlayer", Vector3.zero, Quaternion.identity, group);
    }
}

public class RaiseEventTest : MonoBehaviour
{
    private PhotonView _pv;

    void Awake()
    {
        _pv = GetComponent<PhotonView>();

        if (!_pv.isMine) return;
        SetGroup();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.E))
        {
            RaiseEventGroup();
        }

        if (Input.GetKeyDown(KeyCode.R))
        {
            RaiseEventAll();
        }
    }

    
    public void SetGroup()
    {
        if (!_pv) _pv = GetComponent<PhotonView>();
        if (!_pv.isMine) return;
        PhotonNetwork.OnEventCall += OnEventRaised;

        var group = PhotonNetwork.player.ID % 2 == 0 ? 1 : 2;
        _pv.group = group;
    }

    public void RaiseEventGroup()
    {
        if (!_pv.isMine) return;

        var group = (byte)_pv.group;

        var opts            = RaiseEventOptions.Default;
        opts.InterestGroup  = group;
        opts.CachingOption  = EventCaching.AddToRoomCache;
        opts.Receivers      = ReceiverGroup.All;

        // For some reason InterestGroup > 0 means the event isnt called on the local player, 
        // and must be done manually
        PhotonNetwork.RaiseEvent(   NetworkEventCode.Group, null, true, opts);
        PhotonNetwork.OnEventCall(NetworkEventCode.Group, null, PhotonNetwork.player.ID); 
    }
    public void RaiseEventAll()
    {
        if (!_pv.isMine) return;


        var opts            = RaiseEventOptions.Default;
        opts.CachingOption  = EventCaching.AddToRoomCache;
        opts.Receivers      = ReceiverGroup.All;

        PhotonNetwork.RaiseEvent(NetworkEventCode.All, null, true, opts);
    }

    private void OnEventRaised(byte eventcode, object content, int senderid)
    {
        if (!_pv.isMine) return;
        Debug.LogError(string.Format("{0} sent event: {1}", senderid, eventcode));
    }
}

Best Answer

Answers