using System; using System.Text; using Content.Shared.Input; using SS14.Server.GameObjects.EntitySystems; using SS14.Server.Interfaces.Chat; using SS14.Server.Interfaces.Player; using SS14.Shared.GameObjects; using SS14.Shared.GameObjects.Systems; using SS14.Shared.Input; using SS14.Shared.Interfaces.GameObjects.Components; using SS14.Shared.IoC; using SS14.Shared.Log; using SS14.Shared.Map; using SS14.Shared.Players; namespace Content.Server.GameObjects.EntitySystems { public interface IExamine { /// /// Returns an status examine value for components appended to the end of the description of the entity /// /// string Examine(); } public class ExamineSystem : EntitySystem { /// public override void Initialize() { var inputSys = EntitySystemManager.GetEntitySystem(); inputSys.BindMap.BindFunction(ContentKeyFunctions.ExamineEntity, new PointerInputCmdHandler(HandleExamine)); } private void HandleExamine(ICommonSession session, GridLocalCoordinates coords, EntityUid uid) { if (!(session is IPlayerSession svSession)) return; var playerEnt = svSession.AttachedEntity; if (!EntityManager.TryGetEntity(uid, out var examined)) return; //Verify player has a transform component if (!playerEnt.TryGetComponent(out var playerTransform)) { return; } //Verify player is on the same map as the entity he clicked on if (coords.MapID != playerTransform.MapID) { Logger.WarningS("sys.examine", $"Player named {session.Name} clicked on a map he isn't located on"); return; } //Start a StringBuilder since we have no idea how many times this could be appended to var fullExamineText = new StringBuilder("This is " + examined.Name); //Add an entity description if one is declared if (!string.IsNullOrEmpty(examined.Description)) { fullExamineText.Append(Environment.NewLine + examined.Description); } //Add component statuses from components that report one foreach (var examineComponents in examined.GetAllComponents()) { var componentDescription = examineComponents.Examine(); if (string.IsNullOrEmpty(componentDescription)) continue; fullExamineText.Append(Environment.NewLine); fullExamineText.Append(componentDescription); } //Send to client chat channel IoCManager.Resolve().DispatchMessage(SS14.Shared.Console.ChatChannel.Visual, fullExamineText.ToString(), session.Index); } } }