using Content.Shared.Ghost; using Content.Shared.Verbs; using Robust.Shared.Utility; namespace Content.Shared.Examine { public abstract partial class ExamineSystemShared : EntitySystem { [Dependency] private readonly IComponentFactory _componentFactory = default!; public const string DefaultIconTexture = "/Textures/Interface/examine-star.png"; public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(OnGroupExamineVerb); _ghostQuery = GetEntityQuery(); } /// /// Called when getting verbs on an object with the GroupExamine component.
/// This checks if any of the ExamineGroups are relevant (has 1 or more of the relevant components on the entity) /// and if so, creates an ExamineVerb details button for the ExamineGroup. ///
private void OnGroupExamineVerb(EntityUid uid, GroupExamineComponent component, GetVerbsEvent args) { foreach (var group in component.Group) { if (!EntityHasComponent(uid, group.Components)) continue; var examineVerb = new ExamineVerb() { Act = () => { SendExamineGroup(args.User, args.Target, group); group.Entries.Clear(); }, Text = Loc.GetString(group.ContextText), Message = Loc.GetString(group.HoverMessage), Category = VerbCategory.Examine, Icon = group.Icon, }; args.Verbs.Add(examineVerb); } } /// /// Checks if the entity has any of the listed . /// public bool EntityHasComponent(EntityUid uid, List components) { foreach (var comp in components) { if (!_componentFactory.TryGetRegistration(comp, out var componentRegistration)) continue; if (!HasComp(uid, componentRegistration.Type)) continue; return true; } return false; } /// /// Sends an ExamineTooltip based on the contents of /// public void SendExamineGroup(EntityUid user, EntityUid target, ExamineGroup group) { var message = new FormattedMessage(); if (group.Title != null) { message.AddMarkupOrThrow(Loc.GetString(group.Title)); message.PushNewline(); } message.AddMessage(GetFormattedMessageFromExamineEntries(group.Entries)); SendExamineTooltip(user, target, message, false, false); } /// A FormattedMessage based on all , sorted. public static FormattedMessage GetFormattedMessageFromExamineEntries(List entries) { var formattedMessage = new FormattedMessage(); entries.Sort((a, b) => (b.Priority.CompareTo(a.Priority))); var first = true; foreach (var entry in entries) { if (!first) { formattedMessage.PushNewline(); } else { first = false; } formattedMessage.AddMessage(entry.Message); } return formattedMessage; } /// /// Either sends the details to a GroupExamineComponent if it finds one, or adds a details examine verb itself. /// public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, List entries, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") { // If the entity has the GroupExamineComponent if (TryComp(verbsEvent.Target, out var groupExamine)) { // Make sure we have the component name as a string var componentName = _componentFactory.GetComponentName(component.GetType()); foreach (var examineGroup in groupExamine.Group) { // If any of the examine groups list of components contain this componentname if (examineGroup.Components.Contains(componentName)) { foreach (var entry in examineGroup.Entries) { // If any of the entries already are from your component, dont do anything else - no doubles! if (entry.Component == componentName) return; } foreach (var entry in entries) { // Otherwise, just add all information to the examine groups entries, and stop there. examineGroup.Entries.Add(entry); } return; } } } var formattedMessage = GetFormattedMessageFromExamineEntries(entries); var examineVerb = new ExamineVerb() { Act = () => { SendExamineTooltip(verbsEvent.User, verbsEvent.Target, formattedMessage, false, false); }, Text = verbText, Message = hoverMessage, Category = VerbCategory.Examine, Icon = new SpriteSpecifier.Texture(new(iconTexture)), }; verbsEvent.Verbs.Add(examineVerb); } /// /// Either adds a details examine verb, or sends the details to a GroupExamineComponent if it finds one. /// public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, ExamineEntry entry, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") { AddDetailedExamineVerb(verbsEvent, component, new List { entry }, verbText, iconTexture, hoverMessage); } /// /// Either adds a details examine verb, or sends the details to a GroupExamineComponent if it finds one. /// public void AddDetailedExamineVerb(GetVerbsEvent verbsEvent, Component component, FormattedMessage message, string verbText, string iconTexture = DefaultIconTexture, string hoverMessage = "") { var componentName = _componentFactory.GetComponentName(component.GetType()); AddDetailedExamineVerb(verbsEvent, component, new ExamineEntry(componentName, 0f, message), verbText, iconTexture, hoverMessage); } } }