From ab47b92ad2c4907a9b3c323c8ff630639c2b265e Mon Sep 17 00:00:00 2001 From: Ed Date: Tue, 23 Sep 2025 22:46:46 +0300 Subject: [PATCH] rules can add modifiers to map! --- .../CP14StationAdditionalModifierRule.cs | 24 +++++++++++++++++++ ...4StationAdditionalModifierRuleComponent.cs | 11 +++++++++ .../CP14LocationGenerationSystem.cs | 23 +++++++++++++++++- .../CP14WeatherControllerComponent.cs | 2 +- Resources/Prototypes/_CP14/game_presets.yml | 24 ++++++------------- 5 files changed, 65 insertions(+), 19 deletions(-) create mode 100644 Content.Server/_CP14/GameTicking/Rules/CP14StationAdditionalModifierRule.cs create mode 100644 Content.Server/_CP14/GameTicking/Rules/Components/CP14StationAdditionalModifierRuleComponent.cs diff --git a/Content.Server/_CP14/GameTicking/Rules/CP14StationAdditionalModifierRule.cs b/Content.Server/_CP14/GameTicking/Rules/CP14StationAdditionalModifierRule.cs new file mode 100644 index 0000000000..586b3c88a6 --- /dev/null +++ b/Content.Server/_CP14/GameTicking/Rules/CP14StationAdditionalModifierRule.cs @@ -0,0 +1,24 @@ +using Content.Server._CP14.GameTicking.Rules.Components; +using Content.Server._CP14.Procedural; +using Content.Server.GameTicking.Rules; + +namespace Content.Server._CP14.GameTicking.Rules; + +public sealed class CP14StationAdditionalModifierRule : GameRuleSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnBeforeStationLocationGeneration); + } + + private void OnBeforeStationLocationGeneration(CP14BeforeStationLocationGenerationEvent ev) + { + var query = QueryAllRules(); + while (query.MoveNext(out var uid, out var huntRule, out var gameRule)) + { + ev.AddModifiers(huntRule.Modifiers); + } + } +} diff --git a/Content.Server/_CP14/GameTicking/Rules/Components/CP14StationAdditionalModifierRuleComponent.cs b/Content.Server/_CP14/GameTicking/Rules/Components/CP14StationAdditionalModifierRuleComponent.cs new file mode 100644 index 0000000000..b13e021c48 --- /dev/null +++ b/Content.Server/_CP14/GameTicking/Rules/Components/CP14StationAdditionalModifierRuleComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared._CP14.Procedural.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.GameTicking.Rules.Components; + +[RegisterComponent, Access(typeof(CP14StationAdditionalModifierRule))] +public sealed partial class CP14StationAdditionalModifierRuleComponent : Component +{ + [DataField(required: true)] + public List> Modifiers; +} diff --git a/Content.Server/_CP14/Procedural/CP14LocationGenerationSystem.cs b/Content.Server/_CP14/Procedural/CP14LocationGenerationSystem.cs index 1ad9c2a66f..7afd9da44c 100644 --- a/Content.Server/_CP14/Procedural/CP14LocationGenerationSystem.cs +++ b/Content.Server/_CP14/Procedural/CP14LocationGenerationSystem.cs @@ -49,9 +49,12 @@ public sealed class CP14LocationGenerationSystem : EntitySystem return; } + var ev = new CP14BeforeStationLocationGenerationEvent(ent.Comp.Modifiers); + RaiseLocalEvent(ent, ev, true); + var mapId = _transform.GetMapId(largestStationGrid.Value); - GenerateLocation(largestStationGrid.Value, mapId, ent.Comp.Location, ent.Comp.Modifiers); + GenerateLocation(largestStationGrid.Value, mapId, ent.Comp.Location, ev.Modifiers); } public override void Update(float frameTime) @@ -121,3 +124,21 @@ public sealed class CP14LocationGenerationSystem : EntitySystem } } } + +/// +/// Called before procedural location generation on the main map so that other systems can edit modifiers added to the map. +/// +public sealed class CP14BeforeStationLocationGenerationEvent(List> modifiers) : EntityEventArgs +{ + public List> Modifiers = modifiers; + + public void AddModifier(ProtoId toAdd) + { + Modifiers.Add(toAdd); + } + + public void AddModifiers(IEnumerable> toAdd) + { + Modifiers.AddRange(toAdd); + } +} diff --git a/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs b/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs index f70091884b..db6fdd8113 100644 --- a/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs +++ b/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs @@ -6,7 +6,7 @@ namespace Content.Server._CP14.WeatherControl; /// /// is the controller that hangs on the prototype map. It regulates which weather rules are run and where they are run. /// -[RegisterComponent, AutoGenerateComponentPause, Access(typeof(CP14WeatherControllerSystem), typeof(CP14WeatherRule))] +[RegisterComponent, AutoGenerateComponentPause, Access(typeof(CP14WeatherControllerSystem))] public sealed partial class CP14WeatherControllerComponent : Component { [DataField] diff --git a/Resources/Prototypes/_CP14/game_presets.yml b/Resources/Prototypes/_CP14/game_presets.yml index 4b9ef64181..41313973ef 100644 --- a/Resources/Prototypes/_CP14/game_presets.yml +++ b/Resources/Prototypes/_CP14/game_presets.yml @@ -19,8 +19,9 @@ showInVote: false cP14Allowed: true rules: - - CP14BasicStationEventScheduler + #- CP14BasicStationEventScheduler - Sandbox + - CP14LurkerHuntRule - type: gamePreset id: CP14Peaceful @@ -28,8 +29,8 @@ description: cp14-peaceful-description showInVote: true cP14Allowed: true - rules: - - CP14BasicStationEventScheduler + #rules: + # - CP14BasicStationEventScheduler - type: gamePreset id: CP14VampireClansBattleDouble @@ -40,7 +41,7 @@ minPlayers: 20 maxPlayers: 29 rules: - - CP14BasicStationEventScheduler + #- CP14BasicStationEventScheduler - CP14GameRuleVampireClanBattleDouble - type: gamePreset @@ -51,16 +52,5 @@ cP14Allowed: true minPlayers: 30 rules: - - CP14BasicStationEventScheduler - - CP14GameRuleVampireClanBattleTriple - -#- type: gamePreset -# id: CP14Survival -# name: cp14-gamemode-survival-title -# description: cp14-gamemode-survival-description -# showInVote: true -# cP14Allowed: true -# supportedMaps: ShipMapPool -# rules: -# - Sandbox -# - CP14CrashToWindlandsRule \ No newline at end of file + #- CP14BasicStationEventScheduler + - CP14GameRuleVampireClanBattleTriple \ No newline at end of file