private IEnumerator <YieldInstruction> Update() { NetworkMessageMultiStream stream = null; while (stream == null) { yield return(new WaitForEndOfFrame()); lock (this){ stream = this.stream; } } task.SetResult(stream); while (!cancellation.IsCancellationRequested) { yield return(new WaitForEndOfFrame()); lock (this){ while (scheduled.Count > 0) { var action = scheduled.Dequeue(); action?.Invoke(parent); } } } }
async void Start() { inbound = await NetworkApi.AcceptInbound(this, 9080); inbound.Recieve.Add(OnInBoundRecieve); outbound = NetworkApi.OpenOutbound(9080, "127.0.0.1", this); outbound.Recieve.Add(OnOutboundRecieve); }
public async Task <int> StartNetworked(Func <string, bool> acceptPlayer, Action <string, int> handlePlayerExit, MonoBehaviour parent, DemoSettingsServer settings) { this.handlePlayerExit = handlePlayerExit; parent.StartCoroutine(Update()); var spawnPoint = DemoSettings.GetSpawnPoint(); var platformerConfig = DemoSettings.GetPlatformCharacterConfig(); networkStream = await NetworkApi.AcceptInbound(parent, settings.port); networkStream.Recieve.Add((opCode, guid, message) => { if (opCode == OpCode.PLAYER_JOIN) { var joinMessage = (PlayerJoinMessage)message; acceptPlayer(joinMessage.playerSessionId); var onCancel = networkStream.Recieve.GetConnectionCancellation(guid); onCancel.Token.Register(() => { lock (abandonedPlayers){ abandonedPlayers.Enqueue(guid); } }); playerGuids.Add(guid); var serverRep = GameObject.Instantiate(settings.playerPrefab, spawnPoint, Quaternion.identity); var serverRepComp = serverRep.GetComponent <PlayerCompServer>(); var serverRepRecieve = serverRepComp.RegisterNetwork(guid, (toSendCode, toSendMessage) => { playerGuids.ForEach((targetGuid) => { try{ networkStream.Send(toSendCode, targetGuid, toSendMessage); } catch (Exception e) { Debug.Log("failed sending to player: " + e.Message); } }); return(1); }, platformerConfig, settings); ServerRepData repData = new ServerRepData(); repData.comp = serverRepComp; repData.session = joinMessage.playerSessionId; repData.recieve = serverRepRecieve; repData.guid = guid; serverReps[guid] = repData; var acceptMsg = new PlayerAcceptMessage(); acceptMsg.trustDistance = settings.trustDistance; playerGuids.ForEach((existingPlayer) => { acceptMsg.playerGuid = guid; var isSendingToNewlyAccepted = PlayerGuidUtil.IsFor(acceptMsg, existingPlayer); acceptMsg.playerSessionId = isSendingToNewlyAccepted ? joinMessage.playerSessionId : string.Empty; networkStream.Send(OpCode.PLAYER_ACCEPTED, existingPlayer, acceptMsg); if (!isSendingToNewlyAccepted) { acceptMsg.playerSessionId = string.Empty; acceptMsg.playerGuid = existingPlayer; networkStream.Send(OpCode.PLAYER_ACCEPTED, guid, acceptMsg); } }); } else { if (serverReps.ContainsKey(guid)) { serverReps[guid].recieve(opCode, message); } } return(1); }); return(1); }
public void AcceptStream(NetworkMessageMultiStream stream) { lock (this){ this.stream = stream; } }