diff --git a/Content.Shared/_CP14/Knowledge/CP14KnowledgePaperTextSystem.cs b/Content.Shared/_CP14/Knowledge/CP14KnowledgePaperTextSystem.cs new file mode 100644 index 0000000000..3101ba75a7 --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/CP14KnowledgePaperTextSystem.cs @@ -0,0 +1,62 @@ +using System.Text; +using Content.Shared._CP14.Knowledge.Components; +using Content.Shared.Paper; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Knowledge; + +public sealed class CP14KnowledgePaperTextSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly PaperSystem _paper = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnPaperMapInit); + } + + private void OnPaperMapInit(Entity ent, ref MapInitEvent args) + { + if (!TryComp(ent, out var paperComponent)) + return; + + var paper = new Entity(ent, paperComponent); + + if (!TryComp(ent, out var knowledge)) + return; + + if (knowledge.Knowledge.Count == 0) + return; + + var content = GenerateText(knowledge); + + _paper.SetContent(paper, content); + paper.Comp.EditingDisabled = true; + + // Yes we need to do synchronization after such changes, + // yes predict, but we need to + Dirty(paper); + } + + private string GenerateText(CP14KnowledgeLearningSourceComponent source) + { + var stringBuilder = new StringBuilder(); + + // Header + stringBuilder.Append(Loc.GetString("cp14-knowledge-book-pre-text")); + + // Main body + foreach (var prototypeId in source.Knowledge) + { + if (!_prototype.TryIndex(prototypeId, out var indexedKnowledge)) + continue; + + stringBuilder.Append($"\n{Loc.GetString(indexedKnowledge.Desc)}"); + } + + // Footer + stringBuilder.Append($"\n\n{Loc.GetString("cp14-knowledge-book-post-text")}"); + + return stringBuilder.ToString(); + } +} diff --git a/Content.Shared/_CP14/Knowledge/Components/CP14AllKnowingComponent.cs b/Content.Shared/_CP14/Knowledge/Components/CP14AllKnowingComponent.cs new file mode 100644 index 0000000000..f110be086d --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/Components/CP14AllKnowingComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Knowledge.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class CP14AllKnowingComponent : Component; diff --git a/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeInfoEvent.cs b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeInfoEvent.cs new file mode 100644 index 0000000000..638cb24e29 --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeInfoEvent.cs @@ -0,0 +1,18 @@ +using Content.Shared._CP14.Knowledge.Prototypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Knowledge.Events; + +[Serializable, NetSerializable] +public sealed class CP14KnowledgeInfoEvent : EntityEventArgs +{ + public readonly NetEntity NetEntity; + public readonly HashSet> AllKnowledge; + + public CP14KnowledgeInfoEvent(NetEntity netEntity, HashSet> allKnowledge) + { + NetEntity = netEntity; + AllKnowledge = allKnowledge; + } +} diff --git a/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeLearnDoAfterEvent.cs b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeLearnDoAfterEvent.cs new file mode 100644 index 0000000000..3a015e09ac --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeLearnDoAfterEvent.cs @@ -0,0 +1,17 @@ +using Content.Shared._CP14.Knowledge.Prototypes; +using Content.Shared.DoAfter; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Knowledge.Events; + +[Serializable, NetSerializable] +public sealed partial class CP14KnowledgeLearnDoAfterEvent : DoAfterEvent +{ + public ProtoId Knowledge; + + public override DoAfterEvent Clone() + { + return this; + } +} diff --git a/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeUsedEvent.cs b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeUsedEvent.cs new file mode 100644 index 0000000000..df5049bb3f --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/Events/CP14KnowledgeUsedEvent.cs @@ -0,0 +1,18 @@ +using Content.Shared._CP14.Knowledge.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Knowledge.Events; + +public sealed class CP14KnowledgeUsedEvent : EntityEventArgs +{ + public readonly EntityUid User; + public readonly ProtoId Knowledge; + public readonly float Factor; + + public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId knowledge, float factor) + { + User = uid; + Knowledge = knowledge; + Factor = factor; + } +} diff --git a/Content.Shared/_CP14/Knowledge/Events/CP14RequestKnowledgeInfoEvent.cs b/Content.Shared/_CP14/Knowledge/Events/CP14RequestKnowledgeInfoEvent.cs new file mode 100644 index 0000000000..9ac9261a5e --- /dev/null +++ b/Content.Shared/_CP14/Knowledge/Events/CP14RequestKnowledgeInfoEvent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Knowledge.Events; + +[Serializable, NetSerializable] +public sealed class CP14RequestKnowledgeInfoEvent : EntityEventArgs +{ + public readonly NetEntity NetEntity; + + public CP14RequestKnowledgeInfoEvent(NetEntity netEntity) + { + NetEntity = netEntity; + } +} diff --git a/Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs b/Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs index 2d6f0ef7d5..164a16bb98 100644 --- a/Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs +++ b/Content.Shared/_CP14/Knowledge/SharedCP14KnowledgeSystem.cs @@ -1,5 +1,6 @@ using System.Text; using Content.Shared._CP14.Knowledge.Components; +using Content.Shared._CP14.Knowledge.Events; using Content.Shared._CP14.Knowledge.Prototypes; using Content.Shared.DoAfter; using Content.Shared.Ghost; @@ -10,113 +11,27 @@ using Robust.Shared.Serialization; namespace Content.Shared._CP14.Knowledge; -public abstract partial class SharedCP14KnowledgeSystem : EntitySystem +public abstract class SharedCP14KnowledgeSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _proto = default!; - [Dependency] private readonly PaperSystem _paper = default!; - - public override void Initialize() + public bool HasKnowledge(Entity entity, ProtoId knowledge) { - SubscribeLocalEvent(OnPaperMapInit); + if (HasComp(entity)) + return true; + + return Resolve(entity, ref entity.Comp, false) && entity.Comp.Knowledge.Contains(knowledge); } - private void OnPaperMapInit(Entity ent, ref MapInitEvent args) + public bool TryUseKnowledge(Entity entity, ProtoId knowledge, float factor = 1f) { - if (!TryComp(ent, out var paper)) - return; - if (!TryComp(ent, out var knowledge)) - return; - if (knowledge.Knowledge.Count <= 0) - return; - - var sb = new StringBuilder(); - - sb.Append(Loc.GetString("cp14-knowledge-book-pre-text")); - foreach (var k in knowledge.Knowledge) - { - if (!_proto.TryIndex(k, out var indexedKnowledge)) - continue; - - sb.Append($"\n{Loc.GetString(indexedKnowledge.Desc)}"); - } - - sb.Append($"\n\n{Loc.GetString("cp14-knowledge-book-post-text")}"); - - _paper.SetContent((ent, paper), sb.ToString()); - paper.EditingDisabled = true; - } - - public bool UseKnowledge(EntityUid uid, - ProtoId knowledge, - float factor = 1f, - CP14KnowledgeStorageComponent? knowledgeStorage = null) - { - if (!Resolve(uid, ref knowledgeStorage, false)) + if (!Resolve(entity, ref entity.Comp, false)) return false; - if (!knowledgeStorage.Knowledge.Contains(knowledge)) + if (!entity.Comp.Knowledge.Contains(knowledge)) return false; - var ev = new CP14KnowledgeUsedEvent(uid, knowledge, factor); - RaiseLocalEvent(uid, ev); + var ev = new CP14KnowledgeUsedEvent(entity, knowledge, factor); + RaiseLocalEvent(entity, ev); + return true; } - - public bool HasKnowledge(EntityUid uid, - ProtoId knowledge, - CP14KnowledgeStorageComponent? knowledgeStorage = null) - { - if (HasComp(uid)) //All-knowing ghosts - return true; - - if (!Resolve(uid, ref knowledgeStorage, false)) - return false; - - return knowledgeStorage.Knowledge.Contains(knowledge); - } -} - -public sealed class CP14KnowledgeUsedEvent : EntityEventArgs -{ - public readonly EntityUid User; - public readonly ProtoId Knowledge; - public readonly float Factor; - - public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId knowledge, float factor) - { - User = uid; - Knowledge = knowledge; - Factor = factor; - } -} - -[Serializable, NetSerializable] -public sealed partial class CP14KnowledgeLearnDoAfterEvent : DoAfterEvent -{ - public ProtoId Knowledge; - public override DoAfterEvent Clone() => this; -} - -[Serializable, NetSerializable] -public sealed class CP14KnowledgeInfoEvent : EntityEventArgs -{ - public readonly NetEntity NetEntity; - public readonly HashSet> AllKnowledge; - - public CP14KnowledgeInfoEvent(NetEntity netEntity, HashSet> allKnowledge) - { - NetEntity = netEntity; - AllKnowledge = allKnowledge; - } -} - -[Serializable, NetSerializable] -public sealed class RequestKnowledgeInfoEvent : EntityEventArgs -{ - public readonly NetEntity NetEntity; - - public RequestKnowledgeInfoEvent(NetEntity netEntity) - { - NetEntity = netEntity; - } }