using Content.Shared.Random.Helpers; using Content.Shared.Trigger.Components.Conditions; using Content.Shared.Verbs; using Robust.Shared.Random; namespace Content.Shared.Trigger.Systems; public sealed partial class TriggerSystem { private void InitializeCondition() { SubscribeLocalEvent(OnWhitelistTriggerAttempt); SubscribeLocalEvent(OnUseDelayTriggerAttempt); SubscribeLocalEvent(OnToggleTriggerAttempt); SubscribeLocalEvent>(OnToggleGetAltVerbs); SubscribeLocalEvent(OnRandomChanceTriggerAttempt); } private void OnWhitelistTriggerAttempt(Entity ent, ref AttemptTriggerEvent args) { if (args.Key == null || ent.Comp.Keys.Contains(args.Key)) args.Cancelled |= !_whitelist.CheckBoth(args.User, ent.Comp.UserBlacklist, ent.Comp.UserWhitelist); } private void OnUseDelayTriggerAttempt(Entity ent, ref AttemptTriggerEvent args) { if (args.Key == null || ent.Comp.Keys.Contains(args.Key)) args.Cancelled |= _useDelay.IsDelayed(ent.Owner, ent.Comp.UseDelayId); } private void OnToggleTriggerAttempt(Entity ent, ref AttemptTriggerEvent args) { if (args.Key == null || ent.Comp.Keys.Contains(args.Key)) args.Cancelled |= !ent.Comp.Enabled; } private void OnToggleGetAltVerbs(Entity ent, ref GetVerbsEvent args) { if (!args.CanInteract || !args.CanAccess || args.Hands == null) return; var user = args.User; args.Verbs.Add(new AlternativeVerb() { Text = Loc.GetString(ent.Comp.ToggleVerb), Act = () => Toggle(ent, user) }); } private void Toggle(Entity ent, EntityUid user) { var msg = ent.Comp.Enabled ? ent.Comp.ToggleOff : ent.Comp.ToggleOn; _popup.PopupPredicted(Loc.GetString(msg), ent.Owner, user); ent.Comp.Enabled = !ent.Comp.Enabled; Dirty(ent); } private void OnRandomChanceTriggerAttempt(Entity ent, ref AttemptTriggerEvent args) { if (args.Key == null || ent.Comp.Keys.Contains(args.Key)) { // TODO: Replace with RandomPredicted once the engine PR is merged var hash = new List { (int)_timing.CurTick.Value, GetNetEntity(ent).Id, args.User == null ? 0 : GetNetEntity(args.User.Value).Id, }; var seed = SharedRandomExtensions.HashCodeCombine(hash); var rand = new System.Random(seed); args.Cancelled |= !rand.Prob(ent.Comp.SuccessChance); // When not successful, Cancelled = true } } }