Updating multiplayer map on joining

Hello,

Some friends and I are making our own multiplayer game in Unity using the Photon networking plugin.

We have a pre made map with objects in it we alter the state of the objects using RPCs.
Now, when a player joins the match i need to get the state of every object from the master client (any client can work), and i need to update the states of those objects on the joining client.

here’s the joining code(C#):

using UnityEngine;
using System.Collections;

public class NetworkHandler : Photon.MonoBehaviour
{
    public void Start() {
        PhotonNetwork.ConnectUsingSettings("alpha 1.0");
    }

    public void OnGUI() {
        GUILayout.Label(PhotonNetwork.connectionStateDetailed.ToString());
    }

    public void OnJoinedLobby() {
        PhotonNetwork.JoinRandomRoom();
    }

    // Update is called once per frame
    public void OnPhotonRandomJoinFailed() {
        PhotonNetwork.CreateRoom(null);
    }//

    public void OnJoinedRoom() {
        GameObject Player = PhotonNetwork.Instantiate("Player", Vector3.zero, Quaternion.identity, 0);
        Player.transform.position = new Vector3(3.278986f, 0, -2.779208f);

        // Enable all the scripts
        foreach (MonoBehaviour script in Player.GetComponents<MonoBehaviour>()) {
            script.enabled = true;
        }

        Transform playerCam = Player.transform.Find("Main Camera");
        playerCam.gameObject.SetActive(true);
    }
}

And here is the code for the walls that use the RPCs(also C#):

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Wall : Photon.MonoBehaviour
{
    public enum Type {
        Default = 0,
        Unbreakable = 1,
        Ghost = 2
    };

    public Type type;
    private List<Material> materials = new List<Material>();

    private PhotonView myphoton;

    // Use this for initialization
    public void Start() {
        materials.Insert((int)Type.Default, Resources.Load("Materials/Wall_Default") as Material);
        materials.Insert((int)Type.Unbreakable, Resources.Load("Materials/Wall_Solid") as Material);
        materials.Insert((int)Type.Ghost, Resources.Load("Materials/Wall_Default_Ghost") as Material);
        myphoton = GetComponent<PhotonView>();

        //if (Random.Range(0, 2) > 0) {
        //    myphoton.RPC("Deactivate", PhotonTargets.All);
        //}
    }

    /**
     * Wall (de)activators
     */
    [RPC]
    public void Activate() {
            gameObject.collider.isTrigger = false;
            // renderer.material = material;
            renderer.material = materials[(int)Type.Default];
            type = Type.Default;
            gameObject.layer = 0;
    }
    [RPC]
    public void Deactivate() {
            gameObject.collider.isTrigger = true;
            renderer.material = materials[(int)Type.Ghost];
            type = Type.Ghost;
            gameObject.layer = 8;
    }

    /**
     * Called when the object is being clicked on by the player
     */
    public void Click(/*Player.Mode mode*/) {
        switch (type) {
            case Type.Default:
                myphoton.RPC("Deactivate", PhotonTargets.All);
                break;

            case Type.Ghost:
                myphoton.RPC("Activate", PhotonTargets.All);
                break;

            case Type.Unbreakable:
                // Nothing to do here
                break;
        }
    }
}

So, each wall has an Active and Deactive state basically and i need to sychronize those states for the newly joining players.

Thanks a tonne,

Yannick

I would look into the PhotonTarget.AllBuffered. Basically all new joining players will have the rpc sent to them when they join your game.