Files
crystall-punk-14/Content.Client/GameObjects/Components/Actor/CharacterInfoComponent.cs

161 lines
5.6 KiB
C#
Raw Normal View History

#nullable enable
2019-07-20 14:06:54 +02:00
using Content.Client.GameObjects.Components.Mobs;
using Content.Client.UserInterface;
using Content.Client.UserInterface.Stylesheets;
using Content.Shared.GameObjects.Components.Actor;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement;
2019-07-20 14:06:54 +02:00
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.Utility;
2019-07-20 14:06:54 +02:00
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
using Robust.Shared.Maths;
using Robust.Shared.Network;
using Robust.Shared.Players;
2019-07-20 14:06:54 +02:00
namespace Content.Client.GameObjects.Components.Actor
{
2019-07-31 15:02:36 +02:00
[RegisterComponent]
public sealed class CharacterInfoComponent : SharedCharacterInfoComponent, ICharacterUI
2019-07-20 14:06:54 +02:00
{
[Dependency] private readonly IResourceCache _resourceCache = default!;
2019-07-20 14:06:54 +02:00
private CharacterInfoControl _control = default!;
2019-07-20 14:06:54 +02:00
public Control Scene { get; private set; } = default!;
2019-07-20 14:06:54 +02:00
public UIPriority Priority => UIPriority.Info;
public override void OnAdd()
{
base.OnAdd();
Scene = _control = new CharacterInfoControl(_resourceCache);
2019-07-20 14:06:54 +02:00
}
public void Opened()
{
SendNetworkMessage(new RequestCharacterInfoMessage());
}
public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null)
2019-07-20 14:06:54 +02:00
{
base.HandleNetworkMessage(message, netChannel, session);
2019-07-20 14:06:54 +02:00
switch (message)
2019-07-20 14:06:54 +02:00
{
case CharacterInfoMessage characterInfoMessage:
_control.UpdateUI(characterInfoMessage);
if (Owner.TryGetComponent(out ISpriteComponent? spriteComponent))
{
_control.SpriteView.Sprite = spriteComponent;
}
2019-07-20 14:06:54 +02:00
_control.NameLabel.Text = Owner.Name;
break;
}
2019-07-20 14:06:54 +02:00
}
private sealed class CharacterInfoControl : VBoxContainer
{
public SpriteView SpriteView { get; }
public Label NameLabel { get; }
public Label SubText { get; }
public VBoxContainer ObjectivesContainer { get; }
public CharacterInfoControl(IResourceCache resourceCache)
2019-07-20 14:06:54 +02:00
{
IoCManager.InjectDependencies(this);
2019-07-20 14:06:54 +02:00
AddChild(new HBoxContainer
{
Children =
{
2019-07-20 16:01:01 +02:00
(SpriteView = new SpriteView { Scale = (2, 2)}),
2019-07-20 14:06:54 +02:00
new VBoxContainer
{
SizeFlagsVertical = SizeFlags.None,
Children =
{
(NameLabel = new Label()),
(SubText = new Label
{
SizeFlagsVertical = SizeFlags.None,
StyleClasses = {StyleNano.StyleClassLabelSubText},
2019-07-20 14:06:54 +02:00
})
}
}
}
});
AddChild(new Placeholder(resourceCache)
{
PlaceholderText = Loc.GetString("Health & status effects")
2019-07-20 14:06:54 +02:00
});
AddChild(new Label
2019-07-20 14:06:54 +02:00
{
Text = Loc.GetString("Objectives"),
SizeFlagsHorizontal = SizeFlags.ShrinkCenter
2019-07-20 14:06:54 +02:00
});
ObjectivesContainer = new VBoxContainer();
AddChild(ObjectivesContainer);
2019-07-20 14:06:54 +02:00
AddChild(new Placeholder(resourceCache)
{
PlaceholderText = Loc.GetString("Antagonist Roles")
2019-07-20 14:06:54 +02:00
});
}
public void UpdateUI(CharacterInfoMessage characterInfoMessage)
{
SubText.Text = characterInfoMessage.JobTitle;
ObjectivesContainer.RemoveAllChildren();
foreach (var (groupId, objectiveConditions) in characterInfoMessage.Objectives)
{
var vbox = new VBoxContainer
{
Modulate = Color.Gray
};
vbox.AddChild(new Label
{
Text = groupId,
Modulate = Color.LightSkyBlue
});
foreach (var objectiveCondition in objectiveConditions)
{
var hbox = new HBoxContainer();
hbox.AddChild(new ProgressTextureRect
{
Texture = objectiveCondition.SpriteSpecifier.Frame0(),
Progress = objectiveCondition.Progress,
SizeFlagsVertical = SizeFlags.ShrinkCenter
});
hbox.AddChild(new Control
{
CustomMinimumSize = (10,0)
});
hbox.AddChild(new VBoxContainer
{
Children =
{
new Label{Text = objectiveCondition.Title},
new Label{Text = objectiveCondition.Description}
}
}
);
vbox.AddChild(hbox);
}
ObjectivesContainer.AddChild(vbox);
}
}
2019-07-20 14:06:54 +02:00
}
}
}