// Update is called once per frame void Update() { if (spawnQueue.Count > 0) { lock (spawnQueueLock) { SpawnEntityPacket packet = spawnQueue.Dequeue(); GameObject entity = Instantiate(entityPrefab, new Vector3(packet.X, packet.Y), Quaternion.identity); entity.GetComponent <NetworkEntity>().Setup(packet.EntityId, packet.IsSelf, lobbyClients.Where(x => x.Name == packet.Owner).SingleOrDefault()); entityMap.Add(packet.EntityId, entity); Debug.Log($"Spawned entity: {packet.EntityId} - Self: {packet.IsSelf}"); GameObject.Find("RoomManager").GetComponent <RoomManager>().players++; } } if (relocationQueue.Count > 0) { lock (relocLock) { RelocationPacket packet = relocationQueue.Dequeue(); entityMap[packet.EntityId].transform.position = new Vector3(packet.X, packet.Y); } } if (dropQueue.Count > 0) { lock (dropLock) { RemoveEntityPacket packet = dropQueue.Dequeue(); Destroy(entityMap[packet.EntityId]); entityMap.Remove(packet.EntityId); } } if (visibilityQueue.Count > 0) { lock (visibilityLock) { VisibilityPacket packet = visibilityQueue.Dequeue(); entityMap[packet.EntityId].GetComponent <SpriteRenderer>().enabled = packet.Visible; } } if (!loadingScene && currentScene.name != requestedScene) { loadingScene = true; Debug.Log($"Loading '{requestedScene}' from '{currentScene.name}'"); SceneManager.LoadScene(requestedScene); currentScene = SceneManager.GetSceneByName(requestedScene); loadingScene = false; } if (allLoaded) { allLoaded = false; GameObject.Find("RoomManager").GetComponent <RoomManager>().AllLoaded(); } if (allFinished) { allFinished = false; GameObject.Find("RoomManager").GetComponent <RoomManager>().AllFinished(); } }
void HandleServerComm(object server) { TcpClient tcpClient = (TcpClient)server; serverStream = tcpClient.GetStream(); connected = true; Debug.Log($"Connected to server on {tcpClient.Client.RemoteEndPoint}"); byte[] message = new byte[4096]; int bytesRead; while (true) { try { Debug.Log("Waiting for server"); //blocks until the server sends a message bytesRead = serverStream.Read(message, 0, 4096); } catch (Exception e) { Debug.LogError($"ERROR: {e.Message}"); break; } if (bytesRead == 0) { Debug.LogWarning("Lost connection to server"); break; } try { string formattedData = FormatJsonString(Encoding.UTF8.GetString(message)); Debug.Log(formattedData); JObject json = JObject.Parse(formattedData); if (!Enum.TryParse(json["type"].ToString(), out PacketType type)) { Console.WriteLine("Invalid message received"); continue; } switch (type) { case PacketType.Disconnect: Debug.LogWarning($"Disconnected from host with message: {json["reason"].ToString()}"); break; case PacketType.LobbyState: requestedScene = "Lobby"; lobbyClients = JsonConvert.DeserializeObject <LobbyClient[]>(json["players"].ToString()); break; case PacketType.Start: requestedScene = "Game 1"; break; case PacketType.SpawnEntity: SpawnEntityPacket SpawnPacket = new SpawnEntityPacket(int.Parse(json["entityId"].ToString()), json["owner"].ToString(), float.Parse(json["x"].ToString()), float.Parse(json["y"].ToString()), bool.Parse(json["isSelf"].ToString())); lock (spawnQueueLock) spawnQueue.Enqueue(SpawnPacket); break; case PacketType.AllLoaded: allLoaded = true; break; case PacketType.RemoveEntity: RemoveEntityPacket removePacket = new RemoveEntityPacket(int.Parse(json["entityId"].ToString())); lock (dropLock) dropQueue.Enqueue(removePacket); break; case PacketType.Relocation: Vector3 newPosition = new Vector3(float.Parse(json["x"].ToString()), float.Parse(json["y"].ToString())); RelocationPacket relocPacket = new RelocationPacket(int.Parse(json["entityId"].ToString()), newPosition); lock (relocLock) relocationQueue.Enqueue(relocPacket); break; case PacketType.Visibility: VisibilityPacket visibilityPacket = new VisibilityPacket(int.Parse(json["entityId"].ToString()), bool.Parse(json["visible"].ToString())); lock (visibilityLock) visibilityQueue.Enqueue(visibilityPacket); break; case PacketType.AllFinished: scores = json["scores"].ToObject <Dictionary <string, TimeStamp> >(); allFinished = true; break; default: Debug.LogWarning("Invalid packet type received"); continue; } } catch (Exception e) { Debug.LogException(e); continue; } } Disconnect(); }