Latejoin Job Selection (#1284)
* UI version 1 * Latejoining * cleanup * missed a line * Various fixes * comment
This commit is contained in:
@@ -26,7 +26,6 @@ namespace Content.Client.State
|
|||||||
[Dependency] private readonly IGameHud _gameHud;
|
[Dependency] private readonly IGameHud _gameHud;
|
||||||
[Dependency] private readonly IInputManager _inputManager;
|
[Dependency] private readonly IInputManager _inputManager;
|
||||||
[Dependency] private readonly IChatManager _chatManager;
|
[Dependency] private readonly IChatManager _chatManager;
|
||||||
[Dependency] private readonly IClientConGroupController _groupController = default!;
|
|
||||||
#pragma warning restore 649
|
#pragma warning restore 649
|
||||||
|
|
||||||
[ViewVariables] private ChatBox _gameChat;
|
[ViewVariables] private ChatBox _gameChat;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using Robust.Client.Interfaces;
|
|||||||
using Robust.Client.Interfaces.Input;
|
using Robust.Client.Interfaces.Input;
|
||||||
using Robust.Client.Interfaces.ResourceManagement;
|
using Robust.Client.Interfaces.ResourceManagement;
|
||||||
using Robust.Client.Interfaces.UserInterface;
|
using Robust.Client.Interfaces.UserInterface;
|
||||||
|
using Robust.Client.UserInterface.CustomControls;
|
||||||
using Robust.Client.Player;
|
using Robust.Client.Player;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Shared.Input;
|
using Robust.Shared.Input;
|
||||||
@@ -87,7 +88,8 @@ namespace Content.Client.State
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_console.ProcessCommand("joingame");
|
new LateJoinGui().OpenCentered();
|
||||||
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
_lobby.ReadyButton.OnToggled += args =>
|
_lobby.ReadyButton.OnToggled += args =>
|
||||||
|
|||||||
116
Content.Client/UserInterface/LateJoinGui.cs
Normal file
116
Content.Client/UserInterface/LateJoinGui.cs
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
using Robust.Client.Console;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.Utility;
|
||||||
|
using Content.Shared.Jobs;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Localization;
|
||||||
|
using Robust.Shared.Log;
|
||||||
|
using Robust.Shared.Maths;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Robust.Client.UserInterface.CustomControls
|
||||||
|
{
|
||||||
|
public sealed class LateJoinGui : SS14Window
|
||||||
|
{
|
||||||
|
#pragma warning disable 649
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager;
|
||||||
|
[Dependency] private readonly IClientConsole _console;
|
||||||
|
#pragma warning restore 649
|
||||||
|
|
||||||
|
protected override Vector2? CustomSize => (360, 560);
|
||||||
|
|
||||||
|
public event Action<string> SelectedId;
|
||||||
|
|
||||||
|
public LateJoinGui()
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
|
||||||
|
Title = Loc.GetString("Late Join");
|
||||||
|
|
||||||
|
var jobList = new VBoxContainer();
|
||||||
|
var vBox = new VBoxContainer
|
||||||
|
{
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
new ScrollContainer
|
||||||
|
{
|
||||||
|
SizeFlagsVertical = SizeFlags.FillExpand,
|
||||||
|
Children =
|
||||||
|
{
|
||||||
|
jobList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Contents.AddChild(vBox);
|
||||||
|
|
||||||
|
foreach (var job in _prototypeManager.EnumeratePrototypes<JobPrototype>().OrderBy(j => j.Name))
|
||||||
|
{
|
||||||
|
var jobButton = new JobButton
|
||||||
|
{
|
||||||
|
JobId = job.ID
|
||||||
|
};
|
||||||
|
|
||||||
|
var jobSelector = new HBoxContainer
|
||||||
|
{
|
||||||
|
SizeFlagsHorizontal = SizeFlags.FillExpand
|
||||||
|
};
|
||||||
|
|
||||||
|
var icon = new TextureRect
|
||||||
|
{
|
||||||
|
TextureScale = (2, 2),
|
||||||
|
Stretch = TextureRect.StretchMode.KeepCentered
|
||||||
|
};
|
||||||
|
|
||||||
|
if (job.Icon != null)
|
||||||
|
{
|
||||||
|
var specifier = new SpriteSpecifier.Rsi(new ResourcePath("/Textures/Interface/Misc/job_icons.rsi"), job.Icon);
|
||||||
|
icon.Texture = specifier.Frame0();
|
||||||
|
}
|
||||||
|
jobSelector.AddChild(icon);
|
||||||
|
|
||||||
|
var jobLabel = new Label
|
||||||
|
{
|
||||||
|
Text = job.Name
|
||||||
|
};
|
||||||
|
|
||||||
|
jobSelector.AddChild(jobLabel);
|
||||||
|
|
||||||
|
jobButton.AddChild(jobSelector);
|
||||||
|
jobList.AddChild(jobButton);
|
||||||
|
jobButton.OnPressed += args =>
|
||||||
|
{
|
||||||
|
SelectedId?.Invoke(jobButton.JobId);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectedId += jobId =>
|
||||||
|
{
|
||||||
|
Logger.InfoS("latejoin", $"Late joining as ID: {jobId}");
|
||||||
|
_console.ProcessCommand($"joingame {CommandParsing.Escape(jobId)}");
|
||||||
|
Close();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ReturnId()
|
||||||
|
{
|
||||||
|
return SelectedId.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
class JobButton : ContainerButton
|
||||||
|
{
|
||||||
|
public string JobId { get; set; }
|
||||||
|
public JobButton()
|
||||||
|
{
|
||||||
|
AddStyleClass(StyleClassButton);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -53,7 +53,7 @@ namespace Content.IntegrationTests
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MakeJoinGame(IPlayerSession player)
|
public void MakeJoinGame(IPlayerSession player, string jobId)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,5 +109,10 @@ namespace Content.IntegrationTests
|
|||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Dictionary<string, int> GetAvailablePositions()
|
||||||
|
{
|
||||||
|
return new Dictionary<string, int>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ namespace Content.Server.GameTicking
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the remaining available job positions in the current round.
|
/// Gets the remaining available job positions in the current round.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private Dictionary<string, int> GetAvailablePositions()
|
public Dictionary<string, int> GetAvailablePositions()
|
||||||
{
|
{
|
||||||
var basePositions = GetBasePositions(false);
|
var basePositions = GetBasePositions(false);
|
||||||
|
|
||||||
|
|||||||
@@ -352,11 +352,11 @@ namespace Content.Server.GameTicking
|
|||||||
_spawnObserver(player);
|
_spawnObserver(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MakeJoinGame(IPlayerSession player)
|
public void MakeJoinGame(IPlayerSession player, string jobId = null)
|
||||||
{
|
{
|
||||||
if (!_playersInLobby.ContainsKey(player)) return;
|
if (!_playersInLobby.ContainsKey(player)) return;
|
||||||
|
|
||||||
SpawnPlayer(player);
|
SpawnPlayer(player, jobId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ToggleReady(IPlayerSession player, bool ready)
|
public void ToggleReady(IPlayerSession player, bool ready)
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using Content.Server.GameTicking.GamePresets;
|
using System.Collections.Generic;
|
||||||
|
using Content.Server.GameTicking;
|
||||||
using Content.Server.Interfaces.GameTicking;
|
using Content.Server.Interfaces.GameTicking;
|
||||||
using Content.Server.Players;
|
using Content.Server.Players;
|
||||||
|
using Content.Shared.Jobs;
|
||||||
using Robust.Server.Interfaces.Console;
|
using Robust.Server.Interfaces.Console;
|
||||||
using Robust.Server.Interfaces.Player;
|
using Robust.Server.Interfaces.Player;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Log;
|
||||||
|
|
||||||
namespace Content.Server.GameTicking
|
namespace Content.Server.GameTicking
|
||||||
{
|
{
|
||||||
@@ -175,12 +179,20 @@ namespace Content.Server.GameTicking
|
|||||||
|
|
||||||
class JoinGameCommand : IClientCommand
|
class JoinGameCommand : IClientCommand
|
||||||
{
|
{
|
||||||
|
#pragma warning disable 649
|
||||||
|
[Dependency] private IPrototypeManager _prototypeManager;
|
||||||
|
#pragma warning restore 649
|
||||||
public string Command => "joingame";
|
public string Command => "joingame";
|
||||||
public string Description => "";
|
public string Description => "";
|
||||||
public string Help => "";
|
public string Help => "";
|
||||||
|
|
||||||
|
public JoinGameCommand()
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
}
|
||||||
public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
|
public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
|
||||||
{
|
{
|
||||||
|
var output = string.Join(".", args);
|
||||||
if (player == null)
|
if (player == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -192,8 +204,22 @@ namespace Content.Server.GameTicking
|
|||||||
shell.SendText(player, "Round has not started.");
|
shell.SendText(player, "Round has not started.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if(ticker.RunLevel == GameRunLevel.InRound)
|
||||||
|
{
|
||||||
|
string ID = args[0];
|
||||||
|
var positions = ticker.GetAvailablePositions();
|
||||||
|
|
||||||
ticker.MakeJoinGame(player);
|
if(positions.GetValueOrDefault(ID, 0) == 0) //n < 0 is treated as infinite
|
||||||
|
{
|
||||||
|
var jobPrototype = _prototypeManager.Index<JobPrototype>(ID);
|
||||||
|
shell.SendText(player, $"{jobPrototype.Name} has no available slots.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ticker.MakeJoinGame(player, args[0].ToString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ticker.MakeJoinGame(player, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ namespace Content.Server.Interfaces.GameTicking
|
|||||||
|
|
||||||
void Respawn(IPlayerSession targetPlayer);
|
void Respawn(IPlayerSession targetPlayer);
|
||||||
void MakeObserve(IPlayerSession player);
|
void MakeObserve(IPlayerSession player);
|
||||||
void MakeJoinGame(IPlayerSession player);
|
void MakeJoinGame(IPlayerSession player, string jobId);
|
||||||
void ToggleReady(IPlayerSession player, bool ready);
|
void ToggleReady(IPlayerSession player, bool ready);
|
||||||
|
|
||||||
GridCoordinates GetLateJoinSpawnPoint();
|
GridCoordinates GetLateJoinSpawnPoint();
|
||||||
@@ -50,5 +50,7 @@ namespace Content.Server.Interfaces.GameTicking
|
|||||||
bool TogglePause();
|
bool TogglePause();
|
||||||
|
|
||||||
bool DelayStart(TimeSpan time);
|
bool DelayStart(TimeSpan time);
|
||||||
|
|
||||||
|
Dictionary<string, int> GetAvailablePositions();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user