コード例 #1
0
        public bool TryJoinTeam(string teamName, LobbyMember member)
        {
            if (!Config.EnableTeamSwitching)
            {
                return(false);
            }

            var currentTeam = member.Team;
            var newTeam     = Teams[teamName];

            // Ignore, if any of the teams is invalid
            if (currentTeam == null || newTeam == null)
            {
                return(false);
            }

            if (newTeam.PlayerCount >= newTeam.MaxPlayers)
            {
                SendChatMessage(member, "Team is full", true);
                return(false);
            }

            // Try to add the member
            if (!newTeam.AddMember(member))
            {
                return(false);
            }

            // Remove member from previous team
            currentTeam.RemoveMember(member);

            OnPlayerTeamChanged(member, newTeam);

            return(true);
        }
コード例 #2
0
        public void DisconnectFromLobby()
        {
            log("disconnects from lobby");
            LobbyMember.DisconnectFromLobby();

            LobbyMember = null;
        }
コード例 #3
0
        private void ButtonConnect_Click(object sender, EventArgs e)
        {
            Player player = CreatePlayer();

            MapManager mapManager = new MapManager();
            string     password   = TextPassword.Text;

            string ip = TextIPToConnectTo.Text;

            Task.Factory.StartNew(() => {
                Maybe <LobbyMember> maybe = LobbyMember.JoinLobby(ip, player, mapManager, password).Result;
                if (maybe.IsEmpty)
                {
                    Invoke(new Action(() => {
                        TextConnectionInformation.Text = "Failed to connected";
                    }));
                }
                else
                {
                    LobbyMember member = maybe.Value;
                    _context           = member.Context;
                    while (true)
                    {
                        member.Update();
                        Invoke(new Action(() => {
                            string players = string.Join(", ", member.GetLobbyMembers().Select(p => p.Name).ToArray());
                            TextConnectionInformation.Text = "Lobby Players=" + players;
                        }));
                    }
                }
            });
        }
コード例 #4
0
 /// <inheritdoc/>
 protected override void InitConnection(LobbyMember member)
 {
     if (!IsHost && member != Lobby.Members.Owner)
     {
         return;
     }
     MessageHandlers.Listen(member);
 }
コード例 #5
0
        protected virtual void OnPlayerAdded(LobbyMember member)
        {
            // Notify others about the new user
            var msg = MessageHelper.Create((short)OpCodes.LobbyMemberJoined, member.GenerateDataPacket().ToBytes());

            // Don't send to the person who just joined
            Broadcast(msg, p => p != member.Extension.Peer);
        }
コード例 #6
0
        protected virtual void PickNewGameMaster(bool broadcastChange = true)
        {
            if (!Config.EnableGameMasters)
            {
                return;
            }

            GameMaster = Members.Values.FirstOrDefault();
        }
コード例 #7
0
        protected virtual void OnPlayerReadyStatusChange(LobbyMember member)
        {
            // Broadcast the new status
            var packet = new StringPairPacket()
            {
                A = member.Username,
                B = member.IsReady.ToString()
            };

            Broadcast(MessageHelper.Create((short)OpCodes.LobbyMemberReadyStatusChange, packet.ToBytes()));
        }
コード例 #8
0
        private bool OnGameDTO(GameDTO data)
        {
            switch (data.GameState)
            {
            case GameState.TEAM_SELECT:
                state.BlueTeam.Clear();
                state.RedTeam.Clear();
                foreach (var raw in data.TeamOne)
                {
                    var member = new LobbyMember(raw);
                    if (raw.SummonerInternalName == session.Me.InternalName)
                    {
                        state.Me = member;
                    }
                    if (raw.SummonerInternalName == data.OwnerSummary.SummonerInternalName)
                    {
                        state.Owner = member;
                    }
                    state.BlueTeam.Add(member);
                }
                foreach (var raw in data.TeamTwo)
                {
                    var member = new LobbyMember(raw);
                    if (raw.SummonerInternalName == session.Me.InternalName)
                    {
                        state.Me = member;
                    }
                    if (raw.SummonerInternalName == data.OwnerSummary.SummonerInternalName)
                    {
                        state.Owner = member;
                    }
                    state.RedTeam.Add(member);
                }

                if (state.Chatroom == Guid.Empty)
                {
                    state.Chatroom = rooms.JoinCustom(data);
                }

                OnStateChanged();
                break;

            case GameState.PRE_CHAMP_SELECT:
            case GameState.CHAMP_SELECT:
            case GameState.POST_CHAMP_SELECT:
                if (lastGameDto.GameState == GameState.TEAM_SELECT)
                {
                    OnAdvancedToChampSelect();
                }
                break;
            }
            lastGameDto = data;
            return(true);
        }
コード例 #9
0
        protected virtual void OnPlayerRemoved(LobbyMember member)
        {
            // Destroy lobby if last member left
            if (!Config.KeepAliveWithZeroPlayers && Members.Count == 0)
            {
                Destroy();
                Logger.Log(LogLevel.Info, string.Format("Lobby \"{0}\" destroyed due to last player leaving.", Name));
            }

            // Notify others about the user who left
            Broadcast(MessageHelper.Create((short)OpCodes.LobbyMemberLeft, member.Username));
        }
コード例 #10
0
        protected virtual void OnPlayerPropertyChange(LobbyMember member, string propertyKey)
        {
            // Broadcast the changes
            var changesPacket = new LobbyMemberPropChangePacket()
            {
                LobbyId  = Id,
                Username = member.Username,
                Property = propertyKey,
                Value    = member.GetProperty(propertyKey)
            };

            Broadcast(MessageHelper.Create((short)OpCodes.LobbyMemberPropertyChanged, changesPacket.ToBytes()));
        }
コード例 #11
0
        void OnMemberUpdate(long lobbyId, long userId)
        {
            LobbyMember member = GetLobbyMember(lobbyId, userId);

            if (member != null)
            {
                member.DispatchUpdate();
            }
            else
            {
                Debug.LogWarning($"[Discord] Unexpected Lobby Member Update event for lobby: {lobbyId}, member: {userId}");
            }
        }
コード例 #12
0
        unsafe void OnLobbyMessage(long lobbyId, long userId, byte[] data)
        {
            LobbyMember member = GetLobbyMember(lobbyId, userId);

            if (member != null)
            {
                member.Lobby.DispatchLobbyMessage(member, new ReadOnlySpan <byte>(data, 0, data.Length));
            }
            else
            {
                Debug.LogWarning($"[Discord] Unexpected network message for lobby: {lobbyId}, member: {userId}");
            }
        }
コード例 #13
0
        protected virtual void OnPlayerTeamChanged(LobbyMember member, LobbyTeam newTeam)
        {
            var packet = new StringPairPacket()
            {
                A = member.Username,
                B = newTeam.Name
            };

            // Broadcast the change
            var msg = MessageHelper.Create((short)OpCodes.LobbyMemberChangedTeam, packet.ToBytes());

            Broadcast(msg);
        }
コード例 #14
0
        public void SendChatMessage(LobbyMember member, string message, bool isError = false,
                                    string sender = "System")
        {
            var packet = new LobbyChatPacket()
            {
                Message = message,
                Sender  = sender,
                IsError = isError
            };

            var msg = MessageHelper.Create((short)OpCodes.LobbyChatMessage, packet.ToBytes());

            member.Extension.Peer.SendMessage(msg, DeliveryMethod.ReliableUnordered);
        }
コード例 #15
0
        public void SendLobbyClosed()
        {
            try
            {
                log("is sent LobbyClosed");
                callback.SendLobbyClosed();
            }
            catch (Exception ex)
            {
                logError("sending LobbyClosed", ex);
            }

            LobbyMember = null;
        }
コード例 #16
0
        public void HandleChatMessage(LobbyMember member, IIncommingMessage message)
        {
            var text = message.AsString();

            var messagePacket = new LobbyChatPacket()
            {
                Message = text,
                Sender  = member.Username
            };

            var msg = MessageHelper.Create((short)OpCodes.LobbyChatMessage, messagePacket.ToBytes());

            Broadcast(msg);
        }
コード例 #17
0
        unsafe void OnLobbyMessage(long lobbyId, long userId, byte[] data)
        {
            LobbyMember member = GetLobbyMember(lobbyId, userId);

            if (member != null)
            {
                fixed(byte *ptr = data)
                {
                    member.Lobby.DispatchLobbyMessage(member, new FixedBuffer(ptr, data.Length));
                }
            }
            else
            {
                Debug.LogWarning($"[Discord] Unexpected network message for lobby: {lobbyId}, member: {userId}");
            }
        }
コード例 #18
0
        public void SetReadyState(LobbyMember member, bool state)
        {
            if (!Members.ContainsKey(member.Username))
            {
                return;
            }

            member.IsReady = state;

            OnPlayerReadyStatusChange(member);

            if (Members.Values.All(m => m.IsReady))
            {
                OnAllPlayersReady();
            }
        }
コード例 #19
0
        public bool SetPlayerProperty(LobbyMember player, string key, string value)
        {
            // Invalid property
            if (key == null)
            {
                return(false);
            }

            // Check if player is allowed to change this property
            if (!IsPlayerPropertyChangeable(player, key, value))
            {
                return(false);
            }

            player.SetProperty(key, value);

            OnPlayerPropertyChange(player, key);

            return(true);
        }
コード例 #20
0
        private bool OnLobbyStatus(LobbyStatus status)
        {
            if (state == null)
            {
                return(true);
            }
            lastLobbyStatus = status;
            state.IsCaptain = status.Owner.SummonerId == session.Me.SummonerId;

            if (loop.CurrentType == PlayLoopType.STANDARD)
            {
                state.CanMatch = true;

                if (state.Chatroom == Guid.Empty)
                {
                    state.Chatroom = rooms.JoinStandard(status);
                }

                var members = new List <LobbyMember>();
                foreach (var old in status.Members)
                {
                    var member = new LobbyMember(old);
                    if (old.SummonerId == session.Me.SummonerId)
                    {
                        state.Me = member;
                    }
                    members.Add(member);
                }
                state.Members = members;
            }

            state.Invitees = (from old in status.Invitees
                              where old.InviteeState != "CREATOR"
                              select new LobbyInvitee(old)).ToList();

            OnStateChanged();
            return(true);
        }
コード例 #21
0
        private bool OnGameData(GameDataObject lcds)
        {
            if (lcds != null)
            {
                draftData = lcds.Content;
            }

            switch (lcds.Content.CurrentPhase)
            {
            case Phase.DRAFT_PREMADE:

                if (state.Chatroom == Guid.Empty)
                {
                    state.Chatroom = rooms.JoinDraft(draftData.PremadeState);
                }

                state.Members = new List <LobbyMember>();
                foreach (var slot in draftData.PremadeState.Slots)
                {
                    var member = new LobbyMember(slot);
                    if (slot.SlotId == draftData.PremadeState.MySlot)
                    {
                        state.Me = member;
                    }
                    state.Members.Add(member);
                }

                state.CanMatch = draftData.PremadeState.ReadyToMatchmake;
                OnStateChanged();
                break;

            case Phase.MATCHMAKING:
                OnAdvancedToMatchmaking();
                break;
            }
            return(true);
        }
コード例 #22
0
 protected override void InitConnection(LobbyMember member) =>
 MessageHandlers.Listen(member);
コード例 #23
0
        protected HostClientPeer(Lobby lobby) : base(lobby)
        {
            _lastSeenHost = Lobby.Members.Owner;

            Lobby.OnUpdated += OnLobbyUpdated;
        }
コード例 #24
0
 public virtual LobbyTeam PickTeamForPlayer(LobbyMember member)
 {
     return(Teams.Values
            .Where(t => t.CanAddPlayer(member))
            .OrderBy(t => t.PlayerCount).FirstOrDefault());
 }
コード例 #25
0
 protected virtual bool IsPlayerPropertyChangeable(LobbyMember member, string key, string value)
 {
     return(true);
 }
コード例 #26
0
 public virtual LobbyMemberData GenerateMemberData(LobbyMember member)
 {
     return(member.GenerateDataPacket());
 }
コード例 #27
0
 /// <inheritdoc/>
 protected override void DestroyConnection(LobbyMember member) =>
 MessageHandlers.StopListening(member);
コード例 #28
0
    // Adds a visual lobby member for the lobby.
    private void AddLobbyMember()
    {
        LobbyMember lobbyMember = (LobbyMember)Instantiate(lobbyMemberPrefab, new Vector3(100, 0, 0), new Quaternion());

        lobbyMember.BindPlayer(this);
    }
コード例 #29
0
 /// <summary>
 /// Event handler method for when the lobby ownership has changed.
 /// </summary>
 protected abstract void OnHostChanged(LobbyMember host);
コード例 #30
0
ファイル: Peer.cs プロジェクト: provencher/HouraiNetworking
 /// <summary>
 /// Event handler for the end of an existing connection. Fired upon lobby
 /// deletion for every present lobby member and upon a member disconnecting.
 /// </summary>
 /// <remarks>
 /// In order to stop processsing messages from the peer,
 /// MessageHandlers.StopListening must be called with the provided LobbyMember.
 /// </remarks>
 protected abstract void DestroyConnection(LobbyMember member);