Re-enabled vote kicking, with some improvements: chat messages notifying about votes, kick button is disabled for the host's character or if already voted

This commit is contained in:
Regalis
2016-06-03 15:00:36 +03:00
parent 57abce298d
commit 0e24eab5e3
4 changed files with 50 additions and 28 deletions
+23 -21
View File
@@ -834,24 +834,22 @@ namespace Barotrauma.Networking
Character character = obj as Character; Character character = obj as Character;
if (character == null) return false; if (character == null) return false;
//if (character != myCharacter) if (character != myCharacter)
//{ {
// var kickButton = new GUIButton(new Rectangle(0, 0, 120, 20), "Vote to Kick", Alignment.BottomLeft, GUI.Style, characterFrame); var client = GameMain.NetworkMember.ConnectedClients.Find(c => c.Character == character);
// kickButton.UserData = character; if (client != null)
// kickButton.OnClicked += VoteForKick; {
//} var kickButton = new GUIButton(new Rectangle(0, 0, 120, 20), "Vote to Kick", Alignment.BottomLeft, GUI.Style, characterFrame);
//if (GameMain.NetworkMember.ConnectedClients != null) if (GameMain.NetworkMember.ConnectedClients != null)
//{ {
// var client = GameMain.NetworkMember.ConnectedClients.Find(c => c.Character == character); kickButton.Enabled = !client.HasKickVoteFromID(myID);
// if (client != null && client.KickVoteCount>0) }
// {
// new GUITextBlock( kickButton.UserData = character;
// new Rectangle(0, 0, 100, 20), kickButton.OnClicked += VoteForKick;
// client.KickVoteCount + "/" + GameMain.NetworkMember.ConnectedClients, }
// GUI.Style, Alignment.BottomRight, Alignment.TopLeft, characterFrame); }
// }
//}
return true; return true;
} }
@@ -933,11 +931,16 @@ namespace Barotrauma.Networking
public bool VoteForKick(GUIButton button, object userdata) public bool VoteForKick(GUIButton button, object userdata)
{ {
var votedClient = otherClients.Find(c => c.Character == 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; if (votedClient == null) return false;
Vote(VoteType.Kick, votedClient); Vote(VoteType.Kick, votedClient);
button.Enabled = false;
return true; return true;
} }
@@ -1070,14 +1073,13 @@ namespace Barotrauma.Networking
return character; return character;
} }
public override void SendChatMessage(string message) public override void SendChatMessage(string message, ChatMessageType? type = null)
{ {
//AddChatMessage(message); //AddChatMessage(message);
if (client.ServerConnection == null) return; if (client.ServerConnection == null) return;
var type = ChatMessageType.Default; type = ChatMessageType.Default;
if (Screen.Selected == GameMain.GameScreen && (myCharacter == null || myCharacter.IsDead)) if (Screen.Selected == GameMain.GameScreen && (myCharacter == null || myCharacter.IsDead))
{ {
@@ -1092,7 +1094,7 @@ namespace Barotrauma.Networking
var chatMessage = ChatMessage.Create( var chatMessage = ChatMessage.Create(
gameStarted && myCharacter != null ? myCharacter.Name : name, gameStarted && myCharacter != null ? myCharacter.Name : name,
message, type, gameStarted ? myCharacter : null); message, (ChatMessageType)type, gameStarted ? myCharacter : null);
ReliableMessage msg = reliableChannel.CreateMessage(); ReliableMessage msg = reliableChannel.CreateMessage();
msg.InnerMessage.Write((byte)PacketTypes.Chatmessage); msg.InnerMessage.Write((byte)PacketTypes.Chatmessage);
+17 -4
View File
@@ -1492,12 +1492,15 @@ namespace Barotrauma.Networking
} }
} }
public override void SendChatMessage(string message) public override void SendChatMessage(string message, ChatMessageType? type = null)
{ {
List<Client> recipients = new List<Client>(); List<Client> recipients = new List<Client>();
Client targetClient = null; 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(); string command = ChatMessage.GetChatMessageCommand(message, out message).ToLowerInvariant();
@@ -1536,12 +1539,17 @@ namespace Barotrauma.Networking
var chatMessage = ChatMessage.Create( var chatMessage = ChatMessage.Create(
gameStarted && myCharacter != null ? myCharacter.Name : name, gameStarted && myCharacter != null ? myCharacter.Name : name,
message, type, gameStarted ? myCharacter : null); message, (ChatMessageType)type, gameStarted ? myCharacter : null);
AddChatMessage(chatMessage); AddChatMessage(chatMessage);
if (!server.Connections.Any()) return; if (!server.Connections.Any()) return;
SendChatMessage(chatMessage, recipients);
}
public void SendChatMessage(ChatMessage chatMessage, List<Client> recipients)
{
foreach (Client c in recipients) foreach (Client c in recipients)
{ {
ReliableMessage msg = c.ReliableChannel.CreateMessage(); ReliableMessage msg = c.ReliableChannel.CreateMessage();
@@ -1553,7 +1561,6 @@ namespace Barotrauma.Networking
c.ReliableChannel.SendMessage(msg, c.Connection); c.ReliableChannel.SendMessage(msg, c.Connection);
} }
} }
private void ReadCharacterData(NetIncomingMessage message) private void ReadCharacterData(NetIncomingMessage message)
@@ -1844,6 +1851,7 @@ namespace Barotrauma.Networking
get { return kickVoters.Count; } get { return kickVoters.Count; }
} }
public Client(NetPeer server, string name, byte ID) public Client(NetPeer server, string name, byte ID)
: this(name, ID) : this(name, ID)
{ {
@@ -1891,6 +1899,11 @@ namespace Barotrauma.Networking
kickVoters.Remove(voter); kickVoters.Remove(voter);
} }
public bool HasKickVoteFromID(int id)
{
return kickVoters.Any(k => k.ID == id);
}
public static void UpdateKickVotes(List<Client> connectedClients) public static void UpdateKickVotes(List<Client> connectedClients)
{ {
@@ -300,7 +300,7 @@ namespace Barotrauma.Networking
GUI.PlayUISound(soundType); GUI.PlayUISound(soundType);
} }
public virtual void SendChatMessage(string message) { } public virtual void SendChatMessage(string message, ChatMessageType? type = null) { }
public virtual void Update(float deltaTime) public virtual void Update(float deltaTime)
{ {
@@ -103,6 +103,13 @@ namespace Barotrauma
kicked.AddKickVote(sender); 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; break;
} }