| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- using Content.Server.Administration.Logs;
- using Content.Shared.Database;
- using Content.Shared.Popups;
- using Content.Shared.Throwing;
- using Robust.Shared.Audio.Systems;
- using Robust.Shared.Containers;
- using Robust.Shared.Random;
- namespace Content.Server.Containers;
- public sealed class ThrowInsertContainerSystem : EntitySystem
- {
- [Dependency] private readonly IAdminLogManager _adminLogger = default!;
- [Dependency] private readonly SharedAudioSystem _audio = default!;
- [Dependency] private readonly SharedContainerSystem _containerSystem = default!;
- [Dependency] private readonly SharedPopupSystem _popup = default!;
- [Dependency] private readonly IRobustRandom _random = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<ThrowInsertContainerComponent, ThrowHitByEvent>(OnThrowCollide);
- }
- private void OnThrowCollide(Entity<ThrowInsertContainerComponent> ent, ref ThrowHitByEvent args)
- {
- var container = _containerSystem.GetContainer(ent, ent.Comp.ContainerId);
- if (!_containerSystem.CanInsert(args.Thrown, container))
- return;
- var beforeThrowArgs = new BeforeThrowInsertEvent(args.Thrown);
- RaiseLocalEvent(ent, ref beforeThrowArgs);
- if (beforeThrowArgs.Cancelled)
- return;
- if (_random.Prob(ent.Comp.Probability))
- {
- _audio.PlayPvs(ent.Comp.MissSound, ent);
- _popup.PopupEntity(Loc.GetString(ent.Comp.MissLocString), ent);
- return;
- }
- if (!_containerSystem.Insert(args.Thrown, container))
- throw new InvalidOperationException("Container insertion failed but CanInsert returned true");
- _audio.PlayPvs(ent.Comp.InsertSound, ent);
- if (args.Component.Thrower != null)
- _adminLogger.Add(LogType.Landed, LogImpact.Low, $"{ToPrettyString(args.Thrown)} thrown by {ToPrettyString(args.Component.Thrower.Value):player} landed in {ToPrettyString(ent)}");
- }
- }
- /// <summary>
- /// Sent before the insertion is made.
- /// Allows preventing the insertion if any system on the entity should need to.
- /// </summary>
- [ByRefEvent]
- public record struct BeforeThrowInsertEvent(EntityUid ThrownEntity, bool Cancelled = false);
|