Merge pull request #977 from crystallpunk-14/skill-remaster
Knowledge refactor
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Knowledge.Events;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Robust.Client.Player;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Client._CP14.Knowledge;
|
||||
|
||||
public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
public sealed class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
{
|
||||
[Dependency] private readonly IPlayerManager _players = default!;
|
||||
|
||||
@@ -24,7 +25,7 @@ public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSyste
|
||||
if (entity is null)
|
||||
return;
|
||||
|
||||
RaiseNetworkEvent(new RequestKnowledgeInfoEvent(GetNetEntity(entity.Value)));
|
||||
RaiseNetworkEvent(new CP14RequestKnowledgeInfoEvent(GetNetEntity(entity.Value)));
|
||||
}
|
||||
|
||||
private void OnCharacterKnowledgeEvent(CP14KnowledgeInfoEvent msg, EntitySessionEventArgs args)
|
||||
@@ -37,6 +38,6 @@ public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSyste
|
||||
|
||||
public readonly record struct KnowledgeData(
|
||||
EntityUid Entity,
|
||||
HashSet<ProtoId<CP14KnowledgePrototype>> AllKnowledges
|
||||
HashSet<ProtoId<CP14KnowledgePrototype>> AllKnowledge
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
using Content.Shared._CP14.Knowledge.Components;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Administration.Managers;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Knowledge;
|
||||
|
||||
// TODO: Add UI
|
||||
public sealed class CP14KnowledgeAdminUtilitiesSystem : EntitySystem
|
||||
{
|
||||
[Dependency] private readonly ISharedAdminManager _admin = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
[Dependency] private readonly CP14KnowledgeSystem _knowledge = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CP14KnowledgeStorageComponent, GetVerbsEvent<Verb>>(AddKnowledgeAdminVerb);
|
||||
}
|
||||
|
||||
private void AddKnowledgeAdminVerb(Entity<CP14KnowledgeStorageComponent> entity, ref GetVerbsEvent<Verb> args)
|
||||
{
|
||||
if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
|
||||
return;
|
||||
|
||||
// Remove knowledge
|
||||
foreach (var knowledge in entity.Comp.Knowledge)
|
||||
{
|
||||
if (!_prototype.TryIndex(knowledge, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb
|
||||
{
|
||||
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
|
||||
Message = Loc.GetString(indexedKnowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeRemove,
|
||||
Act = () =>
|
||||
{
|
||||
_knowledge.TryRemove(entity.Owner, knowledge);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
|
||||
// Add knowledge
|
||||
foreach (var knowledge in _prototype.EnumeratePrototypes<CP14KnowledgePrototype>())
|
||||
{
|
||||
// An entity with CP14AllKnowingComponent can't be taught anything,
|
||||
// it already knows everything
|
||||
if (_knowledge.HasKnowledge(entity.Owner, knowledge.ID))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb
|
||||
{
|
||||
Text = $"{Loc.GetString(knowledge.Name)}",
|
||||
Message = Loc.GetString(knowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeAdd,
|
||||
Act = () =>
|
||||
{
|
||||
_knowledge.TryAdd(entity.Owner, knowledge, true);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,30 +1,23 @@
|
||||
using System.Text;
|
||||
using Content.Server.Chat.Managers;
|
||||
using Content.Server.Mind;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Knowledge.Components;
|
||||
using Content.Shared._CP14.Knowledge.Events;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Administration.Logs;
|
||||
using Content.Shared.Administration.Managers;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Mind;
|
||||
using Content.Shared.Verbs;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
||||
namespace Content.Server._CP14.Knowledge;
|
||||
|
||||
public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
public sealed class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
{
|
||||
[Dependency] private readonly ISharedAdminManager _admin = default!;
|
||||
[Dependency] private readonly IRobustRandom _random = default!;
|
||||
[Dependency] private readonly PopupSystem _popup = default!;
|
||||
[Dependency] private readonly DamageableSystem _damageable = default!;
|
||||
[Dependency] private readonly IPrototypeManager _proto = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototype = default!;
|
||||
[Dependency] private readonly IChatManager _chat = default!;
|
||||
[Dependency] private readonly MindSystem _mind = default!;
|
||||
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
||||
@@ -35,32 +28,21 @@ public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
base.Initialize();
|
||||
|
||||
SubscribeLocalEvent<CP14AutoAddKnowledgeComponent, MapInitEvent>(AutoAddSkill);
|
||||
SubscribeLocalEvent<CP14KnowledgeStorageComponent, GetVerbsEvent<Verb>>(AddKnowledgeAdminVerb);
|
||||
SubscribeLocalEvent<CP14KnowledgeLearningSourceComponent, GetVerbsEvent<Verb>>(AddKnowledgeLearningVerb);
|
||||
SubscribeLocalEvent<CP14KnowledgeStorageComponent, CP14KnowledgeLearnDoAfterEvent>(KnowledgeLearnedEvent);
|
||||
SubscribeLocalEvent<CP14KnowledgeLearningSourceComponent, GetVerbsEvent<Verb>>(AddKnowledgeLearningVerb);
|
||||
|
||||
SubscribeNetworkEvent<RequestKnowledgeInfoEvent>(OnRequestKnowledgeInfoEvent);
|
||||
}
|
||||
|
||||
private void KnowledgeLearnedEvent(Entity<CP14KnowledgeStorageComponent> ent, ref CP14KnowledgeLearnDoAfterEvent args)
|
||||
{
|
||||
if (args.Cancelled || args.Handled)
|
||||
return;
|
||||
|
||||
args.Handled = true;
|
||||
|
||||
TryLearnKnowledge(ent, args.Knowledge);
|
||||
SubscribeNetworkEvent<CP14RequestKnowledgeInfoEvent>(OnRequestKnowledgeInfoEvent);
|
||||
}
|
||||
|
||||
private void AddKnowledgeLearningVerb(Entity<CP14KnowledgeLearningSourceComponent> ent, ref GetVerbsEvent<Verb> args)
|
||||
{
|
||||
var user = args.User;
|
||||
foreach (var knowledge in ent.Comp.Knowledges)
|
||||
foreach (var knowledge in ent.Comp.Knowledge)
|
||||
{
|
||||
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
|
||||
if (!_prototype.TryIndex(knowledge, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
args.Verbs.Add(new Verb
|
||||
{
|
||||
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
|
||||
Message = Loc.GetString(indexedKnowledge.Desc),
|
||||
@@ -70,7 +52,7 @@ public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
|
||||
user,
|
||||
ent.Comp.DoAfter,
|
||||
new CP14KnowledgeLearnDoAfterEvent() {Knowledge = knowledge},
|
||||
new CP14KnowledgeLearnDoAfterEvent { Knowledge = knowledge },
|
||||
user,
|
||||
ent,
|
||||
ent)
|
||||
@@ -85,176 +67,137 @@ public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
}
|
||||
}
|
||||
|
||||
private void AddKnowledgeAdminVerb(Entity<CP14KnowledgeStorageComponent> ent, ref GetVerbsEvent<Verb> args)
|
||||
private void KnowledgeLearnedEvent(Entity<CP14KnowledgeStorageComponent> ent, ref CP14KnowledgeLearnDoAfterEvent args)
|
||||
{
|
||||
if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
|
||||
if (args.Cancelled || args.Handled)
|
||||
return;
|
||||
|
||||
//Remove knowledge
|
||||
foreach (var knowledge in ent.Comp.Knowledges)
|
||||
{
|
||||
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
{
|
||||
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
|
||||
Message = Loc.GetString(indexedKnowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeRemove,
|
||||
Act = () =>
|
||||
{
|
||||
TryForgotKnowledge(ent, knowledge);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
|
||||
//Add knowledge
|
||||
foreach (var knowledge in _proto.EnumeratePrototypes<CP14KnowledgePrototype>())
|
||||
{
|
||||
if (ent.Comp.Knowledges.Contains(knowledge))
|
||||
continue;
|
||||
|
||||
args.Verbs.Add(new Verb()
|
||||
{
|
||||
Text = $"{Loc.GetString(knowledge.Name)}",
|
||||
Message = Loc.GetString(knowledge.Desc),
|
||||
Category = VerbCategory.CP14KnowledgeAdd,
|
||||
Act = () =>
|
||||
{
|
||||
TryLearnKnowledge(ent, knowledge, true);
|
||||
},
|
||||
Impact = LogImpact.High,
|
||||
});
|
||||
}
|
||||
args.Handled = true;
|
||||
TryAdd(ent.Owner, args.Knowledge);
|
||||
}
|
||||
|
||||
private void AutoAddSkill(Entity<CP14AutoAddKnowledgeComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
foreach (var knowledge in ent.Comp.Knowledge)
|
||||
{
|
||||
TryLearnKnowledge(ent, knowledge);
|
||||
TryAdd(ent.Owner, knowledge);
|
||||
}
|
||||
|
||||
RemComp(ent, ent.Comp);
|
||||
}
|
||||
|
||||
public bool TryLearnKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool force = false, bool silent = false)
|
||||
public bool TryAdd(Entity<CP14KnowledgeStorageComponent?> entity, ProtoId<CP14KnowledgePrototype> knowledgeId, bool force = false, bool silent = false)
|
||||
{
|
||||
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
|
||||
if (!Resolve(entity, ref entity.Comp, false))
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(proto, out var indexedKnowledge))
|
||||
if (HasKnowledge(entity, knowledgeId))
|
||||
return false;
|
||||
|
||||
if (knowledgeStorage.Knowledges.Contains(proto))
|
||||
if (!_prototype.TryIndex(knowledgeId, out var knowledge))
|
||||
return false;
|
||||
|
||||
foreach (var dependency in indexedKnowledge.Dependencies)
|
||||
MindComponent? mindComponent;
|
||||
|
||||
foreach (var dependencyKnowledgeId in knowledge.Dependencies)
|
||||
{
|
||||
if (!_proto.TryIndex(dependency, out var indexedDependency))
|
||||
if (!_prototype.TryIndex(dependencyKnowledgeId, out var dependencyKnowledge))
|
||||
return false;
|
||||
|
||||
if (force)
|
||||
{
|
||||
//If we teach by force - we automatically teach all the basics that are necessary for that skill.
|
||||
if (!TryLearnKnowledge(uid, dependency, true))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
var passed = true;
|
||||
var sb = new StringBuilder();
|
||||
// If we teach by force - we automatically teach all the basics that are necessary for that skill.
|
||||
if (force && !TryAdd(entity, dependencyKnowledge, true))
|
||||
return false;
|
||||
|
||||
sb.Append(Loc.GetString("cp14-cant-learn-knowledge-dependencies",
|
||||
("target", Loc.GetString(indexedKnowledge.Desc))));
|
||||
var sb = new StringBuilder();
|
||||
sb.Append(Loc.GetString("cp14-cant-learn-knowledge-dependencies", ("target", Loc.GetString(knowledge.Desc))));
|
||||
|
||||
//We cant learnt
|
||||
if (!HasKnowledge(uid, dependency))
|
||||
{
|
||||
passed = false;
|
||||
sb.Append("\n- " + Loc.GetString(indexedDependency.Desc));
|
||||
}
|
||||
// We cant learnt
|
||||
if (HasKnowledge(entity, dependencyKnowledge))
|
||||
continue;
|
||||
|
||||
if (!passed)
|
||||
{
|
||||
if (!silent && _mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
|
||||
{
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", sb.ToString()));
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
sb.ToString(),
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp.Session.Channel);
|
||||
}
|
||||
sb.Append($"\n- {Loc.GetString(dependencyKnowledge.Desc)}");
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (silent)
|
||||
return false;
|
||||
|
||||
//TODO: coding on a sleepy head is a bad idea. Remove duplicate variables. >:(
|
||||
if (!silent && _mind.TryGetMind(uid, out var mind2, out var mindComp2) && mindComp2.Session is not null)
|
||||
{
|
||||
var message = Loc.GetString("cp14-learned-new-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
|
||||
var wrappedMessage2 = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
if (!_mind.TryGetMind(entity, out _, out mindComponent) || mindComponent.Session is null)
|
||||
return false;
|
||||
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", sb.ToString()));
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage2,
|
||||
sb.ToString(),
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp2.Session.Channel);
|
||||
mindComponent.Session.Channel);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
_adminLogger.Add(
|
||||
LogType.Mind,
|
||||
LogImpact.Medium,
|
||||
$"{EntityManager.ToPrettyString(uid):player} learned new knowledge: {Loc.GetString(indexedKnowledge.Name)}");
|
||||
return knowledgeStorage.Knowledges.Add(proto);
|
||||
}
|
||||
|
||||
public bool TryForgotKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool silent = false)
|
||||
{
|
||||
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
|
||||
if (!entity.Comp.Knowledge.Add(knowledgeId))
|
||||
return false;
|
||||
|
||||
if (!knowledgeStorage.Knowledges.Contains(proto))
|
||||
_adminLogger.Add(LogType.Mind, LogImpact.Medium, $"{EntityManager.ToPrettyString(entity):player} learned new knowledge: {Loc.GetString(knowledge.Name)}");
|
||||
|
||||
// TODO: coding on a sleepy head is a bad idea. Remove duplicate variables. >:(
|
||||
if (silent)
|
||||
return true;
|
||||
|
||||
if (!_mind.TryGetMind(entity, out _, out mindComponent) || mindComponent.Session is null)
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(proto, out var indexedKnowledge))
|
||||
return false;
|
||||
var message = Loc.GetString("cp14-learned-new-knowledge", ("name", Loc.GetString(knowledge.Name)));
|
||||
var wrappedMessage2 = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
|
||||
knowledgeStorage.Knowledges.Remove(proto);
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage2,
|
||||
default,
|
||||
false,
|
||||
mindComponent.Session.Channel);
|
||||
|
||||
if (_mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
|
||||
{
|
||||
if (!silent)
|
||||
{
|
||||
var message = Loc.GetString("cp14-forgot-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp.Session.Channel);
|
||||
}
|
||||
}
|
||||
|
||||
_adminLogger.Add(
|
||||
LogType.Mind,
|
||||
LogImpact.Medium,
|
||||
$"{EntityManager.ToPrettyString(uid):player} forgot knowledge: {Loc.GetString(indexedKnowledge.Name)}");
|
||||
return true;
|
||||
}
|
||||
|
||||
private void OnRequestKnowledgeInfoEvent(RequestKnowledgeInfoEvent msg, EntitySessionEventArgs args)
|
||||
public bool TryRemove(Entity<CP14KnowledgeStorageComponent?> entity, ProtoId<CP14KnowledgePrototype> proto, bool silent = false)
|
||||
{
|
||||
if (!Resolve(entity, ref entity.Comp, false))
|
||||
return false;
|
||||
|
||||
if (!entity.Comp.Knowledge.Contains(proto))
|
||||
return false;
|
||||
|
||||
if (!_prototype.TryIndex(proto, out var indexedKnowledge))
|
||||
return false;
|
||||
|
||||
if (!entity.Comp.Knowledge.Remove(proto))
|
||||
return false;
|
||||
|
||||
_adminLogger.Add(LogType.Mind, LogImpact.Medium, $"{EntityManager.ToPrettyString(entity):player} forgot knowledge: {Loc.GetString(indexedKnowledge.Name)}");
|
||||
|
||||
if (silent)
|
||||
return true;
|
||||
|
||||
if (!_mind.TryGetMind(entity, out _, out var mindComp) || mindComp.Session is null)
|
||||
return true;
|
||||
|
||||
var message = Loc.GetString("cp14-forgot-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
|
||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
|
||||
|
||||
_chat.ChatMessageToOne(
|
||||
ChatChannel.Server,
|
||||
message,
|
||||
wrappedMessage,
|
||||
default,
|
||||
false,
|
||||
mindComp.Session.Channel);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void OnRequestKnowledgeInfoEvent(CP14RequestKnowledgeInfoEvent msg, EntitySessionEventArgs args)
|
||||
{
|
||||
if (!args.SenderSession.AttachedEntity.HasValue || args.SenderSession.AttachedEntity != GetEntity(msg.NetEntity))
|
||||
return;
|
||||
@@ -264,6 +207,6 @@ public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
|
||||
if (!TryComp<CP14KnowledgeStorageComponent>(entity, out var knowledgeComp))
|
||||
return;
|
||||
|
||||
RaiseNetworkEvent(new CP14KnowledgeInfoEvent(GetNetEntity(entity),knowledgeComp.Knowledges), args.SenderSession);
|
||||
RaiseNetworkEvent(new CP14KnowledgeInfoEvent(GetNetEntity(entity),knowledgeComp.Knowledge), args.SenderSession);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
using Content.Shared._CP14.Knowledge;
|
||||
using Content.Shared._CP14.Knowledge.Prototypes;
|
||||
using Content.Shared.Roles;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Knowledge;
|
||||
namespace Content.Server._CP14.Knowledge.Specials;
|
||||
|
||||
/// <summary>
|
||||
/// a component that can be hung on an entity to immediately teach it some skills
|
||||
@@ -13,15 +12,16 @@ namespace Content.Server._CP14.Knowledge;
|
||||
public sealed partial class CP14AddKnowledgeSpecial : JobSpecial
|
||||
{
|
||||
[DataField(required: true), ViewVariables(VVAccess.ReadOnly)]
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = [];
|
||||
|
||||
public override void AfterEquip(EntityUid mob)
|
||||
{
|
||||
var entMan = IoCManager.Resolve<IEntityManager>();
|
||||
var knowledgeSystem = entMan.System<CP14KnowledgeSystem>();
|
||||
|
||||
foreach (var knowledge in Knowledge)
|
||||
{
|
||||
knowledgeSystem.TryLearnKnowledge(mob, knowledge, true, true);
|
||||
knowledgeSystem.TryAdd(mob, knowledge, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<CP14KnowledgePaperTextComponent, MapInitEvent>(OnPaperMapInit);
|
||||
}
|
||||
|
||||
private void OnPaperMapInit(Entity<CP14KnowledgePaperTextComponent> ent, ref MapInitEvent args)
|
||||
{
|
||||
if (!TryComp<PaperComponent>(ent, out var paperComponent))
|
||||
return;
|
||||
|
||||
var paper = new Entity<PaperComponent>(ent, paperComponent);
|
||||
|
||||
if (!TryComp<CP14KnowledgeLearningSourceComponent>(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();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
using Robust.Shared.GameStates;
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
public sealed partial class CP14AllKnowingComponent : Component;
|
||||
@@ -4,11 +4,12 @@ using Robust.Shared.Prototypes;
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// The ability to add a skill to an entity and quickly teach it some skills
|
||||
/// The ability to add a <see cref="CP14KnowledgePrototype"/> to an entity
|
||||
/// and quickly teach it some skills.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14AutoAddKnowledgeComponent : Component
|
||||
{
|
||||
[DataField]
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
|
||||
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = [];
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace Content.Shared._CP14.Knowledge.Components;
|
||||
public sealed partial class CP14KnowledgeLearningSourceComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledge { get; private set; } = [];
|
||||
|
||||
[DataField]
|
||||
public TimeSpan DoAfter = TimeSpan.FromSeconds(5f);
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// automatically generates content for PaperComponent, based on the knowledge that can be learnt from this object
|
||||
/// Automatically generates content for PaperComponent,
|
||||
/// based on the knowledge that can be learnt from this object.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14KnowledgePaperTextComponent : Component
|
||||
{
|
||||
}
|
||||
public sealed partial class CP14KnowledgePaperTextComponent : Component;
|
||||
|
||||
@@ -4,11 +4,11 @@ using Robust.Shared.Prototypes;
|
||||
namespace Content.Shared._CP14.Knowledge.Components;
|
||||
|
||||
/// <summary>
|
||||
/// a list of skills learned by this entity
|
||||
/// A list of <see cref="CP14KnowledgePrototype"/> learned by this entity.
|
||||
/// </summary>
|
||||
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
|
||||
public sealed partial class CP14KnowledgeStorageComponent : Component
|
||||
{
|
||||
[DataField, ViewVariables(VVAccess.ReadOnly)]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledge { get; private set; } = [];
|
||||
}
|
||||
|
||||
@@ -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<ProtoId<CP14KnowledgePrototype>> AllKnowledge;
|
||||
|
||||
public CP14KnowledgeInfoEvent(NetEntity netEntity, HashSet<ProtoId<CP14KnowledgePrototype>> allKnowledge)
|
||||
{
|
||||
NetEntity = netEntity;
|
||||
AllKnowledge = allKnowledge;
|
||||
}
|
||||
}
|
||||
@@ -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<CP14KnowledgePrototype> Knowledge;
|
||||
|
||||
public override DoAfterEvent Clone()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -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<CP14KnowledgePrototype> Knowledge;
|
||||
public readonly float Factor;
|
||||
|
||||
public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId<CP14KnowledgePrototype> knowledge, float factor)
|
||||
{
|
||||
User = uid;
|
||||
Knowledge = knowledge;
|
||||
Factor = factor;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -8,19 +8,18 @@ namespace Content.Shared._CP14.Knowledge.Prototypes;
|
||||
[Prototype("CP14Knowledge")]
|
||||
public sealed partial class CP14KnowledgePrototype : IPrototype
|
||||
{
|
||||
[ViewVariables]
|
||||
[IdDataField]
|
||||
public string ID { get; private set; } = default!;
|
||||
|
||||
[DataField(required: true)]
|
||||
public LocId Name { get; private set; } = default!;
|
||||
public LocId Name { get; private set; }
|
||||
|
||||
[DataField]
|
||||
public LocId Desc{ get; private set; } = default!;
|
||||
public LocId Desc { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// to study this knowledge, other knowledge on which it is based may be necessary.
|
||||
/// To study this knowledge, other knowledge on which it is based may be necessary.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Dependencies = new();
|
||||
public HashSet<ProtoId<CP14KnowledgePrototype>> Dependencies = [];
|
||||
}
|
||||
|
||||
@@ -1,122 +1,31 @@
|
||||
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;
|
||||
using Content.Shared.MagicMirror;
|
||||
using Content.Shared.Paper;
|
||||
using Robust.Shared.Prototypes;
|
||||
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<CP14KnowledgeStorageComponent?> entity, ProtoId<CP14KnowledgePrototype> knowledge)
|
||||
{
|
||||
SubscribeLocalEvent<CP14KnowledgePaperTextComponent, MapInitEvent>(OnPaperMapInit);
|
||||
if (HasComp<CP14AllKnowingComponent>(entity))
|
||||
return true;
|
||||
|
||||
return Resolve(entity, ref entity.Comp, false) && entity.Comp.Knowledge.Contains(knowledge);
|
||||
}
|
||||
|
||||
private void OnPaperMapInit(Entity<CP14KnowledgePaperTextComponent> ent, ref MapInitEvent args)
|
||||
public bool TryUseKnowledge(Entity<CP14KnowledgeStorageComponent?> entity, ProtoId<CP14KnowledgePrototype> knowledge, float factor = 1f)
|
||||
{
|
||||
if (!TryComp<PaperComponent>(ent, out var paper))
|
||||
return;
|
||||
if (!TryComp<CP14KnowledgeLearningSourceComponent>(ent, out var knowledge))
|
||||
return;
|
||||
if (knowledge.Knowledges.Count <= 0)
|
||||
return;
|
||||
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.Append(Loc.GetString("cp14-knowledge-book-pre-text"));
|
||||
foreach (var k in knowledge.Knowledges)
|
||||
{
|
||||
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<CP14KnowledgePrototype> knowledge,
|
||||
float factor = 1f,
|
||||
CP14KnowledgeStorageComponent? knowledgeStorage = null)
|
||||
{
|
||||
if (!Resolve(uid, ref knowledgeStorage, false))
|
||||
if (!Resolve(entity, ref entity.Comp, false))
|
||||
return false;
|
||||
|
||||
if (!knowledgeStorage.Knowledges.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<CP14KnowledgePrototype> knowledge,
|
||||
CP14KnowledgeStorageComponent? knowledgeStorage = null)
|
||||
{
|
||||
if (HasComp<GhostComponent>(uid)) //All-knowing ghosts
|
||||
return true;
|
||||
|
||||
if (!Resolve(uid, ref knowledgeStorage, false))
|
||||
return false;
|
||||
|
||||
return knowledgeStorage.Knowledges.Contains(knowledge);
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class CP14KnowledgeUsedEvent : EntityEventArgs
|
||||
{
|
||||
public readonly EntityUid User;
|
||||
public readonly ProtoId<CP14KnowledgePrototype> Knowledge;
|
||||
public readonly float Factor;
|
||||
|
||||
public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId<CP14KnowledgePrototype> knowledge, float factor)
|
||||
{
|
||||
User = uid;
|
||||
Knowledge = knowledge;
|
||||
Factor = factor;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed partial class CP14KnowledgeLearnDoAfterEvent : DoAfterEvent
|
||||
{
|
||||
public ProtoId<CP14KnowledgePrototype> Knowledge;
|
||||
public override DoAfterEvent Clone() => this;
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class CP14KnowledgeInfoEvent : EntityEventArgs
|
||||
{
|
||||
public readonly NetEntity NetEntity;
|
||||
public readonly HashSet<ProtoId<CP14KnowledgePrototype>> AllKnowledge;
|
||||
|
||||
public CP14KnowledgeInfoEvent(NetEntity netEntity, HashSet<ProtoId<CP14KnowledgePrototype>> allKnowledge)
|
||||
{
|
||||
NetEntity = netEntity;
|
||||
AllKnowledge = allKnowledge;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class RequestKnowledgeInfoEvent : EntityEventArgs
|
||||
{
|
||||
public readonly NetEntity NetEntity;
|
||||
|
||||
public RequestKnowledgeInfoEvent(NetEntity netEntity)
|
||||
{
|
||||
NetEntity = netEntity;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ public sealed partial class KnowledgeRequired : CP14WorkbenchCraftRequirement
|
||||
public override void PostCraft(EntityManager entManager, HashSet<EntityUid> placedEntities, EntityUid user)
|
||||
{
|
||||
var knowledgeSystem = entManager.System<SharedCP14KnowledgeSystem>();
|
||||
knowledgeSystem.UseKnowledge(user, Knowledge);
|
||||
knowledgeSystem.TryUseKnowledge(user, Knowledge);
|
||||
}
|
||||
|
||||
public override string GetRequirementTitle(IPrototypeManager protoManager)
|
||||
@@ -41,8 +41,8 @@ public sealed partial class KnowledgeRequired : CP14WorkbenchCraftRequirement
|
||||
return null;
|
||||
}
|
||||
|
||||
public override SpriteSpecifier? GetRequirementTexture(IPrototypeManager protoManager)
|
||||
public override SpriteSpecifier GetRequirementTexture(IPrototypeManager protoManager)
|
||||
{
|
||||
return new SpriteSpecifier.Texture(new("/Textures/Interface/students-cap.svg.192dpi.png"));
|
||||
return new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/students-cap.svg.192dpi.png"));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
name: admin observer
|
||||
categories: [ HideSpawnMenu ]
|
||||
components:
|
||||
- type: CP14AllKnowing
|
||||
- type: ContentEye
|
||||
maxZoom: 8.916104, 8.916104
|
||||
- type: Tag
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
suffix: Wood Work
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- WoodWork
|
||||
|
||||
- type: entity
|
||||
@@ -15,7 +15,7 @@
|
||||
suffix: Metall Melting
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- MetallMelting
|
||||
|
||||
- type: entity
|
||||
@@ -24,7 +24,7 @@
|
||||
suffix: Metall Forging
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- MetallForging
|
||||
|
||||
- type: entity
|
||||
@@ -33,7 +33,7 @@
|
||||
suffix: Glasswork
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- Glasswork
|
||||
|
||||
# T1
|
||||
@@ -44,7 +44,7 @@
|
||||
suffix: Clothing Sewing
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- ClothingSewing
|
||||
|
||||
- type: entity
|
||||
@@ -53,7 +53,7 @@
|
||||
suffix: Wallpaper Craft
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- WallpaperCraft
|
||||
|
||||
# T2
|
||||
@@ -64,6 +64,5 @@
|
||||
suffix: Advanced Clothing Sewing
|
||||
components:
|
||||
- type: CP14KnowledgeLearningSource
|
||||
knowledges:
|
||||
knowledge:
|
||||
- AdvancedClothingSewing
|
||||
|
||||
Reference in New Issue
Block a user