diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 1688a845b..26166fe75 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -834,24 +834,22 @@ namespace Barotrauma.Networking Character character = obj as Character; if (character == null) return false; - //if (character != myCharacter) - //{ - // var kickButton = new GUIButton(new Rectangle(0, 0, 120, 20), "Vote to Kick", Alignment.BottomLeft, GUI.Style, characterFrame); - // kickButton.UserData = character; - // kickButton.OnClicked += VoteForKick; - //} + if (character != myCharacter) + { + var client = GameMain.NetworkMember.ConnectedClients.Find(c => c.Character == character); + if (client != null) + { + var kickButton = new GUIButton(new Rectangle(0, 0, 120, 20), "Vote to Kick", Alignment.BottomLeft, GUI.Style, characterFrame); + + if (GameMain.NetworkMember.ConnectedClients != null) + { + kickButton.Enabled = !client.HasKickVoteFromID(myID); + } - //if (GameMain.NetworkMember.ConnectedClients != null) - //{ - // var client = GameMain.NetworkMember.ConnectedClients.Find(c => c.Character == character); - // if (client != null && client.KickVoteCount>0) - // { - // new GUITextBlock( - // new Rectangle(0, 0, 100, 20), - // client.KickVoteCount + "/" + GameMain.NetworkMember.ConnectedClients, - // GUI.Style, Alignment.BottomRight, Alignment.TopLeft, characterFrame); - // } - //} + kickButton.UserData = character; + kickButton.OnClicked += VoteForKick; + } + } return true; } @@ -933,11 +931,16 @@ namespace Barotrauma.Networking public bool VoteForKick(GUIButton button, object userdata) { var votedClient = otherClients.Find(c => c.Character == userdata); + if (votedClient == null) return false; + + votedClient.AddKickVote(new Client(name, ID)); if (votedClient == null) return false; Vote(VoteType.Kick, votedClient); + button.Enabled = false; + return true; } @@ -1070,15 +1073,14 @@ namespace Barotrauma.Networking return character; } - public override void SendChatMessage(string message) + public override void SendChatMessage(string message, ChatMessageType? type = null) { //AddChatMessage(message); if (client.ServerConnection == null) return; - var type = ChatMessageType.Default; - - + type = ChatMessageType.Default; + if (Screen.Selected == GameMain.GameScreen && (myCharacter == null || myCharacter.IsDead)) { type = ChatMessageType.Dead; @@ -1092,7 +1094,7 @@ namespace Barotrauma.Networking var chatMessage = ChatMessage.Create( gameStarted && myCharacter != null ? myCharacter.Name : name, - message, type, gameStarted ? myCharacter : null); + message, (ChatMessageType)type, gameStarted ? myCharacter : null); ReliableMessage msg = reliableChannel.CreateMessage(); msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 62ad87ff5..429846431 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -1492,12 +1492,15 @@ namespace Barotrauma.Networking } } - public override void SendChatMessage(string message) + public override void SendChatMessage(string message, ChatMessageType? type = null) { List recipients = new List(); Client targetClient = null; - ChatMessageType type = gameStarted && myCharacter != null ? ChatMessageType.Default : ChatMessageType.Server; + if (type == null) + { + type = gameStarted && myCharacter != null ? ChatMessageType.Default : ChatMessageType.Server; + } string command = ChatMessage.GetChatMessageCommand(message, out message).ToLowerInvariant(); @@ -1536,12 +1539,17 @@ namespace Barotrauma.Networking var chatMessage = ChatMessage.Create( gameStarted && myCharacter != null ? myCharacter.Name : name, - message, type, gameStarted ? myCharacter : null); + message, (ChatMessageType)type, gameStarted ? myCharacter : null); AddChatMessage(chatMessage); if (!server.Connections.Any()) return; + SendChatMessage(chatMessage, recipients); + } + + public void SendChatMessage(ChatMessage chatMessage, List recipients) + { foreach (Client c in recipients) { ReliableMessage msg = c.ReliableChannel.CreateMessage(); @@ -1552,8 +1560,7 @@ namespace Barotrauma.Networking chatMessage.WriteNetworkMessage(msg.InnerMessage); c.ReliableChannel.SendMessage(msg, c.Connection); - } - + } } private void ReadCharacterData(NetIncomingMessage message) @@ -1844,6 +1851,7 @@ namespace Barotrauma.Networking get { return kickVoters.Count; } } + public Client(NetPeer server, string name, byte ID) : this(name, ID) { @@ -1890,6 +1898,11 @@ namespace Barotrauma.Networking { kickVoters.Remove(voter); } + + public bool HasKickVoteFromID(int id) + { + return kickVoters.Any(k => k.ID == id); + } public static void UpdateKickVotes(List connectedClients) diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index e1f26657c..4fb0b83f2 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -300,7 +300,7 @@ namespace Barotrauma.Networking GUI.PlayUISound(soundType); } - public virtual void SendChatMessage(string message) { } + public virtual void SendChatMessage(string message, ChatMessageType? type = null) { } public virtual void Update(float deltaTime) { diff --git a/Subsurface/Source/Screens/NetLobbyVoting.cs b/Subsurface/Source/Screens/NetLobbyVoting.cs index 82b55f4e8..714aeeadb 100644 --- a/Subsurface/Source/Screens/NetLobbyVoting.cs +++ b/Subsurface/Source/Screens/NetLobbyVoting.cs @@ -103,6 +103,13 @@ namespace Barotrauma kicked.AddKickVote(sender); + if (GameMain.Server != null) + { + GameMain.Server.SendChatMessage( + ChatMessage.Create("", sender.name + " has voted to kick " + kicked.name, ChatMessageType.Server, null), + GameMain.Server.ConnectedClients); + } + break; }