@@ -1,35 +0,0 @@
|
||||
using Content.Server.Antag.Components;
|
||||
using Content.Server.Objectives;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Objectives.Systems;
|
||||
|
||||
namespace Content.Server.Antag;
|
||||
|
||||
/// <summary>
|
||||
/// Adds fixed objectives to an antag made with <c>AntagObjectivesComponent</c>.
|
||||
/// </summary>
|
||||
public sealed class AntagObjectivesSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<AntagObjectivesComponent, AfterAntagEntitySelectedEvent>(OnAntagSelected);
|
||||
}
|
||||
|
||||
private void OnAntagSelected(Entity<AntagObjectivesComponent> ent, ref AfterAntagEntitySelectedEvent args)
|
||||
{
|
||||
if (!_mind.TryGetMind(args.Session, out var mindId, out var mind))
|
||||
{
|
||||
Log.Error($"Antag {ToPrettyString(args.EntityUid):player} was selected by {ToPrettyString(ent):rule} but had no mind attached!");
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var id in ent.Comp.Objectives)
|
||||
{
|
||||
_mind.TryAddObjective(mindId, mind, id);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
using Content.Server.Antag.Components;
|
||||
using Content.Server.Objectives;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Objectives.Components;
|
||||
using Content.Shared.Objectives.Systems;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server.Antag;
|
||||
|
||||
/// <summary>
|
||||
/// Adds fixed objectives to an antag made with <c>AntagRandomObjectivesComponent</c>.
|
||||
/// </summary>
|
||||
public sealed class AntagRandomObjectivesSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly SharedMindSystem _mind = default!;
|
||||
[Dependency] private readonly ObjectivesSystem _objectives = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<AntagRandomObjectivesComponent, AfterAntagEntitySelectedEvent>(OnAntagSelected);
|
||||
}
|
||||
|
||||
private void OnAntagSelected(Entity<AntagRandomObjectivesComponent> ent, ref AfterAntagEntitySelectedEvent args)
|
||||
{
|
||||
if (!_mind.TryGetMind(args.Session, out var mindId, out var mind))
|
||||
{
|
||||
Log.Error($"Antag {ToPrettyString(args.EntityUid):player} was selected by {ToPrettyString(ent):rule} but had no mind attached!");
|
||||
return;
|
||||
}
|
||||
|
||||
var difficulty = 0f;
|
||||
foreach (var set in ent.Comp.Sets)
|
||||
{
|
||||
if (!_random.Prob(set.Prob))
|
||||
continue;
|
||||
|
||||
for (var pick = 0; pick < set.MaxPicks && ent.Comp.MaxDifficulty > difficulty; pick++)
|
||||
{
|
||||
if (_objectives.GetRandomObjective(mindId, mind, set.Groups) is not {} objective)
|
||||
continue;
|
||||
|
||||
_mind.AddObjective(mindId, mind, objective);
|
||||
var adding = Comp<ObjectiveComponent>(objective).Difficulty;
|
||||
difficulty += adding;
|
||||
Log.Debug($"Added objective {ToPrettyString(objective):objective} to {ToPrettyString(args.EntityUid):player} with {adding} difficulty");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -147,7 +147,7 @@ public sealed partial class AntagSelectionSystem
|
||||
}
|
||||
|
||||
/// <remarks>
|
||||
/// Helper to get just the mind entities and not names.
|
||||
/// Helper specifically for <see cref="ObjectivesTextGetInfoEvent"/>
|
||||
/// </remarks>
|
||||
public List<EntityUid> GetAntagMindEntityUids(Entity<AntagSelectionComponent?> ent)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,6 @@ using Content.Server.GameTicking.Rules;
|
||||
using Content.Server.Ghost.Roles;
|
||||
using Content.Server.Ghost.Roles.Components;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Objectives;
|
||||
using Content.Server.Preferences.Managers;
|
||||
using Content.Server.Roles;
|
||||
using Content.Server.Roles.Jobs;
|
||||
@@ -26,11 +25,10 @@ using Robust.Shared.Enums;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Random;
|
||||
using Robust.Shared.Utility;
|
||||
using Content.Server._Miracle.GulagSystem;
|
||||
using Content.Server._White.Sponsors;
|
||||
using Content.Server.Inventory;
|
||||
using Content.Shared.GameTicking;
|
||||
using FastAccessors;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Server.Antag;
|
||||
@@ -61,8 +59,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
|
||||
|
||||
SubscribeLocalEvent<GhostRoleAntagSpawnerComponent, TakeGhostRoleEvent>(OnTakeGhostRole);
|
||||
|
||||
SubscribeLocalEvent<AntagSelectionComponent, ObjectivesTextGetInfoEvent>(OnObjectivesTextGetInfo);
|
||||
|
||||
SubscribeLocalEvent<RulePlayerSpawningEvent>(OnPlayerSpawning);
|
||||
SubscribeLocalEvent<RulePlayerJobsAssignedEvent>(OnJobsAssigned);
|
||||
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnSpawnComplete);
|
||||
@@ -460,15 +456,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem<AntagSelection
|
||||
return true;
|
||||
}
|
||||
|
||||
private void OnObjectivesTextGetInfo(Entity<AntagSelectionComponent> ent, ref ObjectivesTextGetInfoEvent args)
|
||||
{
|
||||
if (ent.Comp.AgentName is not {} name)
|
||||
return;
|
||||
|
||||
args.Minds = ent.Comp.SelectedMinds;
|
||||
args.AgentName = Loc.GetString(name);
|
||||
}
|
||||
|
||||
public float GetPremiumPoolChance(ICommonSession session)
|
||||
{
|
||||
if (!_sponsors.TryGetInfo(session.UserId, out var info))
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
using Content.Server.Antag;
|
||||
using Content.Shared.Objectives.Components;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Antag.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Gives antags selected by this rule a fixed list of objectives.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(AntagObjectivesSystem))]
|
||||
public sealed partial class AntagObjectivesComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// List of static objectives to give.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public List<EntProtoId<ObjectiveComponent>> Objectives = new();
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
using Content.Server.Antag;
|
||||
using Content.Shared.Random;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Antag.Components;
|
||||
|
||||
/// <summary>
|
||||
/// Gives antags selected by this rule a random list of objectives.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(AntagRandomObjectivesSystem))]
|
||||
public sealed partial class AntagRandomObjectivesComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Each set of objectives to add.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public List<AntagObjectiveSet> Sets = new();
|
||||
|
||||
/// <summary>
|
||||
/// If the total difficulty of the currently given objectives exceeds, no more will be given.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public float MaxDifficulty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A set of objectives to try picking.
|
||||
/// Difficulty is checked over all sets, but each set has its own probability and pick count.
|
||||
/// </summary>
|
||||
[DataRecord]
|
||||
public record struct AntagObjectiveSet()
|
||||
{
|
||||
/// <summary>
|
||||
/// The grouping used by the objective system to pick random objectives.
|
||||
/// First a group is picked from these, then an objective from that group.
|
||||
/// </summary>
|
||||
[DataField(required: true)]
|
||||
public ProtoId<WeightedRandomPrototype> Groups = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Probability of this set being used.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public float Prob = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// Number of times to try picking objectives from this set.
|
||||
/// Even if there is enough difficulty remaining, no more will be given after this.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public int MaxPicks = 20;
|
||||
}
|
||||
@@ -41,13 +41,6 @@ public sealed partial class AntagSelectionComponent : Component
|
||||
/// Is not serialized.
|
||||
/// </summary>
|
||||
public HashSet<ICommonSession> SelectedSessions = new();
|
||||
|
||||
/// <summary>
|
||||
/// Locale id for the name of the antag.
|
||||
/// If this is set then the antag is listed in the round-end summary.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public LocId? AgentName;
|
||||
}
|
||||
|
||||
[DataDefinition]
|
||||
|
||||
Reference in New Issue
Block a user