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); }
public void DisconnectFromLobby() { log("disconnects from lobby"); LobbyMember.DisconnectFromLobby(); LobbyMember = null; }
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; })); } } }); }
/// <inheritdoc/> protected override void InitConnection(LobbyMember member) { if (!IsHost && member != Lobby.Members.Owner) { return; } MessageHandlers.Listen(member); }
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); }
protected virtual void PickNewGameMaster(bool broadcastChange = true) { if (!Config.EnableGameMasters) { return; } GameMaster = Members.Values.FirstOrDefault(); }
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())); }
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); }
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)); }
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())); }
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}"); } }
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}"); } }
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); }
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); }
public void SendLobbyClosed() { try { log("is sent LobbyClosed"); callback.SendLobbyClosed(); } catch (Exception ex) { logError("sending LobbyClosed", ex); } LobbyMember = null; }
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); }
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}"); } }
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(); } }
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); }
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); }
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); }
protected override void InitConnection(LobbyMember member) => MessageHandlers.Listen(member);
protected HostClientPeer(Lobby lobby) : base(lobby) { _lastSeenHost = Lobby.Members.Owner; Lobby.OnUpdated += OnLobbyUpdated; }
public virtual LobbyTeam PickTeamForPlayer(LobbyMember member) { return(Teams.Values .Where(t => t.CanAddPlayer(member)) .OrderBy(t => t.PlayerCount).FirstOrDefault()); }
protected virtual bool IsPlayerPropertyChangeable(LobbyMember member, string key, string value) { return(true); }
public virtual LobbyMemberData GenerateMemberData(LobbyMember member) { return(member.GenerateDataPacket()); }
/// <inheritdoc/> protected override void DestroyConnection(LobbyMember member) => MessageHandlers.StopListening(member);
// 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); }
/// <summary> /// Event handler method for when the lobby ownership has changed. /// </summary> protected abstract void OnHostChanged(LobbyMember host);
/// <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);