コード例 #1
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;
                }
            }
        }
    }
コード例 #2
0
 public void RevokeSyncToken(InstantiationData insData)
 {
     if (insData.TryGetValue(InstantiationData.InstantiationKey.sceneid, out object sceneid))
     {
         RevokeSyncToken((int)sceneid);
     }
 }
コード例 #3
0
 public void Init(InstantiationData data, bool isMine, ITransmissionBase itb)
 {
     instData = data;
     if (data.TryGetValue(InstantiationData.InstantiationKey.objectuuid, out object uuid))
     {
         objectUUID = (string)uuid;
     }
 }
コード例 #4
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);
        }
    }
コード例 #5
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
        //});
    }
コード例 #6
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"]);
            }
        }
    }
コード例 #7
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;
        }
    }
コード例 #8
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!");
            }
        }
    }
コード例 #9
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);
        }