// host requests the server to broadcast state changes
        public Message HostStateChange(HostStateChangeMessage message)
        {
            Player currentPlayer = _websocket.GetCurrentSessionPlayer();

            Assert.ThrowIfNull(currentPlayer, "requires a user session", _websocket);

            var outgoingMessage = new HostStateChangedMessage
            {
                Payload = message.Payload
            };

            _websocket.Broadcast(outgoingMessage, currentPlayer.GameInstanceRef, meToo: false);

            return(null);
        }
示例#2
0
 public void OnStateFluxHostStateChanged(HostStateChangedMessage message)
 {
 }
示例#3
0
        // called when the game is guest (not hosting), contains state changes broadcast from the host
        public void OnHostStateChanged(HostStateChangedMessage message)
        {
            if (stateFluxClient.isHosting)
            {
                DebugLog($"Host should not be receiving host state change messages! (Error)");
                return;
            }

            foreach (var change in message.Payload.Changes)
            {
                bool found = trackingMap.TryGetValue(change.ObjectID, out ChangeTracker tracker);

                if (change.Event == ChangeEvent.Created)
                {
                    if (found)
                    {
                        DebugLog($"Host has asked us to create object {change.ObjectID} that already exists. (Skipping)");
                        continue;
                    }

                    var createdGameObject = StateCreateGameObject(change, false);
                    trackingMap[change.ObjectID] = new ChangeTracker {
                        gameObject = createdGameObject, create = change
                    };
                    //DebugLog($"Created tracker for {change.TypeID} - {change.ObjectID}.", true);
                }
                else if (change.Event == ChangeEvent.Destroyed)
                {
                    if (!found)
                    {
                        DebugLog($"Host has asked us to destroy object {change.ObjectID} but it does not exist. (Skipping)", true);
                        continue;
                    }


                    if (tracker.gameObject == null) // unity supposedly overrides the behavior of == to return null for destroyed objects, even if they haven't been c# deleted yet
                    {
                        DebugLog($"Host has asked us to destroy object {change.ObjectID} but it has already been destroyed. (Skipping)");
                    }
                    else
                    {
                        //DebugLog($"Destroying game object for {change.ObjectID}. (Should call OnTrackedObjectDestroy)");
                        GameObject.Destroy(tracker.gameObject);
                        //DebugLog($"Destroyed game object for {change.ObjectID}. (Should have called OnTrackedObjectDestroy)");
                    }
                }
                else if (change.Event == ChangeEvent.Updated)
                {
                    if (!found)
                    {
                        var createdGameObject = StateCreateGameObject(change, false);
                        tracker = trackingMap[change.ObjectID] = new ChangeTracker {
                            gameObject = createdGameObject, update = change
                        };
                        //DebugLog($"Created tracker for {change.TypeID} - {change.ObjectID}.", true);
                    }

                    if (change?.Transform?.Pos == null)
                    {
                        DebugLog($"Host has asked us to update object {change.ObjectID} but it's transform pos does not exist. (Skipping)");
                        continue;
                    }

                    if (tracker.gameObject == null) // unity supposedly overrides the behavior of == to return null for destroyed objects, even if they haven't been c# deleted yet
                    {
                        DebugLog($"Host has asked us to update object {change.ObjectID} but it has already been destroyed. (Skipping)", true);
                        continue;
                    }

                    var tracked = tracker.gameObject.GetComponent <StateFluxTracked>();
                    if (tracked != null)
                    {
                        tracked.SetGoal(change.Transform.Pos.Convert3d());
                    }

                    //tracker.gameObject.transform.position = change.Transform.Pos.Convert3d();
                    tracker.gameObject.transform.eulerAngles = new Vector3(0, 0, change.Transform.Rot);
                    tracker.gameObject.transform.localScale  = new Vector2(change.Transform.Scale, change.Transform.Scale);
                    Rigidbody2D rb = tracker.gameObject.GetComponent <Rigidbody2D>();
                    if (rb != null)
                    {
                        rb.velocity        = change.Transform.Vel.Convert2d();
                        rb.angularVelocity = change.Transform.RotV;
                    }
                }
            }
        }
示例#4
0
 // called when the game is guest (not hosting), contains state changes broadcast from the host
 public void OnStateFluxHostStateChanged(HostStateChangedMessage message)
 {
     gameObjectTracker.OnHostStateChanged(message);
 }