diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
index 193614b40..a6195abd3 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
@@ -857,24 +857,54 @@ namespace Barotrauma
playerFrame = new GUIFrame(new Rectangle(0, 0, 0, 0), Color.Black * 0.6f);
- var playerFrameInner = new GUIFrame(new Rectangle(0, 0, 300, 370), null, Alignment.Center, "", playerFrame);
+ var playerFrameInner = new GUIFrame(GameMain.Server != null ? new Rectangle(0, 0, 450, 370) : new Rectangle(0, 0, 450, 150), null, Alignment.Center, "", playerFrame);
playerFrameInner.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
- new GUITextBlock(new Rectangle(0, 0, 200, 20), component.UserData.ToString(),
+ new GUITextBlock(new Rectangle(0, 0, 200, 20), obj.ToString(),
"", Alignment.TopLeft, Alignment.TopLeft,
playerFrameInner, false, GUI.LargeFont);
if (GameMain.Server != null)
{
- var selectedClient = GameMain.Server.ConnectedClients.Find(c => c.Name == component.UserData.ToString());
+ var selectedClient = GameMain.Server.ConnectedClients.Find(c => c.Name == obj.ToString());
+ playerFrame.UserData = selectedClient;
new GUITextBlock(new Rectangle(0, 25, 150, 15), selectedClient.Connection.RemoteEndPoint.Address.ToString(), "", playerFrameInner);
- var permissionsBox = new GUIFrame(new Rectangle(0, 40, 0, 110), null, playerFrameInner);
+ new GUITextBlock(new Rectangle(0, 45, 0, 15), "Rank", "", playerFrameInner);
+ var rankDropDown = new GUIDropDown(new Rectangle(0, 70, 150, 20), "Rank", "", playerFrameInner);
+ rankDropDown.UserData = selectedClient;
+ foreach (PermissionPreset permissionPreset in PermissionPreset.List)
+ {
+ rankDropDown.AddItem(permissionPreset.Name, permissionPreset, permissionPreset.Description);
+ }
+ rankDropDown.AddItem("Custom", null);
+
+ PermissionPreset currentPreset = PermissionPreset.List.Find(p =>
+ p.Permissions == selectedClient.Permissions &&
+ p.PermittedCommands.Count == selectedClient.PermittedConsoleCommands.Count && !p.PermittedCommands.Except(selectedClient.PermittedConsoleCommands).Any());
+ rankDropDown.SelectItem(currentPreset);
+
+ rankDropDown.OnSelected += (c, userdata) =>
+ {
+ PermissionPreset selectedPreset = (PermissionPreset)userdata;
+ if (selectedPreset != null)
+ {
+ var client = playerFrame.UserData as Client;
+ client.SetPermissions(selectedPreset.Permissions, selectedPreset.PermittedCommands);
+ GameMain.Server.UpdateClientPermissions(client);
+
+ playerFrame = null;
+ SelectPlayer(null, client.Name);
+ }
+ return true;
+ };
+
+ var permissionsBox = new GUIFrame(new Rectangle(0, 125, (int)(playerFrameInner.Rect.Width * 0.5f), 160), null, playerFrameInner);
permissionsBox.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f);
permissionsBox.UserData = selectedClient;
- new GUITextBlock(new Rectangle(0, 0, 0, 15), "Permissions:", "", permissionsBox);
+ new GUITextBlock(new Rectangle(0, 100, permissionsBox.Rect.Width, 15), "Permissions:", "", playerFrameInner);
int x = 0, y = 0;
foreach (ClientPermissions permission in Enum.GetValues(typeof(ClientPermissions)))
{
@@ -885,13 +915,16 @@ namespace Barotrauma
string permissionStr = attributes.Length > 0 ? attributes[0].Description : permission.ToString();
- var permissionTick = new GUITickBox(new Rectangle(x, y + 25, 15, 15), permissionStr, Alignment.TopLeft, GUI.SmallFont, permissionsBox);
+ var permissionTick = new GUITickBox(new Rectangle(x, y, 15, 15), permissionStr, Alignment.TopLeft, GUI.SmallFont, permissionsBox);
permissionTick.UserData = permission;
permissionTick.Selected = selectedClient.HasPermission(permission);
permissionTick.OnSelected = (tickBox) =>
{
- var client = tickBox.Parent.UserData as Client;
+ //reset rank to custom
+ rankDropDown.SelectItem(null);
+
+ var client = playerFrame.UserData as Client;
if (client == null) return false;
var thisPermission = (ClientPermissions)tickBox.UserData;
@@ -906,28 +939,29 @@ namespace Barotrauma
return true;
};
-
y += 20;
- if (y >= permissionsBox.Rect.Height - 40)
+ if (y >= permissionsBox.Rect.Height - 15)
{
y = 0;
x += 120;
}
}
-
- new GUITextBlock(new Rectangle(0, 145, 0, 15), "Permitted console commands:", "", playerFrameInner);
- var commandList = new GUIListBox(new Rectangle(0,170,0, 80), "", playerFrameInner);
+ new GUITextBlock(new Rectangle(0, 100, (int)(playerFrameInner.Rect.Width * 0.5f), 15), "Permitted console commands:", "", Alignment.TopRight, Alignment.TopLeft, playerFrameInner, true);
+ var commandList = new GUIListBox(new Rectangle(0, 125, (int)(playerFrameInner.Rect.Width * 0.5f), 160), "", Alignment.TopRight, playerFrameInner);
commandList.UserData = selectedClient;
foreach (DebugConsole.Command command in DebugConsole.Commands)
{
- var commandTickBox = new GUITickBox(new Rectangle(0,0,15,15), command.names[0], Alignment.TopLeft, GUI.SmallFont, commandList);
+ var commandTickBox = new GUITickBox(new Rectangle(0, 0, 15, 15), command.names[0], Alignment.TopLeft, GUI.SmallFont, commandList);
commandTickBox.Selected = selectedClient.PermittedConsoleCommands.Contains(command);
commandTickBox.ToolTip = command.help;
commandTickBox.UserData = command;
commandTickBox.OnSelected += (GUITickBox tickBox) =>
{
- Client client = tickBox.Parent.UserData as Client;
+ //reset rank to custom
+ rankDropDown.SelectItem(null);
+
+ Client client = playerFrame.UserData as Client;
DebugConsole.Command selectedCommand = tickBox.UserData as DebugConsole.Command;
if (client == null) return false;
@@ -948,7 +982,7 @@ namespace Barotrauma
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Kick))
{
- var kickButton = new GUIButton(new Rectangle(0, -50, 100, 20), "Kick", Alignment.BottomLeft, "", playerFrameInner);
+ var kickButton = new GUIButton(new Rectangle(0, 0, 80, 20), "Kick", Alignment.BottomLeft, "", playerFrameInner);
kickButton.UserData = obj;
kickButton.OnClicked += KickPlayer;
kickButton.OnClicked += ClosePlayerFrame;
@@ -956,12 +990,12 @@ namespace Barotrauma
if (GameMain.Server != null || GameMain.Client.HasPermission(ClientPermissions.Ban))
{
- var banButton = new GUIButton(new Rectangle(0, 0, 100, 20), "Ban", Alignment.BottomLeft, "", playerFrameInner);
+ var banButton = new GUIButton(new Rectangle(90, 0, 80, 20), "Ban", Alignment.BottomLeft, "", playerFrameInner);
banButton.UserData = obj;
banButton.OnClicked += BanPlayer;
banButton.OnClicked += ClosePlayerFrame;
- var rangebanButton = new GUIButton(new Rectangle(0, -25, 100, 20), "Ban range", Alignment.BottomLeft, "", playerFrameInner);
+ var rangebanButton = new GUIButton(new Rectangle(180, 0, 80, 20), "Ban range", Alignment.BottomLeft, "", playerFrameInner);
rangebanButton.UserData = obj;
rangebanButton.OnClicked += BanPlayerRange;
rangebanButton.OnClicked += ClosePlayerFrame;
diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
index b2beaca84..e63890598 100644
--- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
+++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems
@@ -739,6 +739,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
@@ -1479,6 +1482,7 @@
+
diff --git a/Barotrauma/BarotraumaShared/Data/permissionpresets.xml b/Barotrauma/BarotraumaShared/Data/permissionpresets.xml
new file mode 100644
index 000000000..e909124d0
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Data/permissionpresets.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/Source/Networking/Client.cs b/Barotrauma/BarotraumaShared/Source/Networking/Client.cs
index b646d5ea6..7d034d4c3 100644
--- a/Barotrauma/BarotraumaShared/Source/Networking/Client.cs
+++ b/Barotrauma/BarotraumaShared/Source/Networking/Client.cs
@@ -1,31 +1,10 @@
using Lidgren.Network;
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
namespace Barotrauma.Networking
{
- [Flags]
- enum ClientPermissions
- {
- None = 0,
- [Description("End round")]
- EndRound = 1,
- [Description("Kick")]
- Kick = 2,
- [Description("Ban")]
- Ban = 4,
- [Description("Select submarine")]
- SelectSub = 8,
- [Description("Select game mode")]
- SelectMode = 16,
- [Description("Manage campaign")]
- ManageCampaign = 32,
- [Description("Console commands")]
- ConsoleCommands = 64
- }
-
class Client
{
public string Name;
@@ -81,7 +60,11 @@ namespace Barotrauma.Networking
public float DeleteDisconnectedTimer;
public ClientPermissions Permissions = ClientPermissions.None;
- public List PermittedConsoleCommands = new List();
+ public List PermittedConsoleCommands
+ {
+ get;
+ private set;
+ }
public bool SpectateOnly;
@@ -116,6 +99,7 @@ namespace Barotrauma.Networking
this.Name = name;
this.ID = ID;
+ PermittedConsoleCommands = new List();
kickVoters = new List();
votes = new object[Enum.GetNames(typeof(VoteType)).Length];
@@ -160,7 +144,7 @@ namespace Barotrauma.Networking
public void SetPermissions(ClientPermissions permissions, List permittedConsoleCommands)
{
this.Permissions = permissions;
- this.PermittedConsoleCommands = permittedConsoleCommands;
+ this.PermittedConsoleCommands = new List(permittedConsoleCommands);
}
public void GivePermission(ClientPermissions permission)
diff --git a/Barotrauma/BarotraumaShared/Source/Networking/ClientPermissions.cs b/Barotrauma/BarotraumaShared/Source/Networking/ClientPermissions.cs
new file mode 100644
index 000000000..262503795
--- /dev/null
+++ b/Barotrauma/BarotraumaShared/Source/Networking/ClientPermissions.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Xml.Linq;
+
+namespace Barotrauma.Networking
+{
+ [Flags]
+ enum ClientPermissions
+ {
+ None = 0,
+ [Description("End round")]
+ EndRound = 1,
+ [Description("Kick")]
+ Kick = 2,
+ [Description("Ban")]
+ Ban = 4,
+ [Description("Select submarine")]
+ SelectSub = 8,
+ [Description("Select game mode")]
+ SelectMode = 16,
+ [Description("Manage campaign")]
+ ManageCampaign = 32,
+ [Description("Console commands")]
+ ConsoleCommands = 64
+ }
+
+ class PermissionPreset
+ {
+ public static List List = new List();
+
+ public readonly string Name;
+ public readonly string Description;
+ public readonly ClientPermissions Permissions;
+ public readonly List PermittedCommands;
+
+ public PermissionPreset(XElement element)
+ {
+ Name = element.GetAttributeString("name", "");
+ Description = element.GetAttributeString("description", "");
+
+ string permissionsStr = element.GetAttributeString("permissions", "");
+ if (!Enum.TryParse(permissionsStr, out Permissions))
+ {
+ DebugConsole.ThrowError("Error in permission preset \"" + Name + "\" - " + permissionsStr + " is not a valid permission!");
+ }
+
+ PermittedCommands = new List();
+ if (Permissions.HasFlag(ClientPermissions.ConsoleCommands))
+ {
+ foreach (XElement subElement in element.Elements())
+ {
+ if (subElement.Name.ToString().ToLowerInvariant() != "command") continue;
+ string commandName = subElement.GetAttributeString("name", "");
+
+ DebugConsole.Command command = DebugConsole.FindCommand(commandName);
+ if (command == null)
+ {
+ DebugConsole.ThrowError("Error in permission preset \"" + Name + "\" - " + commandName + "\" is not a valid console command.");
+ continue;
+ }
+
+ PermittedCommands.Add(command);
+ }
+ }
+ }
+
+ public static void LoadAll(string file)
+ {
+ if (!File.Exists(file)) return;
+
+ XDocument doc = XMLExtensions.TryLoadXml(file);
+ if (doc == null || doc.Root == null) return;
+
+ foreach (XElement element in doc.Root.Elements())
+ {
+ List.Add(new PermissionPreset(element));
+ }
+ }
+ }
+}
diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs
index d84994295..7bdbb30c8 100644
--- a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs
+++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs
@@ -125,8 +125,9 @@ namespace Barotrauma.Networking
banList = new BanList();
LoadSettings();
+ PermissionPreset.LoadAll(PermissionPresetFile);
LoadClientPermissions();
-
+
CoroutineManager.StartCoroutine(StartServer(isPublic));
}
diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs
index dc1d78385..bfa98b46d 100644
--- a/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs
+++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServerSettings.cs
@@ -40,6 +40,7 @@ namespace Barotrauma.Networking
}
public const string SettingsFile = "serversettings.xml";
+ public static readonly string PermissionPresetFile = "Data" + Path.DirectorySeparatorChar + "permissionpresets.xml";
public static readonly string ClientPermissionsFile = "Data" + Path.DirectorySeparatorChar + "clientpermissions.xml";
public Dictionary SerializableProperties