ECS and cleanup body system, merge body templates and presets into body prototypes (#11991)

Co-authored-by: Jezithyr <Jezithyr@gmail.com>
This commit is contained in:
DrSmugleaf
2022-10-23 00:46:28 +02:00
committed by GitHub
parent 9a38736c3c
commit f323fb7644
140 changed files with 2478 additions and 2571 deletions

View File

@@ -1,11 +1,10 @@
using System.Linq;
using Content.Shared.Body.Components;
using Content.Shared.Body.Part;
using Content.Shared.Body.Systems;
using Content.Shared.Damage;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Localization;
using static Robust.Client.UserInterface.Controls.BoxContainer;
using static Robust.Client.UserInterface.Controls.ItemList;
@@ -14,7 +13,8 @@ namespace Content.Client.Body.UI
public sealed class BodyScannerDisplay : DefaultWindow
{
private EntityUid? _currentEntity;
private SharedBodyPartComponent? _currentBodyPart;
private BodyPartComponent? _currentBodyPart;
private readonly Dictionary<int, BodyPartSlot> _bodyPartsList = new();
public BodyScannerDisplay(BodyScannerBoundUserInterface owner)
{
@@ -106,75 +106,79 @@ namespace Content.Client.Body.UI
{
_currentEntity = entity;
BodyPartList.Clear();
_bodyPartsList.Clear();
var body = IoCManager.Resolve<IEntityManager>().GetComponentOrNull<SharedBodyComponent>(_currentEntity);
if (body == null)
var bodySystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<SharedBodySystem>();
var i = 0;
foreach (var part in bodySystem.GetBodyChildren(_currentEntity))
{
return;
}
foreach (var (part, _) in body.Parts)
{
BodyPartList.AddItem(Loc.GetString(part.Name));
_bodyPartsList[i++] = part.Component.ParentSlot!;
BodyPartList.AddItem(Loc.GetString(part.Component.Name));
}
}
public void BodyPartOnItemSelected(ItemListSelectedEventArgs args)
{
if (!IoCManager.Resolve<IEntityManager>().TryGetComponent<SharedBodyComponent>(_currentEntity, out var body))
{
return;
}
var entMan = IoCManager.Resolve<IEntityManager>();
var slot = body.SlotAt(args.ItemIndex);
_currentBodyPart = body.PartAt(args.ItemIndex).Key;
_currentBodyPart = entMan.GetComponentOrNull<BodyPartComponent>(_bodyPartsList[args.ItemIndex].Child);
if (slot.Part != null)
if (_currentBodyPart is {ParentSlot.Id: var slotId} part)
{
UpdateBodyPartBox(slot.Part, slot.Id);
UpdateBodyPartBox(part, slotId);
}
}
private void UpdateBodyPartBox(SharedBodyPartComponent part, string slotName)
private void UpdateBodyPartBox(BodyPartComponent part, string slotName)
{
var entMan = IoCManager.Resolve<IEntityManager>();
BodyPartLabel.Text = $"{Loc.GetString(slotName)}: {Loc.GetString(entMan.GetComponent<MetaDataComponent>(part.Owner).EntityName)}";
BodyPartLabel.Text =
$"{Loc.GetString(slotName)}: {Loc.GetString(entMan.GetComponent<MetaDataComponent>(part.Owner).EntityName)}";
// TODO BODY Part damage
if (entMan.TryGetComponent(part.Owner, out DamageableComponent? damageable))
{
BodyPartHealth.Text = Loc.GetString("body-scanner-display-body-part-damage-text",("damage", damageable.TotalDamage));
BodyPartHealth.Text = Loc.GetString("body-scanner-display-body-part-damage-text",
("damage", damageable.TotalDamage));
}
MechanismList.Clear();
foreach (var mechanism in part.Mechanisms)
var bodySystem = entMan.System<SharedBodySystem>();
foreach (var organ in bodySystem.GetPartOrgans(part.Owner, part))
{
MechanismList.AddItem(mechanism.Name);
var organName = entMan.GetComponent<MetaDataComponent>(organ.Id).EntityName;
MechanismList.AddItem(organName);
}
}
// TODO BODY Guaranteed this is going to crash when a part's mechanisms change. This part is left as an exercise for the reader.
public void MechanismOnItemSelected(ItemListSelectedEventArgs args)
{
UpdateMechanismBox(_currentBodyPart?.Mechanisms.ElementAt(args.ItemIndex));
if (_currentBodyPart == null)
{
UpdateMechanismBox(null);
return;
}
var bodySystem = IoCManager.Resolve<IEntityManager>().System<SharedBodySystem>();
var organ = bodySystem.GetPartOrgans(_currentBodyPart.Owner, _currentBodyPart).ElementAt(args.ItemIndex);
UpdateMechanismBox(organ.Id);
}
private void UpdateMechanismBox(MechanismComponent? mechanism)
private void UpdateMechanismBox(EntityUid? organ)
{
// TODO BODY Improve UI
if (mechanism == null)
if (organ == null)
{
MechanismInfoLabel.SetMessage("");
return;
}
// TODO BODY Mechanism description
var message =
Loc.GetString(
$"{mechanism.Name}\nHealth: {mechanism.CurrentDurability}/{mechanism.MaxDurability}");
var entMan = IoCManager.Resolve<IEntityManager>();
var organName = entMan.GetComponent<MetaDataComponent>(organ.Value).EntityName;
var message = Loc.GetString($"{organName}");
MechanismInfoLabel.SetMessage(message);
}
}