RandomChance trigger condition (#39543)

* branch names don't matter anyway

* commits are a window to the soul

* requested change

* also requested

* ship it

* remove key

---------

Co-authored-by: iaada <iaada@users.noreply.github.com>
This commit is contained in:
āda
2025-08-12 18:04:29 -05:00
committed by GitHub
parent dcfdd8914a
commit 024301e698
2 changed files with 40 additions and 1 deletions

View File

@@ -0,0 +1,16 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Trigger.Components.Conditions;
/// <summary>
/// This condition will cancel triggers based on random chance.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class RandomChanceTriggerConditionComponent : BaseTriggerConditionComponent
{
/// <summary>
/// Chance for the trigger to succeed.
/// </summary>
[DataField, AutoNetworkedField]
public float SuccessChance = .9f;
}

View File

@@ -1,5 +1,7 @@
using Content.Shared.Trigger.Components.Conditions; using Content.Shared.Random.Helpers;
using Content.Shared.Trigger.Components.Conditions;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using Robust.Shared.Random;
namespace Content.Shared.Trigger.Systems; namespace Content.Shared.Trigger.Systems;
@@ -13,6 +15,8 @@ public sealed partial class TriggerSystem
SubscribeLocalEvent<ToggleTriggerConditionComponent, AttemptTriggerEvent>(OnToggleTriggerAttempt); SubscribeLocalEvent<ToggleTriggerConditionComponent, AttemptTriggerEvent>(OnToggleTriggerAttempt);
SubscribeLocalEvent<ToggleTriggerConditionComponent, GetVerbsEvent<AlternativeVerb>>(OnToggleGetAltVerbs); SubscribeLocalEvent<ToggleTriggerConditionComponent, GetVerbsEvent<AlternativeVerb>>(OnToggleGetAltVerbs);
SubscribeLocalEvent<RandomChanceTriggerConditionComponent, AttemptTriggerEvent>(OnRandomChanceTriggerAttempt);
} }
private void OnWhitelistTriggerAttempt(Entity<WhitelistTriggerConditionComponent> ent, ref AttemptTriggerEvent args) private void OnWhitelistTriggerAttempt(Entity<WhitelistTriggerConditionComponent> ent, ref AttemptTriggerEvent args)
@@ -54,4 +58,23 @@ public sealed partial class TriggerSystem
ent.Comp.Enabled = !ent.Comp.Enabled; ent.Comp.Enabled = !ent.Comp.Enabled;
Dirty(ent); Dirty(ent);
} }
private void OnRandomChanceTriggerAttempt(Entity<RandomChanceTriggerConditionComponent> 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>
{
(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
}
}
} }