diff --git a/Content.Server/Trigger/Systems/GameRuleTriggerSystem.cs b/Content.Server/Trigger/Systems/GameRuleTriggerSystem.cs new file mode 100644 index 0000000000..245b9c8408 --- /dev/null +++ b/Content.Server/Trigger/Systems/GameRuleTriggerSystem.cs @@ -0,0 +1,44 @@ +using Content.Server.Administration.Logs; +using Content.Server.GameTicking; +using Content.Shared.Database; +using Content.Shared.Trigger; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Server.Trigger.Systems; + +/// +/// Trigger system for game rules. +/// +public sealed class GameRuleTriggerSystem : EntitySystem +{ + [Dependency] private readonly GameTicker _ticker = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; + + /// + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(AddRuleOnTrigger); + } + + private void AddRuleOnTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + var rule = _ticker.AddGameRule(ent.Comp.GameRule); + + _adminLogger.Add(LogType.EventStarted, + $"{ToPrettyString(args.User):entity} added a game rule [{ent.Comp.GameRule}]" + + $" via a trigger on {ToPrettyString(ent.Owner):entity}."); + + if (ent.Comp.StartRule && _ticker.RunLevel == GameRunLevel.InRound) + { + _ticker.StartGameRule(rule); + _adminLogger.Add(LogType.EventStarted, $"{ToPrettyString(args.User):entity} started game rule [{ent.Comp.GameRule}]."); + } + + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Components/Effects/AddGameRuleOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/AddGameRuleOnTriggerComponent.cs new file mode 100644 index 0000000000..474272694c --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/AddGameRuleOnTriggerComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.GameTicking.Components; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Adds and starts a new game rule on a trigger. +/// The user is always logged alongside the game rule and this entity. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class AddGameRuleOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The game rule that will be added. Entity requires . + /// + [DataField(required: true), AutoNetworkedField] + public EntProtoId GameRule; + + /// + /// Whether to also start the game rule when adding it. + /// You almost always want this to be true. + /// + [DataField, AutoNetworkedField] + public bool StartRule = true; +}