Exemplo n.º 1
0
 public void RevokeSyncToken(InstantiationData insData)
 {
     if (insData.TryGetValue(InstantiationData.InstantiationKey.sceneid, out object sceneid))
     {
         RevokeSyncToken((int)sceneid);
     }
 }
Exemplo n.º 2
0
    public override void OnEnable()
    {
        base.OnEnable();

        var targets = GetComponents <ICoreAdditive>();

        foreach (var tar in targets)
        {
            switch (tar.AdditiveType)
            {
            case SyncTokenType.Player:
                playerCoreAdditive = tar;
                break;

            case SyncTokenType.General:
                roomCoreAdditive = tar;
                break;

            default:
                Debug.LogWarning($"Unprepared Detected {tar.AdditiveType}");
                break;
            }
        }

        if (photonView.InstantiationData == null)
        {
            return;
        }

        InstantiationData data = new InstantiationData(photonView.InstantiationData);

        Debug.Log($"TransmissionBase Start REMOTEly.");
        Setup(data);
    }
Exemplo n.º 3
0
    public virtual void OnJoinedOnlineRoomAct()
    {
        if (HavingToken())
        {
            Debug.LogWarning($"[TokenHandler] OnJoinedOnlineRoomAct Having Token");
            return;
        }

        Debug.Log($"[TokenHandler] OnJoinedOnlineRoomAct");

        //// Online InRoom Load InstaData from TokenUser
        InstantiationData datatoSend = tokenUser?.SupplyInstantiationData;

        OnJoinedOnlineRoomEventBeforeTokenCreation?.Invoke(datatoSend);

        //// InRoom RequestSyncToken
        trasnTokenGO = tokenProvider.RequestSyncToken(datatoSend) as GameObject;
        if (!HavingToken())
        {
            Debug.LogWarning($"Not Yet InRoom for Register");
            return;
        }

        trasnTokenGO.GetComponent <ITransmissionBase>()?.Setup(datatoSend);
    }
Exemplo n.º 4
0
    /// <summary>
    /// Setup by
    /// TokenHandler LOCALly
    /// or
    /// using data received from TransmissionBase.OnEnable
    /// </summary>
    /// <param name="insData"></param>
    public void Setup(InstantiationData insData)
    {
        tType = insData.tokenType;
        Debug.Log($"TransmissionBase {gameObject.name} Setup. photonView.IsMine:{photonView.IsMine} {insData}");

        // get tokenUser from ObjectSupplier
        switch (tType)
        {
        case SyncTokenType.Player:
            playerCoreAdditive.Init(insData, photonView.IsMine);

            break;

        default:
        case SyncTokenType.General:
            Debug.LogWarning("TransmissionBase Setup General");
            roomCoreAdditive.Init(insData, photonView.IsMine);
            break;
        }

        // Setup SerializableReadWrite
        var sData = refObj?.GetComponent <ISyncHandlerUser>()?.SerializableReadWrite;

        if (sData != null)
        {
            Register(sData);
        }
        else
        {
            Debug.LogWarning($"TransmissionBase {gameObject.name}: No TokenUser/ no SerializableReadWrite for Sync!");
        }

        started = true;
    }
Exemplo n.º 5
0
    public GameObject ManualBuildSyncToken(InstantiationData dataToSend)
    {
        var go    = PrefabPoolManager.Instance.Instantiate("TransmissionToken", Vector3.zero, Quaternion.identity);//Instantiate(transmissionTokenPrefab);
        var pView = go.GetComponent <PhotonView>();

        if (PhotonNetwork.AllocateViewID(photonView))
        {
            var raiseEventOptions = new RaiseEventOptions
            {
                Receivers     = ReceiverGroup.Others,
                CachingOption = EventCaching.AddToRoomCache
            };

            var sendOptions = new SendOptions {
                Reliability = true
            };

            dataToSend.Add("viewID", photonView.ViewID.ToString());

            PhotonNetwork.RaiseEvent(
                (byte)RaiseEvnetCode.CustomManualInstantiationEventCode,
                dataToSend.ToData(),
                raiseEventOptions,
                sendOptions);

            return(go);
        }

        Debug.LogError("Failed to allocate a ViewId.");
        Destroy(go);
        return(null);
    }
Exemplo n.º 6
0
    public GameObject InstantiateObject()
    {
        if (hostPlayer != null)
        {
            Debug.LogWarning($"Player Exist!");
            return(GetMine());
        }

        Debug.LogWarning($"InstantiatePlayerObject Start");
        var go = Instantiate(playerCorePref, transform);

        go.name = "HostPlayer";
        var playerScript = go.GetComponent <Player>();

        if (playerScript != null)
        {
            hostPlayer          = playerScript;
            playerScript.isHost = true;

            var insData = InstantiationData.Build(SyncTokenType.Player);
            insData[InstantiationData.InstantiationKey.objectname.ToString()]    = playerCorePref.name;
            insData[InstantiationData.InstantiationKey.objectuuid.ToString()]    = randomID;
            insData[InstantiationData.InstantiationKey.objectpersist.ToString()] = 30;
            insData["ablePlayerEcho"] = true;
            insData["timestamp"]      = Time.time;

            playerScript.Init(insData, true, null);
            playerScript.creator = this;
        }
        Debug.LogWarning($"InstantiatePlayerObject HostPlayer Created");
        return(go);
    }
Exemplo n.º 7
0
 public void Init(InstantiationData data, bool isMine, ITransmissionBase itb)
 {
     instData = data;
     if (data.TryGetValue(InstantiationData.InstantiationKey.objectuuid, out object uuid))
     {
         objectUUID = (string)uuid;
     }
 }
Exemplo n.º 8
0
    public object RequestSyncToken(InstantiationData datatoSend)
    {
        var go = INetworkConnectGO.GetComponent <ITokenProvider>().RequestSyncToken(datatoSend);

        (go as GameObject).transform.SetParent(transform.root);

        return(go);
    }
Exemplo n.º 9
0
    public void DestroyRoomObject(InstantiationData insData)
    {
        if (!inc.IsInRoom())
        {
            Debug.LogWarning("[InstantiateRoomObject] Only InRoom can Destroy RoomObject!");
            return;
        }

        roh.DestroyRoomObject(insData);
    }
Exemplo n.º 10
0
    public InstantiationData GetClone()
    {
        InstantiationData clone = new InstantiationData();

        clone.RandomSphereUnit           = this.RandomSphereUnit;
        clone.RandomPositionInsideSphere = this.RandomPositionInsideSphere;
        clone.WorldOffset        = this.WorldOffset;
        clone.rotationOfInstance = this.rotationOfInstance;
        clone.specifiedQuaterion = this.specifiedQuaterion;
        return(clone);
    }
Exemplo n.º 11
0
    public static GameObject PhotonRpcInstantiateAsSibling(string prefabPath, Vector3 position, Quaternion rotation, object[] data, int siblingTokenId)
    {
        InstantiationData i = InstantiationData(prefabPath, position, rotation, data);

        i.PoolType = PoolType.RPC;

        var g = ObjectPoolManager.InstantiateAsSibling(i, siblingTokenId);

        ObjectPoolRpcManager.InstantiateAsSibling(i, siblingTokenId);
        return(g);
    }
Exemplo n.º 12
0
    public static GameObject PhotonRpcInstantiateAsChild(string prefabPath, Vector3 position, Quaternion rotation, object[] data, int parentTokenId)
    {
        InstantiationData i = InstantiationData(prefabPath, position, rotation, data);

        i.PoolType = PoolType.RPC;

        var g = ObjectPoolManager.Instantiate(i);

        g.transform.parent = ManagedObjects.Find(parentTokenId).transform;
        ObjectPoolRpcManager.InstantiateAsChild(i, parentTokenId);
        return(g);
    }
Exemplo n.º 13
0
    private static InstantiationData InstantiationData(string prefabPath, Vector3 position, Quaternion rotation, object[] data)
    {
        InstantiationData i = new InstantiationData();

        i.PrefabPath = prefabPath;
        i.Position   = position;
        i.Rotation   = rotation;
        i.TokenId    = AllocateObjectId();
        i.OwnerId    = PhotonNetwork.player.ID;
        i.ViewIds    = null;
        i.Data       = data;
        return(i);
    }
Exemplo n.º 14
0
    //Instantiation for networked objects
    public void NetInstantiate(string prefabName, int type, Vector3 position, Quaternion rotation, Vector3 localScale)
    {
        //tell the server to tell the other clients to do the same
        InstantiationData data = new InstantiationData();
        data.prefabName = prefabName;
        data.position = position;
        data.localScale = localScale;
        data.rotation = rotation;
        data.type = type;

        
        socket.Emit("instantiate", JsonUtility.ToJson(data));
    }
Exemplo n.º 15
0
    public void Init(InstantiationData data, bool isMine)
    {
        Debug.LogWarning($"[PlayerCoreAdditive] Init isMine?{isMine}");
        this.parent = GetComponent <ITransmissionBase>() as TransmissionBase;

        if (isMine)
        {
            InitLocal();
        }
        else
        {
            InitRemote(data);
        }
    }
Exemplo n.º 16
0
    public static GameObject LocalInstantiate(string prefabPath, Vector3 position, Quaternion rotation, object[] data)
    {
        InstantiationData i = new InstantiationData();

        i.PrefabPath = prefabPath;
        i.Position   = position;
        i.Rotation   = rotation;
        i.PoolType   = PoolType.Local;
        i.TokenId    = AllocateObjectId();
        i.OwnerId    = PhotonNetwork.player.ID;
        i.ViewIds    = null;
        i.Data       = data;

        return(ObjectPoolManager.Instantiate(i));
    }
Exemplo n.º 17
0
    public void RequestRoomObjectManipulation(object data, PhotonMessageInfo info)
    {
        if (!PhotonNetwork.IsMasterClient)
        {
            Debug.LogWarning("[RequestRoomObjectManipulation] Only Master Client can Manipulate RoomObject!");
            return;
        }

        var insData = new InstantiationData(data as object[]);

        //TODO: MC Verify data
        if (insData.tokenType != SyncTokenType.General)
        {
            Debug.LogWarning("[RequestRoomObjectManipulation] Only For Manipulate RoomObject!");
            return;
        }

        if (insData.TryGetValue(InstantiationData.InstantiationKey.objectname, out object objName))
        {
            // Object UUID
            if (!insData.ContainsKey(InstantiationData.InstantiationKey.objectuuid))
            {
                var tokenID = $"ro_{Random.Range(1000, 9999).ToString()}";
                insData[InstantiationData.InstantiationKey.objectuuid.ToString()] = tokenID;
            }

            if (insData.TryGetValue(InstantiationData.InstantiationKey.sceneobject, out object soModification))
            {
                switch ((string)soModification)
                {
                case "create":
                    Debug.LogWarning("[RequestRoomObjectManipulation] Create");
                    itp.RequestSyncToken(insData);
                    break;

                case "destroy":
                    photonView.RPC("RequestLocalObjectManipulation", RpcTarget.Others, insData.ToData() as object);

                    itp.RevokeSyncToken(insData);

                    iosManager.DestroyObject((string)objName, (string)insData["objectuuid"]);

                    Debug.LogWarning($"[RequestRoomObjectManipulation] MC Destroy {insData}");
                    break;
                }
            }
        }
    }
Exemplo n.º 18
0
 public void Init(InstantiationData data)
 {
     if (photonView.Owner == null)
     {
         Debug.Log($"InRoomObject:{photonView.ViewID} OwnedByRoom");
     }
     else if (photonView.IsMine)
     {
         Debug.Log($"I({PhotonNetwork.LocalPlayer.UserId}) Own {photonView.ViewID}" + photonView.Owner.ToStringFull());
     }
     else
     {
         // deal with photonView.InstantiationData
         Debug.Log($"{photonView.ViewID} TryLoadData with data {data.ToString()}");
     }
 }
Exemplo n.º 19
0
    void InitRemote(InstantiationData data)
    {
        Debug.LogWarning($"[PlayerCoreAdditive] InitRemote");

        gameObject.name = "RemotePlayerToken";

        //Based on objName/ objUUID we received...
        if (data.TryGetValue(InstantiationData.InstantiationKey.objectuuid, out object objuuid) &&
            data.TryGetValue(InstantiationData.InstantiationKey.objectname, out object objname))
        {
            // remote one, Create based on ObjectName
            var go = ObjectSupplyManager.Instance.BuildObject((string)objname, (string)objuuid) as GameObject;
            this.parent.RefObject = go;

            go.GetComponent <Player>().Init(data, false, parent);
        }
    }
Exemplo n.º 20
0
    //[Header("RoomObject")]
    void CreateRoomObject(UnityEngine.InputSystem.InputAction.CallbackContext ctx)
    {
        if (ctx.ReadValue <float>() < 0.5)
        {
            return;
        }

        Debug.Log("TryCreateRoomObject");
        var data = new InstantiationData()
        {
            tokenType = SyncTokenType.General
        };

        data[InstantiationData.InstantiationKey.objectname.ToString()]  = "RoomObject";
        data[InstantiationData.InstantiationKey.sceneobject.ToString()] = "create";

        ServiceManager.Instance.networkSystem.InstantiateRoomObject(data);
    }
Exemplo n.º 21
0
    public static GameObject PhotonViewInstantiate(string prefabPath, Vector3 position, Quaternion rotation, object[] data)
    {
        InstantiationData i = InstantiationData(prefabPath, position, rotation, data);

        i.PoolType = PoolType.PhotonView;

        var g = ObjectPoolManager.Instantiate(i);

        PhotonView[] pvs     = g.GetComponents <PhotonView>();
        List <int>   viewIds = new List <int>();

        foreach (PhotonView pv in pvs)
        {
            viewIds.Add(pv.viewID);
        }
        i.ViewIds = viewIds.ToArray();
        ObjectPoolRpcManager.Instantiate(i);
        return(g);
    }
Exemplo n.º 22
0
    public void Init(InstantiationData data, bool isMine, ITransmissionBase tb = null)
    {
        Debug.LogWarning($"ISyncHandlerUser Init isMine?{isMine}");
        insdata = data;

        var    pa   = GetComponent <PersistenceHelper>();
        string uuid = null;

        if (data.TryGetValue(InstantiationData.InstantiationKey.objectuuid, out object val))
        {
            uuid = (string)val;
        }

        //// Local HostPlayer Ask for a TokenHandler
        if (isMine)
        {
            SetupTokenHandler();
            pa.Init(uuid);
        }
        else
        {
            pa.Init(
                uuid,
                () => { creator.RemoveFromDict(uuid); },
                tb as TransmissionBase
                );

            if (data.TryGetValue(InstantiationData.InstantiationKey.objectpersist, out val))
            {
                pa.Setup((int)val);
            }
        }

        //RaiseEventHelper.instance.Register(new NetworkLayer.RoomEventRegistration()
        //{
        //    key = "Emit",
        //    OnRoomEvent = EmitPropToLocal,
        //    cachingOption = NetworkLayer.EventCaching.DoNotCache,
        //    receivers = NetworkLayer.EventTarget.All
        //});
    }
Exemplo n.º 23
0
        public void TestInstantiationDataSerialzation()
        {
            var data = new InstantiationData(
                new object[2] {
                SyncTokenType.Player,
                new List <string> {
                    "syncPos", "True", "syncRot", "False"
                }
            });

            Debug.Log($"data:{data.ToString()} {data.Count} {data.ToData().Length}");

            var ty = (SyncTokenType)data.ToData()[0];

            Debug.Log($"data SyncTokenType:{ty}");
            var li = (List <string>)data.ToData()[1];

            Debug.Log($"data List<string>:{li}");
            foreach (var ll in li)
            {
                Debug.Log($"<string>:{ll}");
            }

            var data2 = new InstantiationData(data.ToData());

            Debug.Log($"data2 Objectify:{data2.ToString()} {data2.Count} {data2.ToData().Length}");

            var data3 = InstantiationData.Build(data.ToString());

            data3.Add("k3", "v3");
            Debug.Log($"data3 Stringify:{data3.ToString()} {data3.Count} {data3.ToData().Length}");

            var data4 = InstantiationData.Build(SyncTokenType.Player);

            data4.Add("k1", "v1");
            data4.Add("k2", "v2");
            data4.Add("k3", "v3");
            data4.Add("k4", "v4");
            Debug.Log($"data4 Stringify:{data4.ToString()} {data4.Count} {data4.ToData().Length}");
        }
Exemplo n.º 24
0
    public void ManualBuildSyncTokenOnEvent(EventData photonEvent)
    {
        byte eventCode = photonEvent.Code;

        if ((RaiseEvnetCode)eventCode == RaiseEvnetCode.CustomManualInstantiationEventCode)
        {
            var instData = new InstantiationData((object[])photonEvent.CustomData);
            var tok      = PrefabPoolManager.Instance.Instantiate("TransmissionToken", Vector3.zero, Quaternion.identity);//Instantiate(transmissionTokenPrefab);

            //setup based on InstantiationData

            PhotonView photonView = tok.GetComponent <PhotonView>();
            if (instData.TryGetValue("viewID", out object vid))
            {
                photonView.ViewID = (int)vid;
            }
            else
            {
                Debug.LogWarning($"ViewID Missing!");
            }
        }
    }
Exemplo n.º 25
0
    //from the server: a networked game object has been instantiated
    public void OnNetInstantiate(SocketIOEvent e)
    {   
        //this is the data coming from the server as JSON, it needs to be parses into
        //usable variables according to a serializable class defined at the bottom of this script
        InstantiationData data = JsonUtility.FromJson<InstantiationData>(e.data.ToString());

        //print("Net instantiate " + data.uniqueId+" "+ data.position);

        //see if there is already an object with that id
        GameObject o = GameObject.Find(data.uniqueId);
        
        //if not instantiate on the scene
        if(o == null)
           o = Instantiate(Resources.Load(data.prefabName) as GameObject);

        
        o.transform.position = data.position;
        o.transform.localScale = data.localScale;
        o.transform.rotation = data.rotation;
        o.name = data.uniqueId;
        

        //fetch or add the netcomponent object
        NetObject netObj = o.GetComponent<NetObject>();

        if (netObj == null)
        {
            netObj = o.AddComponent<NetObject>();
        }

        netObj.type = data.type;
        netObj.owner = data.owner;
        netObj.prefabName = data.prefabName;
        
        Net.objects[data.uniqueId] = netObj;

       netObj.OnVariableInit();
    }
Exemplo n.º 26
0
    public void RequestLocalObjectManipulation(object data, PhotonMessageInfo info)
    {
        var insData = new InstantiationData(data as object[]);

        if (insData.tokenType != SyncTokenType.General)
        {
            Debug.LogWarning("[RequestLocalObjectManipulation] Only For Manipulate Local RoomObject!");
            return;
        }

        if (insData.TryGetValue("localobject", out object objName))
        {
            if (!insData.ContainsKey("objectuuid"))
            {
                return;
            }

            if (insData.TryGetValue("sceneobject", out object modifyword) && (string)modifyword == "Destroy")
            {
                iosManager.DestroyObject((string)objName, (string)insData["objectuuid"]);
            }
        }
    }
Exemplo n.º 27
0
    public void Init(InstantiationData data, bool isMine)
    {
        Debug.LogWarning("[RoomCoreAdditive] Init");
        this.parent = GetComponent <TransmissionBase>();

        if (!osa)
        {
            osa = GetComponent <OwnershipSubAdditive>();
        }

        osa.Init(data);

        //
        if (data.TryGetValue(InstantiationData.InstantiationKey.objectuuid, out object objUUID) &&
            data.TryGetValue(InstantiationData.InstantiationKey.objectname, out object objName))
        {
            var obj = ObjectSupplyManager.Instance.BuildObject((string)objName, (string)objUUID);
            if (obj == null)
            {
                Debug.LogError("[Init] Fail to BuildObject");
                return;
            }

            var go = obj as GameObject;
            parent.RefObject = go;
            go.transform.SetParent(ServiceManager.Instance.networkSystem.RoomObjectParent);

            // link between Token and TokenUser
            var tu = go.GetComponent <ISyncHandlerUser>();
            tu?.Init(data, false, parent);

            Debug.LogWarning("[Init] IOwnershipInteractable");
            var oi = go.GetComponent <IOwnershipInteractable>();
            oi.TargetObject = gameObject as object;
        }
    }
Exemplo n.º 28
0
    public object RequestSyncToken(InstantiationData dataToSend)
    {
        if (!PhotonNetwork.InRoom)
        {
            Debug.LogWarning($"RequestSyncToken NotInRoom");
            return(null);
        }

        GameObject go = null;

        switch (dataToSend.tokenType)
        {
        case SyncTokenType.Player:
            Debug.Log($"PhotonNetwork.Instantiate RequestSyncToken");
            go = PhotonNetwork.Instantiate("Token/TransmissionToken", Vector3.zero, Quaternion.identity, 0, dataToSend.ToData());
            break;

        default:
            if (PhotonNetwork.IsMasterClient)
            {
                go = PhotonNetwork.InstantiateRoomObject("Token/TransmissionToken", Vector3.zero, Quaternion.identity, 0, dataToSend.ToData());
            }
            else
            {
                Debug.LogWarning($"Non MC Cannot InstantiateRoomObject");
            }
            break;
        }

        if (go == null)
        {
            Debug.LogWarning($"Issuing Null GameObject");
        }

        return(go);
    }
Exemplo n.º 29
0
 public InstantiationData GetClone()
 {
     InstantiationData clone = new InstantiationData();
     clone.RandomSphereUnit = this.RandomSphereUnit;
     clone.RandomPositionInsideSphere = this.RandomPositionInsideSphere;
     clone.WorldOffset = this.WorldOffset;
     clone.rotationOfInstance = this.rotationOfInstance;
     clone.specifiedQuaterion = this.specifiedQuaterion;
     return clone;
 }
Exemplo n.º 30
0
        // PhotonNetwork.OnEvent
        public override void OnRaiseEvent(IRaiseEventCallInfo info)
        {
            var tickCount = Environment.TickCount;

#if true
            switch (info.Request.EvCode)
            {
            case PunEvent.Instantiation: {
                var data = new InstantiationData();
                if (!data.Deserialize(info.Request))
                {
                    break;
                }
                this.PrefabHolder.Instantiate(info.ActorNr, data);
                break;
            }

            case PunEvent.Destroy: {
                if (!(info.Request.Data is Hashtable data))
                {
                    break;
                }
                if (!data.TryGetValue((byte)0, out int viewId))
                {
                    break;
                }
                this.PrefabHolder.Destroy(viewId);
                break;
            }

            case PunEvent.DestroyPlayer:
            case EventCode.Leave:     // ???
                // TODO
                break;

            case PunEvent.RPC: {
                if (!(info.Request.Data is Hashtable data))
                {
                    break;
                }

                if (!data.TryGetValue((byte)0, out int viewId))
                {
                    break;
                }
                var prefix = data.TryGetValue <short>((byte)1) ?? 0;

                if (!data.TryGetValue((byte)2, out int timeStamp))
                {
                    break;
                }

                var idx = data.TryGetValue <byte>((byte)5);
                if (!idx.HasValue)
                {
                    if (!data.TryGetValue((byte)3, out string methodName))
                    {
                        break;
                    }
                }

                var args = data.TryGetValue <object[]>((byte)4) ?? null;

                // skillRPCAsync
                if (idx != 6)
                {
                    break;
                }

                var i = 0;
                if (!args.TryRead(out byte beam, ref i))
                {
                    break;
                }
                if (!args.TryRead(out Vector2 pos_xz, ref i))
                {
                    break;
                }
                if (!args.TryRead(out float angle_y, ref i))
                {
                    break;
                }

                if (!this.Master.Skill.TryGetValue(beam, out var skill))
                {
                    break;
                }

                if (beam == 0 && this.PrefabHolder.TryGetValue(viewId, out var pv))
                {
                    pv.IsDash = true;
                    var rad = angle_y * Math.PI / 180;
                    pv.DashDestPos = pos_xz + (skill.Radius * new Vector2((float)Math.Sin(rad), (float)Math.Cos(rad)));
                    this.PluginHost.CreateOneTimeTimer(() => {
                            pv.IsDash = false;
                        }, skill.DelayTime);

                    break;
                }

                this.PluginHost.CreateOneTimeTimer(() => {
                        var hitTarget = this.PrefabHolder.Where(e => e.Key != viewId)
                                        .Where(e => !e.Value.IsDash && Collider.IsHit(skill, pos_xz, angle_y, e.Value.GetCurrentPosition()));

                        foreach (var target in hitTarget)
                        {
                            var table = new Hashtable {
                                { (byte)0, target.Key },
                                { (byte)2, Environment.TickCount },
                                { (byte)5, (byte)5 },
                            };
                            this.PluginHost.RaiseEvent(PunEvent.RPC, table, sendParams: new SendParameters {
                                Unreliable = false
                            });
                        }
                    }, skill.DelayTime);

                break;
            }

            case PunEvent.SendSerialize:
            case PunEvent.SendSerializeReliable: {
                var data = new PhotonSerializeViewData(this.PrefabHolder);
                if (!data.Deserialize(info.Request))
                {
                    this.PluginHost.LogError("Deserialize ERROR");
                    break;
                }
                this.PluginHost.LogInfo($"TIME: SV {tickCount}, PKT {data.ServerTimestamp}");

                foreach (var e in data.PhotonViews)
                {
                    if (!this.PrefabHolder.TryGetValue(e.ViewID, out var value))
                    {
                        continue;
                    }
                    value.Add(e);
                }

                break;
            }

            case PunEvent.OwnershipTransfer: {
                if (!(info.Request.Data is int[] data))
                {
                    break;
                }
                var viewID   = data[0];
                var playerID = data[1];
                break;
            }
            }
#endif
            base.OnRaiseEvent(info);
        }
Exemplo n.º 31
0
    //somebody joined (including me)
    public void OnPlayerJoin(SocketIOEvent e)
    {
        //read the data (just the id)
        AvatarData data = JsonUtility.FromJson<AvatarData>(e.data.ToString());
        Debug.Log("[SocketIO] Player Connected: " + data.id + " " + data.nickName);

        //add a player object to my dictionary
        Player p = new Player();
        p.id = data.id;
        p.nickName = data.nickName;
        p.DNA = data.DNA;

        //is it me?
        if (data.id == socket.SocketID)
        {

            //close the menu, change the camera
            if(gameMenu != null)
            {
                gameMenu.CloseMenu();
            }

            if (MyAvatarPrefabName != "")
            {
                print("I officially join the game as " + data.nickName);
                
                Net.playing = true;
                
                //do I have to create an avatar?
                Net.myId = socket.SocketID;

                //just in case
                if (myAvatar != null)
                    Destroy(myAvatar);

                //instantiate on the scene
                myAvatar = Instantiate(Resources.Load(MyAvatarPrefabName) as GameObject);
                myAvatar.name = socket.SocketID;


                //fetch or add the netcomponent object
                NetObject netObj = myAvatar.GetComponent<NetObject>();

                if (netObj == null)
                    netObj = myAvatar.AddComponent<NetObject>();

                Net.objects[socket.SocketID] = netObj;
                netObj.owner = socket.SocketID;
                netObj.type = Net.TEMPORARY;
                netObj.prefabName = MyAvatarPrefabName;

                //other client should instantiate a different avatar without controls
                //and camera but if it's not provided that's fine too
                if (OtherAvatarPrefabName == "")
                    OtherAvatarPrefabName = MyAvatarPrefabName;

                //tell the server to tell the other clients to make a puppet avatar
                InstantiationData iData = new InstantiationData();
                iData.prefabName = OtherAvatarPrefabName;
                iData.uniqueId = socket.SocketID;
                iData.type = Net.TEMPORARY;

                //instantiate all avatars around 0,0 by default
                //this is game logic and can be changed here on the server or on the netObject upon instantiation 
                Vector2 spawnRange = UnityEngine.Random.insideUnitCircle * spawnRadius;
                myAvatar.transform.position = iData.position = new Vector3(spawnPoint.x + spawnRange.x, spawnPoint.y, spawnPoint.z + spawnRange.y);
                myAvatar.transform.localScale = iData.localScale = Vector3.one;
                myAvatar.transform.rotation = iData.rotation = Quaternion.identity;

                print("Instantiation " + myAvatar.transform.position);
                socket.Emit("instantiateAvatar", JsonUtility.ToJson(iData));

            }//end avatar creation

            //find all the static netObjects - they are the ones in the Unity scene with a netObject attached
            //their uniqueId is their gameObject name 
            NetObject[] sceneObjects = FindObjectsOfType(typeof(NetObject)) as NetObject[];

            foreach (NetObject item in sceneObjects)
            {
                if (item.owner == "")
                {
                    Debug.Log(item.gameObject.name + " is a netObject without an owner in the scene, make sure the server knows about it");

                    //if the object is orphan assign ownership to me and make sure the server knows about it
                    //this should happen only to the first user logging after the server starts
                    InstantiationData iData = new InstantiationData();
                    iData.prefabName = item.gameObject.name;
                    iData.uniqueId = item.gameObject.name;
                    iData.position = item.transform.position;
                    iData.localScale = item.transform.localScale;
                    iData.rotation = item.transform.rotation;
                    iData.netVariables = item.netVariables;
                    iData.type = Net.PERSISTENT;
                    //item.OnVariableInit();
                    //if the server knows about it there will be no followup
                    socket.Emit("registerObject", JsonUtility.ToJson(iData));

                }
            }


        }//is it me?

        //add the player object to the players dictionary
        Net.players[p.id] = p;

    }