Files
crystall-punk-14/Content.Server/_CP14/Objectives/Systems/CP14TownSendConditionSystem.cs
Ed c21dd891f3 Endscreen message + command objectives updadte (#533)
* add simple end screen common goals

* finish common objectives endscreen

* personal objectives endscreen

* Update personal_objectives.yml

* new empire objectives
2024-11-04 13:41:09 +03:00

103 lines
4.0 KiB
C#

using Content.Server._CP14.Objectives.Components;
using Content.Server.Objectives.Components.Targets;
using Content.Shared._CP14.Cargo;
using Content.Shared.Objectives.Components;
using Content.Shared.Objectives.Systems;
using Content.Shared.Stacks;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Objectives.Systems;
public sealed class CP14TownSendConditionSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedObjectivesSystem _objectives = default!;
private EntityQuery<StealTargetComponent> _stealQuery;
private EntityQuery<StackComponent> _stackQuery;
public override void Initialize()
{
base.Initialize();
_stealQuery = GetEntityQuery<StealTargetComponent>();
_stackQuery = GetEntityQuery<StackComponent>();
SubscribeLocalEvent<CP14TownSendConditionComponent, ObjectiveAssignedEvent>(OnAssigned);
SubscribeLocalEvent<CP14TownSendConditionComponent, ObjectiveAfterAssignEvent>(OnAfterAssign);
SubscribeLocalEvent<CP14TownSendConditionComponent, ObjectiveGetProgressEvent>(OnGetProgress);
SubscribeLocalEvent<BeforeSellEntities>(OnBeforeSell);
}
private void OnBeforeSell(BeforeSellEntities ev)
{
var query = EntityQueryEnumerator<CP14TownSendConditionComponent>();
HashSet<EntityUid> removed = new();
while (query.MoveNext(out var uid, out var condition))
{
foreach (var sentEnt in ev.Sent)
{
if (condition.CollectionSent >= condition.CollectionSize)
continue;
if (!_stealQuery.TryComp(sentEnt, out var stealTarget))
continue;
if (stealTarget.StealGroup != condition.CollectGroup)
continue;
if (_stackQuery.TryComp(sentEnt, out var stack))
{
condition.CollectionSent += stack.Count;
}
else
{
condition.CollectionSent++;
}
if (!removed.Contains(sentEnt))
removed.Add(sentEnt);
}
}
foreach (var remove in removed)
{
ev.Sent.Remove(remove);
QueueDel(remove);
}
}
private void OnAssigned(Entity<CP14TownSendConditionComponent> condition, ref ObjectiveAssignedEvent args)
{
//TODO: Add ability to create mindfree objectives to Wizden
//condition.Comp.CollectionSize = _random.Next(condition.Comp.MinCollectionSize, condition.Comp.MaxCollectionSize);
}
//Set the visual, name, icon for the objective.
private void OnAfterAssign(Entity<CP14TownSendConditionComponent> condition, ref ObjectiveAfterAssignEvent args)
{
condition.Comp.CollectionSize = _random.Next(condition.Comp.MinCollectionSize, condition.Comp.MaxCollectionSize);
var group = _proto.Index(condition.Comp.CollectGroup);
var title = Loc.GetString(condition.Comp.ObjectiveText, ("itemName", Loc.GetString(group.Name)), ("count", condition.Comp.CollectionSize));
var description = Loc.GetString(condition.Comp.DescriptionText, ("itemName", Loc.GetString(group.Name)), ("count", condition.Comp.CollectionSize));
_metaData.SetEntityName(condition.Owner, title, args.Meta);
_metaData.SetEntityDescription(condition.Owner, description, args.Meta);
_objectives.SetIcon(condition.Owner, group.Sprite, args.Objective);
}
private void OnGetProgress(Entity<CP14TownSendConditionComponent> condition, ref ObjectiveGetProgressEvent args)
{
var result = (float)condition.Comp.CollectionSent / (float)condition.Comp.CollectionSize;
result = Math.Clamp(result, 0, 1);
args.Progress = result;
}
}