Implement first iteration of players tab (chat/player list) and sketch API
This commit is contained in:
@@ -114,6 +114,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Logger.cs" />
|
||||
<Compile Include="MyPlayerCollectionExtensions.cs" />
|
||||
<Compile Include="PluginManager.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</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.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; }
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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 = "";
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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>
|
||||
|
Reference in New Issue
Block a user