Implement first iteration of players tab (chat/player list) and sketch API
This commit is contained in:
@@ -114,6 +114,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Logger.cs" />
|
<Compile Include="Logger.cs" />
|
||||||
|
<Compile Include="MyPlayerCollectionExtensions.cs" />
|
||||||
<Compile Include="PluginManager.cs" />
|
<Compile Include="PluginManager.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
13
PistonAPI/IEnvironmentInfo.cs
Normal file
13
PistonAPI/IEnvironmentInfo.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
namespace PistonAPI
|
||||||
|
{
|
||||||
|
public interface IEnvironmentInfo
|
||||||
|
{
|
||||||
|
EnvironmentType Type { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum EnvironmentType
|
||||||
|
{
|
||||||
|
DedicatedServer,
|
||||||
|
GameClient
|
||||||
|
}
|
||||||
|
}
|
10
PistonAPI/IServerControls.cs
Normal file
10
PistonAPI/IServerControls.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
namespace PistonAPI
|
||||||
|
{
|
||||||
|
public interface IServerControls
|
||||||
|
{
|
||||||
|
bool AddGUITab(string name, UserControl control);
|
||||||
|
bool RemoveGUITab(string name);
|
||||||
|
}
|
||||||
|
}
|
@@ -3,11 +3,13 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
namespace PistonAPI
|
namespace PistonAPI
|
||||||
{
|
{
|
||||||
public static class PistonAPI
|
public static class PistonAPI
|
||||||
{
|
{
|
||||||
|
public static IServerControls ServerControls { get; }
|
||||||
|
public static IEnvironmentInfo EnvironmentInfo { get; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -49,6 +49,8 @@
|
|||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="PresentationCore" />
|
||||||
|
<Reference Include="PresentationFramework" />
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Xml.Linq" />
|
<Reference Include="System.Xml.Linq" />
|
||||||
@@ -62,7 +64,9 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="IEnvironmentInfo.cs" />
|
||||||
<Compile Include="IPistonPlugin.cs" />
|
<Compile Include="IPistonPlugin.cs" />
|
||||||
|
<Compile Include="IServerControls.cs" />
|
||||||
<Compile Include="PistonAPI.cs" />
|
<Compile Include="PistonAPI.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@@ -17,6 +17,7 @@ using Piston;
|
|||||||
using Sandbox;
|
using Sandbox;
|
||||||
using Sandbox.Engine.Multiplayer;
|
using Sandbox.Engine.Multiplayer;
|
||||||
using Sandbox.Game.World;
|
using Sandbox.Game.World;
|
||||||
|
using SteamSDK;
|
||||||
|
|
||||||
namespace PistonServer
|
namespace PistonServer
|
||||||
{
|
{
|
||||||
@@ -29,34 +30,45 @@ namespace PistonServer
|
|||||||
public ChatControl()
|
public ChatControl()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
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.
|
//Messages sent from server loop back around.
|
||||||
if (steamId == MyMultiplayer.Static.ServerId)
|
if (steamId == MyMultiplayer.Static.ServerId)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var name = MySession.Static.Players.TryGetPlayerBySteamId(steamId)?.DisplayName ?? "";
|
var name = MyMultiplayer.Static.GetMemberName(steamId);
|
||||||
Dispatcher.Invoke(() => AddMessage(name, message), DispatcherPriority.Normal);
|
Dispatcher.Invoke(() => AddMessage(name, message), DispatcherPriority.Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddMessage(string sender, string message)
|
public void AddMessage(string sender, string message)
|
||||||
{
|
{
|
||||||
Chat.Text += $"{DateTime.Now.ToLongTimeString()} | {sender}: {message}\n";
|
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)
|
private void SendButton_Click(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
OnMessageEntered();
|
OnMessageEntered();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMessageEntered()
|
private void OnMessageEntered()
|
||||||
{
|
{
|
||||||
var text = Message.Text;
|
var text = Message.Text;
|
||||||
AddMessage("Server", text);
|
SendMessage(text);
|
||||||
MySandboxGame.Static.Invoke(() => MyMultiplayer.Static.SendChatMessage(text));
|
|
||||||
MessageEntered?.Invoke(Message.Text);
|
MessageEntered?.Invoke(Message.Text);
|
||||||
Message.Text = "";
|
Message.Text = "";
|
||||||
}
|
}
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem Header="Chat/Players">
|
<TabItem Header="Chat/Players">
|
||||||
<DockPanel>
|
<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"/>
|
<local:ChatControl x:Name="Chat" IsEnabled="False"/>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -73,5 +74,10 @@ namespace PistonServer
|
|||||||
uiUpdate.Stop();
|
uiUpdate.Stop();
|
||||||
ServerManager.Static.StopServer();
|
ServerManager.Static.StopServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void OnClosing(CancelEventArgs e)
|
||||||
|
{
|
||||||
|
ServerManager.Static.StopServer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,8 +7,8 @@
|
|||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<DockPanel>
|
<DockPanel>
|
||||||
<StackPanel DockPanel.Dock="Bottom">
|
<StackPanel DockPanel.Dock="Bottom">
|
||||||
<Button x:Name="KickButton" Content="Kick" 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"/>
|
<Button x:Name="BanButton" Content="Ban" Margin="5,5,5,5" Click="BanButton_Click"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
<ListBox x:Name="PlayerList" DockPanel.Dock="Top" Margin="5,5,5,5"/>
|
<ListBox x:Name="PlayerList" DockPanel.Dock="Top" Margin="5,5,5,5"/>
|
||||||
</DockPanel>
|
</DockPanel>
|
||||||
|
@@ -12,6 +12,12 @@ using System.Windows.Media;
|
|||||||
using System.Windows.Media.Imaging;
|
using System.Windows.Media.Imaging;
|
||||||
using System.Windows.Navigation;
|
using System.Windows.Navigation;
|
||||||
using System.Windows.Shapes;
|
using System.Windows.Shapes;
|
||||||
|
using Piston;
|
||||||
|
using Sandbox;
|
||||||
|
using Sandbox.Engine.Multiplayer;
|
||||||
|
using Sandbox.Game.Multiplayer;
|
||||||
|
using Sandbox.Game.World;
|
||||||
|
using SteamSDK;
|
||||||
|
|
||||||
namespace PistonServer
|
namespace PistonServer
|
||||||
{
|
{
|
||||||
@@ -23,6 +29,86 @@ namespace PistonServer
|
|||||||
public PlayersControl()
|
public PlayersControl()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -21,6 +21,9 @@ namespace PistonServer
|
|||||||
public Thread ServerThread { get; private set; }
|
public Thread ServerThread { get; private set; }
|
||||||
public string[] RunArgs { get; set; } = new string[0];
|
public string[] RunArgs { get; set; } = new string[0];
|
||||||
|
|
||||||
|
public event Action SessionLoading;
|
||||||
|
public event Action SessionReady;
|
||||||
|
|
||||||
private readonly Assembly _dsAssembly;
|
private readonly Assembly _dsAssembly;
|
||||||
|
|
||||||
private ServerManager()
|
private ServerManager()
|
||||||
@@ -38,12 +41,13 @@ namespace PistonServer
|
|||||||
|
|
||||||
private void OnSessionLoading()
|
private void OnSessionLoading()
|
||||||
{
|
{
|
||||||
|
SessionLoading?.Invoke();
|
||||||
MySession.Static.OnReady += OnSessionReady;
|
MySession.Static.OnReady += OnSessionReady;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSessionReady()
|
private void OnSessionReady()
|
||||||
{
|
{
|
||||||
MyMultiplayer.Static.ChatMessageReceived += Program.UserInterface.Chat.MessageReceived;
|
SessionReady?.Invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
Reference in New Issue
Block a user