public void EnqueuePosChangeAsHost(string objectId, Vector3 pos) { if (trackingMap.TryGetValue(objectId, out ChangeTracker tracker)) { //Debug.Log($"EnqueuePosChangeAsHost: found tracker object for {objectId}"); Change2d change = tracker.update; if (tracker.update == null) { tracker.update = new Change2d(); tracker.update.ObjectID = objectId; tracker.update.Transform = new Transform2d(); } if (change.Transform.Pos.X != pos.x || change.Transform.Pos.Y != pos.y) { //DebugLog($"EnqueuePosChangeAsHost: position changeds for {objectId}, so queueing...", true); change.Event = ChangeEvent.Updated; change.Transform.Pos = pos.Convert2d(); tracker.dirty = true; } } else { Debug.Log($"EnqueuePosChangeAsHost: failed to track {objectId}"); } }
// loads the prefab named the same as change.TypeID, applies caption, color & position public GameObject StateCreateGameObject(Change2d change, bool asHost) { var prefabPath = $"{change.TypeID}"; //DebugLog($"StateCreateGameObject is attempting to instantiate prefab '{prefabPath}' for '{change.ObjectID}'", true); var obj = (GameObject)GameObject.Instantiate(Resources.Load(prefabPath)); if (obj == null) { DebugLog($"StateCreateGameObject failed to instantiate prefab '{prefabPath}'", true); return(null); } obj.name = change.ObjectID; if (!String.IsNullOrEmpty(change.ParentID)) { GameObject parent = GameObject.Find(change.ParentID); obj.transform.parent = parent?.transform; //DebugLog($"Parented {change.ParentID}"); } string side = asHost ? "hostObject" : "guestObject"; if (change.Attributes.Color != null) { SetObjectColor(obj, change.Attributes.Color); } SetObjectText(obj, $"{side}:{change.ObjectID}"); if (!asHost) { var rigidbody = obj.GetComponent <Rigidbody2D>(); GameObject.Destroy(rigidbody); //if (rigidbody != null) //{ // // guest objects don't feel gravity // //rigidbody.gravityScale = 0; //} // guest objects don't destroy themselves, so remove KillMeOverTime var killMeOverTime = obj.GetComponent <KillMeOverTime>(); if (killMeOverTime != null) { GameObject.Destroy(killMeOverTime); } } StateFluxTracked stateFluxTracked = obj.AddComponent <StateFluxTracked>(); stateFluxTracked?.SetListener(this); obj.transform.position = change.Transform.Pos.Convert3d(); obj.transform.eulerAngles = new Vector3(0, 0, change.Transform.Rot); obj.transform.localScale = new Vector2(change.Transform.Scale, change.Transform.Scale); Rigidbody2D rb = obj.GetComponent <Rigidbody2D>(); if (rb != null) { rb.velocity = change.Transform.Vel.Convert2d(); rb.angularVelocity = change.Transform.RotV; } return(obj); }
public void DemoCommands() { _currentPlayer = JsonConvert.DeserializeObject <PlayerClientInfo>(File.ReadAllText(CurrentPlayerFilename)); Console.WriteLine($"Player has saved session as {_currentPlayer.Name} with sessionId = {_currentPlayer.SessionId}"); _webSocket = new WebSocket(_url); _webSocket.OnMessage += (object source, MessageEventArgs e) => { string msgTxt = e.Data.ToString(); Message responseMessage = JsonConvert.DeserializeObject <Message>(msgTxt); if (responseMessage.MessageType == MessageTypeNames.ChatSaid) { OnChatSaid(JsonConvert.DeserializeObject <ChatSaidMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.PlayerListing) { OnPlayerListing(JsonConvert.DeserializeObject <PlayerListingMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.GameInstanceCreated) { OnGameInstanceCreated(JsonConvert.DeserializeObject <GameInstanceCreatedMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.JoinedGameInstance) { OnJoinedGameInstance(JsonConvert.DeserializeObject <JoinedGameInstanceMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.RequestFullState) { OnRequestFullState(JsonConvert.DeserializeObject <RequestFullStateMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.StateChanged) { OnStateChanged(JsonConvert.DeserializeObject <StateChangedMessage>(msgTxt)); } else if (responseMessage.MessageType == MessageTypeNames.ServerError) { OnServerError(JsonConvert.DeserializeObject <ServerErrorMessage>(msgTxt)); } }; try { _webSocket.SetCookie(new Cookie(MessageConstants.SessionCookieName, _currentPlayer.SessionId)); _webSocket.Connect(); } catch (Exception e) { File.Delete(App.CurrentPlayerFilename); _currentPlayer = null; Console.WriteLine(e.Message); } while (_currentPlayer != null) { try { Console.WriteLine("Enter a command:"); string command = Console.ReadLine(); if (command.StartsWith("say ", true, null)) { ChatSayMessage chatSayMessage = new ChatSayMessage(); chatSayMessage.say = command.Substring(4); _webSocket.Send(JsonConvert.SerializeObject(chatSayMessage)); } else if (command.StartsWith("list", true, null)) { PlayerListMessage playerListMessage = new PlayerListMessage(); _webSocket.Send(JsonConvert.SerializeObject(playerListMessage)); } else if (command.StartsWith("rename", true, null)) { string newName = command.Substring("rename".Length + 1); PlayerRenameMessage playerRenameMessage = new PlayerRenameMessage(); playerRenameMessage.Name = newName; _currentPlayer.Name = newName; _webSocket.Send(JsonConvert.SerializeObject(playerRenameMessage)); File.WriteAllText(CurrentPlayerFilename, JsonConvert.SerializeObject(_currentPlayer)); } else if (command.StartsWith("create", true, null)) { string[] parts = command.Split(' '); CreateGameInstanceMessage createGameInstanceMessage = new CreateGameInstanceMessage(); createGameInstanceMessage.GameName = parts[1]; createGameInstanceMessage.InstanceName = parts[2]; _webSocket.Send(JsonConvert.SerializeObject(createGameInstanceMessage)); } else if (command.StartsWith("join", true, null)) { string[] parts = command.Split(' '); JoinGameInstanceMessage joinGameInstanceMessage = new JoinGameInstanceMessage(); joinGameInstanceMessage.GameName = parts[1]; joinGameInstanceMessage.InstanceName = parts[2]; _webSocket.Send(JsonConvert.SerializeObject(joinGameInstanceMessage)); } else if (command.StartsWith("sync", true, null)) { RequestFullStateMessage message = new RequestFullStateMessage(); _webSocket.Send(JsonConvert.SerializeObject(message)); } else if (command.StartsWith("move", true, null)) { StateChangeMessage message = new StateChangeMessage(); StateChange batch = new StateChange(); batch.changes = new List <Change2d>(); Random rnd = new Random(); int randomCount = rnd.Next() % 100; for (int index = 0; index < randomCount; index++) { Change2d change = new Change2d(); change.Event = ChangeEvent.Created; change.ObjectID = rnd.Next().ToString(); change.Transform = new Transform2d { Pos = new Vector2d { X = rnd.NextDouble() * 100.0, Y = rnd.NextDouble() % 100.0 }, Vel = new Vector2d { X = rnd.NextDouble() % 100.0, Y = rnd.NextDouble() % 100.0 }, Rot = rnd.NextDouble() * 380.0, Scale = 1.0 }; batch.changes.Add(change); } message.Payload = batch; _webSocket.Send(JsonConvert.SerializeObject(message)); } else if (command.StartsWith("help", true, null)) { Console.WriteLine("FIXME: add a list of commands"); } else { Console.WriteLine("unknown command"); } } catch (Exception e) { File.Delete(App.CurrentPlayerFilename); this._currentPlayer = null; // causes re-login Console.WriteLine(e.Message); } } try { _webSocket.Close(); _webSocket = null; } catch (Exception e) { File.Delete(App.CurrentPlayerFilename); this._currentPlayer = null; // causes re-login Console.WriteLine(e.Message); } }