Implement first iteration of players tab (chat/player list) and sketch API

This commit is contained in:
John Michael Gross
2016-09-18 07:04:32 -07:00
parent 113a6b63c0
commit 15d6a89f9c
11 changed files with 148 additions and 10 deletions

View File

@@ -114,6 +114,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Logger.cs" />
<Compile Include="MyPlayerCollectionExtensions.cs" />
<Compile Include="PluginManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

View File

@@ -0,0 +1,13 @@
namespace PistonAPI
{
public interface IEnvironmentInfo
{
EnvironmentType Type { get; }
}
public enum EnvironmentType
{
DedicatedServer,
GameClient
}
}

View File

@@ -0,0 +1,10 @@
using System.Windows.Controls;
namespace PistonAPI
{
public interface IServerControls
{
bool AddGUITab(string name, UserControl control);
bool RemoveGUITab(string name);
}
}

View File

@@ -3,11 +3,13 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
namespace PistonAPI
{
public static class PistonAPI
{
public static IServerControls ServerControls { get; }
public static IEnvironmentInfo EnvironmentInfo { get; }
}
}

View File

@@ -49,6 +49,8 @@
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<ItemGroup>
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
@@ -62,7 +64,9 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="IEnvironmentInfo.cs" />
<Compile Include="IPistonPlugin.cs" />
<Compile Include="IServerControls.cs" />
<Compile Include="PistonAPI.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>

View File

@@ -17,6 +17,7 @@ using Piston;
using Sandbox;
using Sandbox.Engine.Multiplayer;
using Sandbox.Game.World;
using SteamSDK;
namespace PistonServer
{
@@ -29,34 +30,45 @@ namespace PistonServer
public ChatControl()
{
InitializeComponent();
ServerManager.Static.SessionReady += InitChatHandler;
}
public void MessageReceived(ulong steamId, string message, SteamSDK.ChatEntryTypeEnum chatType)
public void InitChatHandler()
{
MyMultiplayer.Static.ChatMessageReceived += MessageReceived;
}
public void MessageReceived(ulong steamId, string message, ChatEntryTypeEnum chatType)
{
//Messages sent from server loop back around.
if (steamId == MyMultiplayer.Static.ServerId)
return;
var name = MySession.Static.Players.TryGetPlayerBySteamId(steamId)?.DisplayName ?? "";
var name = MyMultiplayer.Static.GetMemberName(steamId);
Dispatcher.Invoke(() => AddMessage(name, message), DispatcherPriority.Normal);
}
public void AddMessage(string sender, string message)
{
Chat.Text += $"{DateTime.Now.ToLongTimeString()} | {sender}: {message}\n";
Program.UserInterface.Players.RefreshNames();
}
public void SendMessage(string message)
{
MyMultiplayer.Static.SendChatMessage(message);
Dispatcher.Invoke(() => AddMessage("Server", message));
}
private void SendButton_Click(object sender, RoutedEventArgs e)
{
OnMessageEntered();
}
private void OnMessageEntered()
{
var text = Message.Text;
AddMessage("Server", text);
MySandboxGame.Static.Invoke(() => MyMultiplayer.Static.SendChatMessage(text));
SendMessage(text);
MessageEntered?.Invoke(Message.Text);
Message.Text = "";
}

View File

@@ -19,7 +19,7 @@
</TabItem>
<TabItem Header="Chat/Players">
<DockPanel>
<local:PlayersControl x:Name="Players" DockPanel.Dock="Right" Width="150" IsEnabled="False"></local:PlayersControl>
<local:PlayersControl x:Name="Players" DockPanel.Dock="Right" Width="250" IsEnabled="False"></local:PlayersControl>
<local:ChatControl x:Name="Chat" IsEnabled="False"/>
</DockPanel>
</TabItem>

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -73,5 +74,10 @@ namespace PistonServer
uiUpdate.Stop();
ServerManager.Static.StopServer();
}
protected override void OnClosing(CancelEventArgs e)
{
ServerManager.Static.StopServer();
}
}
}

View File

@@ -7,8 +7,8 @@
mc:Ignorable="d">
<DockPanel>
<StackPanel DockPanel.Dock="Bottom">
<Button x:Name="KickButton" Content="Kick" Margin="5,5,5,5"/>
<Button x:Name="BanButton" Content="Ban" Margin="5,5,5,5"/>
<Button x:Name="KickButton" Content="Kick" Margin="5,5,5,5" Click="KickButton_Click"/>
<Button x:Name="BanButton" Content="Ban" Margin="5,5,5,5" Click="BanButton_Click"/>
</StackPanel>
<ListBox x:Name="PlayerList" DockPanel.Dock="Top" Margin="5,5,5,5"/>
</DockPanel>

View File

@@ -12,6 +12,12 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Piston;
using Sandbox;
using Sandbox.Engine.Multiplayer;
using Sandbox.Game.Multiplayer;
using Sandbox.Game.World;
using SteamSDK;
namespace PistonServer
{
@@ -23,6 +29,86 @@ namespace PistonServer
public PlayersControl()
{
InitializeComponent();
ServerManager.Static.SessionReady += Static_SessionReady;
}
public void RefreshNames()
{
Dispatcher.Invoke(() =>
{
foreach (var player in PlayerList.Items)
{
var p = (PlayerItem)player;
p.Name = MyMultiplayer.Static.GetMemberName(p.SteamId);
}
PlayerList.Items.Refresh();
});
}
private void Static_SessionReady()
{
MyMultiplayer.Static.ClientKicked += OnClientKicked;
MyMultiplayer.Static.ClientLeft += OnClientLeft;
MySession.Static.Players.PlayerRequesting += OnPlayerRequesting;
}
/// <summary>
/// Invoked when a client logs in and hits the respawn screen.
/// </summary>
private void OnPlayerRequesting(PlayerRequestArgs args)
{
var steamId = args.PlayerId.SteamId;
var player = new PlayerItem { Name = MyMultiplayer.Static.GetMemberName(steamId), SteamId = steamId };
Program.UserInterface.Chat.SendMessage($"{player.Name} connected.");
Dispatcher.Invoke(() => PlayerList.Items.Add(player));
}
private void OnClientKicked(ulong steamId)
{
OnClientLeft(steamId, ChatMemberStateChangeEnum.Kicked);
}
private void OnClientLeft(ulong steamId, ChatMemberStateChangeEnum stateChange)
{
Dispatcher.Invoke(() =>
{
var player = PlayerList.Items.Cast<PlayerItem>().FirstOrDefault(x => x.SteamId == steamId);
if (player == null)
return;
Program.UserInterface.Chat.SendMessage($"{player.Name} {stateChange.ToString().ToLower()}.");
PlayerList.Items.Remove(player);
});
}
public class PlayerItem
{
public ulong SteamId;
public string Name;
public override string ToString()
{
return $"{Name} ({SteamId})";
}
}
private void KickButton_Click(object sender, RoutedEventArgs e)
{
if (PlayerList.SelectedItem == null)
return;
var player = (PlayerItem)PlayerList.SelectedItem;
MyMultiplayer.Static.KickClient(player.SteamId);
}
private void BanButton_Click(object sender, RoutedEventArgs e)
{
if (PlayerList.SelectedItem == null)
return;
var player = (PlayerItem)PlayerList.SelectedItem;
MyMultiplayer.Static.BanClient(player.SteamId, true);
}
}
}

View File

@@ -21,6 +21,9 @@ namespace PistonServer
public Thread ServerThread { get; private set; }
public string[] RunArgs { get; set; } = new string[0];
public event Action SessionLoading;
public event Action SessionReady;
private readonly Assembly _dsAssembly;
private ServerManager()
@@ -38,12 +41,13 @@ namespace PistonServer
private void OnSessionLoading()
{
SessionLoading?.Invoke();
MySession.Static.OnReady += OnSessionReady;
}
private void OnSessionReady()
{
MyMultiplayer.Static.ChatMessageReceived += Program.UserInterface.Chat.MessageReceived;
SessionReady?.Invoke();
}
/// <summary>