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);
                }
            }
        }
    }
Example #2
0
    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;
     }
 }