// 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); }
public void OnStateFluxHostStateChanged(HostStateChangedMessage message) { }
// 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; } } } }
// called when the game is guest (not hosting), contains state changes broadcast from the host public void OnStateFluxHostStateChanged(HostStateChangedMessage message) { gameObjectTracker.OnHostStateChanged(message); }