示例#1
0
    public void RelayConfirmed(int uid)
    {
        //If someone gets back to us late, we ignore them.
        if (CurrentState == ConnectionStateMachine.RELAY_SEARCH)
        {
            //Disconnect the previous relay
            //If it's even still there
            if (networking.SignaledPeers.ContainsKey(relayUID))
            {
                TryDisconnect(networking.SignaledPeers[relayUID], nameof(ConnectionLost), this, nameof(RelayLost));
            }

            //swap to new relay
            relayUID = uid;

            networking.SignaledPeers[relayUID].Connect(nameof(ConnectionLost), this, nameof(RelayLost));
            if (initiator)
            {
                PeerConnection.CreateOffer();
            }

            CurrentState = ConnectionStateMachine.RELAY;
            GD.Print("RELAY CONFIRMED");
            Poll();
        }
    }
示例#2
0
 public void Construct(ServiceProvider provider, ConnectionStateMachine connMachine, UIManager uiManager)
 {
     _netManager   = provider.networkManager;
     _netDiscovery = provider.networkDiscovery;
     _connMachine  = connMachine;
     _uiManager    = uiManager;
 }
示例#3
0
 public void Construct(ConnectionStateMachine connManager, ServiceProvider provider, UIManager uiManager, LobbyManager lobbyManager)
 {
     _connManager    = connManager;
     _networkManager = provider.networkManager;
     _uiManager      = uiManager;
     _lobbyManager   = lobbyManager;
 }
示例#4
0
    //Networking is basically a singleton.
    public SignaledPeer(int _UID, Networking networking, ConnectionStateMachine startingState, System.Timers.Timer _PollTimer, bool _initiator)
    {
        UID                = _UID;
        this.networking    = networking;
        CurrentState       = startingState;
        initiator          = _initiator;
        PollTimer          = _PollTimer;
        PollTimer.Elapsed += Poll;

        PeerConnection = new WebRTCPeerConnection();
        PeerConnection.Connect("session_description_created", this, "_OfferCreated");
        PeerConnection.Connect("ice_candidate_created", this, "_IceCandidateCreated");
        PeerConnection.Initialize(RTCInitializer);

        //Setting up the voting mechanism.
        PackedScene slushScene = GD.Load <PackedScene>("res://addons/PurePeerSignaling/SlushNode.tscn");

        slushNode      = (SlushNode)slushScene.Instance();
        slushNode.Name = UID.ToString();
        networking.GetNode("SlushNodes").AddChild(slushNode);
        slushNode.proposal = false;
        Connect(nameof(Delete), slushNode, "queue_free");

        LastPing = DateTime.Now;
        Log.Information("SignaledPeer {UID} created.", UID);
    }
示例#5
0
 protected SessionState(UIManager manager, ConnectionStateMachine owner)
 {
     Manager       = manager;
     ScreenManager = manager.ScreenManager;
     Owner         = owner;
     Blackboard    = Owner.Blackboard;
 }
示例#6
0
 public void Construct(GameStateMachine manager, LobbyManager lobbyManager, ConnectionStateMachine connManager, NetworkedGameManager netGameManager, GameSettings gameSettings)
 {
     _gameStateManager = manager;
     _lobbyManager     = lobbyManager;
     _connManager      = connManager;
     _netGameManager   = netGameManager;
     _gameSettings     = gameSettings;
 }
示例#7
0
 public void RelayLost()
 {
     if (CurrentState == ConnectionStateMachine.RELAY)
     {
         CurrentState = ConnectionStateMachine.RELAY_SEARCH;
         Poll();
     }
 }
示例#8
0
 public void Construct(EnvironmentSettings envSettings, PrefabManager prefabManager, GridManager gridManager, Track track, ConnectionStateMachine connManager)
 {
     _envSettings   = envSettings;
     _prefabManager = prefabManager;
     _gridManager   = gridManager;
     _track         = track;
     _connManager   = connManager;
 }
示例#9
0
 // Start is called before the first frame update
 void Start()
 {
     _stateMachine = new ConnectionStateMachine(this);
     _stateMachine.OnEnable(ConnectionFSMStateEnum.StateEnum.START);
     if (_playFab == null)
     {
         _playFab = GetComponent <PlayFabLogin>();
     }
 }
示例#10
0
 public void ResetConnection()
 {
     PeerConnection.Close();
     PeerConnection.Initialize(RTCInitializer);
     remoteReady = false;
     localReady  = false;
     buffer      = new List <BufferedCandidate>();
     ShuffleRelayCandidates();
     CurrentState = ConnectionStateMachine.RELAY_SEARCH;
     Poll();
 }
示例#11
0
 public void Construct(ConnectionStateMachine connMachine, GameStateMachine gameStateMachine, LobbyManager lobbyManager)
 {
     _connMachine      = connMachine;
     _gameStateMachine = gameStateMachine;
     _lobbyManager     = lobbyManager;
 }
 public void Construct(GameStateMachine gameStateManager, LobbyManager lobbyManager, ConnectionStateMachine connManager)
 {
     _gameStateManager = gameStateManager;
     _lobbyManager     = lobbyManager;
     _connManager      = connManager;
 }
示例#13
0
 public void Construct(ConnectionStateMachine connManager, UIManager uiManager, GameStateMachine gameStateMachine)
 {
     _connManager      = connManager;
     _uiManager        = uiManager;
     _gameStateMachine = gameStateMachine;
 }
 public DefaultPlayState(UIManager manager, ConnectionStateMachine owner) : base(manager, owner)
 {
 }
 // Start is called before the first frame update
 void Start()
 {
     _stateMachine = new ConnectionStateMachine(this);
     _stateMachine.OnEnable(ConnectionFSMStateEnum.StateEnum.START);
 }
示例#16
0
 public void Construct(ConnectionStateMachine connManager, ServiceProvider provider, GameStateMachine gameStateMachine)
 {
     _connManager      = connManager;
     _networkManager   = provider.networkManager;
     _gameStateMachine = gameStateMachine;
 }
示例#17
0
 public void Construct(ConnectionStateMachine connMachine)
 {
     _connMachine = connMachine;
 }
示例#18
0
    public void Poll()
    {
        if (VOTE_TIME < (DateTime.Now - LastPing) && CurrentState != ConnectionStateMachine.MANUAL)
        {
            slushNode.proposal = true;
        }
        else
        {
            slushNode.proposal = false;
        }

        //If enough others have voted to DC this peer, DC immediately.
        //Integer math is fine here, since the threshold is an integer anyways.
        // GD.Print(slushNode.Name, " Votes: ", slushNode.consensus, slushNode.confidence0, " ", slushNode.confidence1);

        if (slushNode.consensus && slushNode.confidence1 == 10)
        {
            DeleteSelf();
            return;
        }


        switch (CurrentState)
        {
        case ConnectionStateMachine.NOMINAL:

            if (RESET_TIME < (DateTime.Now - LastPing))
            {
                ResetConnection();
                GD.Print("emitting CONNECTION LOST");
                EmitSignal(nameof(ConnectionLost));
                CurrentState = ConnectionStateMachine.RELAY_SEARCH;
            }
            break;

        case ConnectionStateMachine.RELAY_SEARCH:
            if (relayCandidates.Count == 0)
            {
                ShuffleRelayCandidates();
            }
            //If it's still zero, then there's no relay candidates
            //so we should do nothing.
            if (relayCandidates.Count != 0)
            {
                int nextCandidate = relayCandidates.Dequeue();
                if (
                    !networking.SignaledPeers.ContainsKey(nextCandidate) ||
                    !(networking.SignaledPeers[nextCandidate].CurrentState == ConnectionStateMachine.NOMINAL)
                    )
                {
                    break;
                }
                //No use testing a candidate that _we_ aren't even connected to.
                //Realistically can only happen if someone leaves while you're joining,
                //or if a peer that's still joining ends up here.
                //So should be a very uncommon occurrence.

                GD.Print("NEXT CANDIDATE:", nextCandidate);
                networking.RpcId(nextCandidate, "CheckRelay", UID);
            }
            break;
        }

        if (networking.RTCMP.HasPeer(UID) && PeerConnection.GetConnectionState() == WebRTCPeerConnection.ConnectionState.Connected && CurrentState != ConnectionStateMachine.NOMINAL)
        {
            if (networking.SignaledPeers.ContainsKey(relayUID))
            {
                TryDisconnect(networking.SignaledPeers[relayUID], nameof(ConnectionLost), this, nameof(RelayLost));
            }
            LastPing     = DateTime.Now;
            CurrentState = ConnectionStateMachine.NOMINAL;
        }
    }
示例#19
0
 public void Construct(ConnectionStateMachine connMachine, ScoreManager scoreManager)
 {
     _connMachine  = connMachine;
     _scoreManager = scoreManager;
 }