ExamineSystem.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System.Linq;
  2. using Content.Server.Verbs;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Verbs;
  5. using JetBrains.Annotations;
  6. using Robust.Shared.Player;
  7. using Robust.Shared.Utility;
  8. namespace Content.Server.Examine
  9. {
  10. [UsedImplicitly]
  11. public sealed class ExamineSystem : ExamineSystemShared
  12. {
  13. [Dependency] private readonly VerbSystem _verbSystem = default!;
  14. private readonly FormattedMessage _entityNotFoundMessage = new();
  15. private readonly FormattedMessage _entityOutOfRangeMessage = new();
  16. public override void Initialize()
  17. {
  18. base.Initialize();
  19. _entityNotFoundMessage.AddText(Loc.GetString("examine-system-entity-does-not-exist"));
  20. _entityOutOfRangeMessage.AddText(Loc.GetString("examine-system-cant-see-entity"));
  21. SubscribeNetworkEvent<ExamineSystemMessages.RequestExamineInfoMessage>(ExamineInfoRequest);
  22. }
  23. public override void SendExamineTooltip(EntityUid player, EntityUid target, FormattedMessage message, bool getVerbs, bool centerAtCursor)
  24. {
  25. if (!TryComp<ActorComponent>(player, out var actor))
  26. return;
  27. var session = actor.PlayerSession;
  28. SortedSet<Verb>? verbs = null;
  29. if (getVerbs)
  30. verbs = _verbSystem.GetLocalVerbs(target, player, typeof(ExamineVerb));
  31. var ev = new ExamineSystemMessages.ExamineInfoResponseMessage(
  32. GetNetEntity(target), 0, message, verbs?.ToList(), centerAtCursor
  33. );
  34. RaiseNetworkEvent(ev, session.Channel);
  35. }
  36. private void ExamineInfoRequest(ExamineSystemMessages.RequestExamineInfoMessage request, EntitySessionEventArgs eventArgs)
  37. {
  38. var player = eventArgs.SenderSession;
  39. var session = eventArgs.SenderSession;
  40. var channel = player.Channel;
  41. var entity = GetEntity(request.NetEntity);
  42. if (session.AttachedEntity is not {Valid: true} playerEnt
  43. || !EntityManager.EntityExists(entity))
  44. {
  45. RaiseNetworkEvent(new ExamineSystemMessages.ExamineInfoResponseMessage(
  46. request.NetEntity, request.Id, _entityNotFoundMessage), channel);
  47. return;
  48. }
  49. if (!CanExamine(playerEnt, entity))
  50. {
  51. RaiseNetworkEvent(new ExamineSystemMessages.ExamineInfoResponseMessage(
  52. request.NetEntity, request.Id, _entityOutOfRangeMessage, knowTarget: false), channel);
  53. return;
  54. }
  55. SortedSet<Verb>? verbs = null;
  56. if (request.GetVerbs)
  57. verbs = _verbSystem.GetLocalVerbs(entity, playerEnt, typeof(ExamineVerb));
  58. var text = GetExamineText(entity, player.AttachedEntity);
  59. RaiseNetworkEvent(new ExamineSystemMessages.ExamineInfoResponseMessage(
  60. request.NetEntity, request.Id, text, verbs?.ToList()), channel);
  61. }
  62. }
  63. }