serverization??? (#1457)

This commit is contained in:
Red
2025-06-21 20:51:07 +03:00
committed by GitHub
parent 78e3b78854
commit 44ba300a91
14 changed files with 27 additions and 43 deletions

View File

@@ -0,0 +1,41 @@
using Content.Server._CP14.MagicSpellStorage.Components;
using Content.Shared.Clothing;
using Content.Shared.Hands;
namespace Content.Server._CP14.MagicSpellStorage;
public sealed partial class CP14SpellStorageSystem
{
private void InitializeAccess()
{
SubscribeLocalEvent<CP14SpellStorageAccessHoldingComponent, GotEquippedHandEvent>(OnEquippedHand);
SubscribeLocalEvent<CP14SpellStorageAccessWearingComponent, ClothingGotEquippedEvent>(OnClothingEquipped);
SubscribeLocalEvent<CP14SpellStorageAccessWearingComponent, ClothingGotUnequippedEvent>(OnClothingUnequipped);
}
private void OnEquippedHand(Entity<CP14SpellStorageAccessHoldingComponent> ent, ref GotEquippedHandEvent args)
{
if (!TryComp<CP14SpellStorageComponent>(ent, out var spellStorage))
return;
TryGrantAccess((ent, spellStorage), args.User);
}
private void OnClothingEquipped(Entity<CP14SpellStorageAccessWearingComponent> ent, ref ClothingGotEquippedEvent args)
{
ent.Comp.Wearing = true;
if (!TryComp<CP14SpellStorageComponent>(ent, out var spellStorage))
return;
TryGrantAccess((ent, spellStorage), args.Wearer);
}
private void OnClothingUnequipped(Entity<CP14SpellStorageAccessWearingComponent> ent, ref ClothingGotUnequippedEvent args)
{
ent.Comp.Wearing = false;
_actions.RemoveProvidedActions(args.Wearer, ent);
}
}

View File

@@ -0,0 +1,88 @@
using Content.Server._CP14.MagicSpellStorage.Components;
using Content.Shared._CP14.MagicSpell.Components;
using Content.Shared._CP14.MagicSpell.Events;
using Content.Shared._CP14.MagicSpellStorage;
using Content.Shared.Actions;
using Content.Shared.Damage;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Mind;
namespace Content.Server._CP14.MagicSpellStorage;
/// <summary>
/// this part of the system is responsible for storing spells in items, and the methods players use to obtain them.
/// </summary>
public sealed partial class CP14SpellStorageSystem : CP14SharedSpellStorageSystem
{
[Dependency] private readonly ActionContainerSystem _actionContainer = default!;
[Dependency] private readonly SharedActionsSystem _actions = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
public override void Initialize()
{
InitializeAccess();
SubscribeLocalEvent<CP14SpellStorageComponent, MapInitEvent>(OnMagicStorageInit);
SubscribeLocalEvent<CP14SpellStorageComponent, ComponentShutdown>(OnMagicStorageShutdown);
SubscribeLocalEvent<CP14SpellStorageUseDamageComponent, CP14SpellFromSpellStorageUsedEvent>(OnSpellUsed);
}
private void OnSpellUsed(Entity<CP14SpellStorageUseDamageComponent> ent, ref CP14SpellFromSpellStorageUsedEvent args)
{
_damageable.TryChangeDamage(ent, ent.Comp.DamagePerMana * args.Manacost);
}
/// <summary>
/// When we initialize, we create action entities, and add them to this item.
/// </summary>
private void OnMagicStorageInit(Entity<CP14SpellStorageComponent> storage, ref MapInitEvent args)
{
foreach (var spell in storage.Comp.Spells)
{
var spellEnt = _actionContainer.AddAction(storage, spell);
if (spellEnt is null)
continue;
var provided = EntityManager.EnsureComponent<CP14MagicEffectComponent>(spellEnt.Value);
provided.SpellStorage = storage;
storage.Comp.SpellEntities.Add(spellEnt.Value);
}
if (storage.Comp.GrantAccessToSelf)
{
if (!_mind.TryGetMind(storage.Owner, out var mind, out _))
_actions.GrantActions(storage.Owner, storage.Comp.SpellEntities, storage.Owner);
else
{
foreach (var spell in storage.Comp.SpellEntities)
{
_actionContainer.AddAction(mind, spell);
}
}
}
}
private void OnMagicStorageShutdown(Entity<CP14SpellStorageComponent> mStorage, ref ComponentShutdown args)
{
foreach (var spell in mStorage.Comp.SpellEntities)
{
QueueDel(spell);
}
}
private bool TryGrantAccess(Entity<CP14SpellStorageComponent> storage, EntityUid user)
{
if (!_mind.TryGetMind(user, out var mindId, out var mind))
return false;
if (mind.OwnedEntity is null)
return false;
_actions.GrantActions(user, storage.Comp.SpellEntities, storage.Owner);
return true;
}
}

View File

@@ -0,0 +1,9 @@
namespace Content.Server._CP14.MagicSpellStorage.Components;
/// <summary>
/// Denotes that this item's spells can be accessed while holding it in your hand
/// </summary>
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageAccessHoldingComponent : Component
{
}

View File

@@ -0,0 +1,11 @@
namespace Content.Server._CP14.MagicSpellStorage.Components;
/// <summary>
/// Denotes that this item's spells can be accessed while wearing it on your body
/// </summary>
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageAccessWearingComponent : Component
{
[DataField]
public bool Wearing;
}

View File

@@ -0,0 +1,28 @@
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.MagicSpellStorage.Components;
/// <summary>
/// A component that allows you to store spells in items
/// </summary>
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageComponent : Component
{
/// <summary>
/// Set true when giving starting abilities to creatures in this way
/// </summary>
[DataField]
public bool GrantAccessToSelf = false;
/// <summary>
/// list of spell prototypes used for initialization.
/// </summary>
[DataField]
public List<EntProtoId> Spells = new();
/// <summary>
/// created after the initialization of spell entities.
/// </summary>
[DataField]
public List<EntityUid> SpellEntities = new();
}

View File

@@ -0,0 +1,16 @@
using Content.Shared.Damage;
namespace Content.Server._CP14.MagicSpellStorage.Components;
/// <summary>
/// Causes damage to the Spell storage when spells from it are used
/// </summary>
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageUseDamageComponent : Component
{
/// <summary>
/// the amount of damage this entity will take per unit manacost of the spell used
/// </summary>
[DataField(required: true)]
public DamageSpecifier DamagePerMana = default!;
}