diff --git a/Content.Server/_CP14/MagicEnergy/CP14MagicEnergyCrystalSlotSystem.cs b/Content.Server/_CP14/MagicEnergy/CP14MagicEnergyCrystalSlotSystem.cs index c911a04d90..3849027a7e 100644 --- a/Content.Server/_CP14/MagicEnergy/CP14MagicEnergyCrystalSlotSystem.cs +++ b/Content.Server/_CP14/MagicEnergy/CP14MagicEnergyCrystalSlotSystem.cs @@ -11,128 +11,4 @@ namespace Content.Server._CP14.MagicEnergy; public sealed class CP14MagicEnergyCrystalSlotSystem : SharedCP14MagicEnergyCrystalSlotSystem { - [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; - [Dependency] private readonly CP14MagicEnergySystem _magicEnergy = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnEnergyChanged); - - SubscribeLocalEvent(OnExamined); - SubscribeLocalEvent(OnCrystalChanged); - } - - private void OnCrystalChanged(Entity ent, ref CP14SlotCrystalChangedEvent args) - { - var realPowered = TryGetEnergyCrystalFromSlot((ent, ent), out var energyComp); - if (energyComp is not null) - realPowered = energyComp.Value.Comp.Energy > 0; - - if (ent.Comp.Powered == realPowered) - return; - - ent.Comp.Powered = realPowered; - _appearance.SetData(ent, CP14MagicSlotVisuals.Powered, realPowered); - - RaiseLocalEvent(ent, new CP14SlotCrystalPowerChangedEvent(realPowered)); - } - - private void OnEnergyChanged(Entity crystal, ref CP14MagicEnergyLevelChangeEvent args) - { - if (!_container.TryGetContainingContainer((crystal.Owner, null, null), out var container)) - return; - - if (!TryComp(container.Owner, out CP14MagicEnergyCrystalSlotComponent? slot)) - return; - - if (!_itemSlots.TryGetSlot(container.Owner, slot.SlotId, out var itemSlot)) - return; - - if (itemSlot.Item != crystal) - return; - - RaiseLocalEvent(container.Owner, new CP14SlotCrystalChangedEvent(false)); - } - - private void OnExamined(Entity ent, ref ExaminedEvent args) - { - if (!TryGetEnergyCrystalFromSlot((ent, ent), out var energyEnt)) - return; - - if (!args.IsInDetailsRange) - return; - - // TODO: scan energy ability - // var scanEvent = new CP14MagicEnergyScanEvent(); - // RaiseLocalEvent(args.Examiner, scanEvent); - // - // if (!scanEvent.CanScan) - // return; - - args.PushMarkup(_magicEnergy.GetEnergyExaminedText((energyEnt.Value, energyEnt))); - } - - public bool TryGetEnergyCrystalFromSlot(Entity ent, - [NotNullWhen(true)] out Entity? energyEnt) - { - energyEnt = null; - - if (!Resolve(ent, ref ent.Comp, false)) - return false; - - if (!_itemSlots.TryGetSlot(ent, ent.Comp.SlotId, out var slot)) - return false; - - if (slot.Item is null) - return false; - - if (!TryComp(slot.Item, out var energyComp)) - return false; - - energyEnt = (slot.Item.Value, energyComp); - return true; - } - - public bool HasEnergy(Entity ent, - FixedPoint2 energy, - EntityUid? user = null) - { - if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt)) - { - if (user is not null) - _popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent,user.Value); - - return false; - } - - if (energyEnt.Value.Comp.Energy >= energy) - return true; - - if (user is not null) - _popup.PopupEntity(Loc.GetString("cp14-magic-energy-insufficient"), ent, user.Value); - - return false; - } - - public bool TryChangeEnergy(Entity ent, - FixedPoint2 energy, - EntityUid? user = null, - bool safe = false) - { - if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt)) - { - if (user is not null) - _popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent, user.Value); - - return false; - } - - _magicEnergy.ChangeEnergy((energyEnt.Value, energyEnt.Value), energy, out _, out _, safe); - return true; - } } diff --git a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs similarity index 91% rename from Content.Server/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs rename to Content.Shared/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs index 6dd76560da..2b6ad1afad 100644 --- a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs +++ b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14AffectSolutionTemperature.cs @@ -2,7 +2,7 @@ using Content.Shared.EntityEffects; using JetBrains.Annotations; using Robust.Shared.Prototypes; -namespace Content.Server._CP14.Chemistry.ReagentEffect; +namespace Content.Shared._CP14.Chemistry.ReagentEffect; [UsedImplicitly] [DataDefinition] @@ -12,8 +12,7 @@ public sealed partial class CP14AffectSolutionTemperature : EntityEffect /// Temperature added to the solution. If negative, the solution is cooling. /// [DataField] - private float AddTemperature = -300f; - + public float AddTemperature = -300f; protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) { diff --git a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs similarity index 94% rename from Content.Server/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs rename to Content.Shared/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs index c3d0c88bd2..c4caee7264 100644 --- a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs +++ b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14InverseEffect.cs @@ -1,4 +1,3 @@ -using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reagent; using Content.Shared.EntityEffects; @@ -6,7 +5,7 @@ using Content.Shared.FixedPoint; using JetBrains.Annotations; using Robust.Shared.Prototypes; -namespace Content.Server._CP14.Chemistry.ReagentEffect; +namespace Content.Shared._CP14.Chemistry.ReagentEffect; [UsedImplicitly] [DataDefinition] @@ -14,6 +13,7 @@ public sealed partial class CP14InverseEffect : EntityEffect { [DataField] public Dictionary, ProtoId> Inversion = new(); + protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) { return Loc.GetString("cp14-reagent-effect-guidebook-inverse-effect", ("chance", Probability)); diff --git a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs similarity index 85% rename from Content.Server/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs rename to Content.Shared/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs index 9fc5ecd652..021b8cf041 100644 --- a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs +++ b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14ManaChange.cs @@ -1,11 +1,11 @@ -using Content.Server._CP14.MagicEnergy; +using Content.Shared._CP14.MagicEnergy; using Content.Shared._CP14.MagicEnergy.Components; using Content.Shared.EntityEffects; using Content.Shared.FixedPoint; using JetBrains.Annotations; using Robust.Shared.Prototypes; -namespace Content.Server._CP14.Chemistry.ReagentEffect; +namespace Content.Shared._CP14.Chemistry.ReagentEffect; [UsedImplicitly] [DataDefinition] @@ -35,7 +35,7 @@ public sealed partial class CP14ManaChange : EntityEffect if (args is EntityEffectReagentArgs reagentArgs) scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale; - var magicSystem = entityManager.System(); + var magicSystem = entityManager.System(); magicSystem.ChangeEnergy(args.TargetEntity, ManaDelta * scale, out var changed, out var overload, safe: Safe); scale -= FixedPoint2.Abs(changed + overload); @@ -43,7 +43,7 @@ public sealed partial class CP14ManaChange : EntityEffect if (!args.EntityManager.TryGetComponent(args.TargetEntity, out var crystalSlot)) return; - var slotSystem = entityManager.System(); + var slotSystem = entityManager.System(); slotSystem.TryChangeEnergy((args.TargetEntity, crystalSlot), ManaDelta * scale); } } diff --git a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs similarity index 96% rename from Content.Server/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs rename to Content.Shared/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs index 9f08f87387..1ee412ac55 100644 --- a/Content.Server/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs +++ b/Content.Shared/_CP14/Chemistry/ReagentEffect/CP14PlantResourceModify.cs @@ -5,7 +5,7 @@ using Content.Shared.EntityEffects; using JetBrains.Annotations; using Robust.Shared.Prototypes; -namespace Content.Server._CP14.Chemistry.ReagentEffect; +namespace Content.Shared._CP14.Chemistry.ReagentEffect; [UsedImplicitly] [DataDefinition] diff --git a/Content.Shared/_CP14/MagicEnergy/SharedCP14MagicEnergyCrystalSlotSystem.cs b/Content.Shared/_CP14/MagicEnergy/SharedCP14MagicEnergyCrystalSlotSystem.cs index 164fee8ce9..787b6bfc59 100644 --- a/Content.Shared/_CP14/MagicEnergy/SharedCP14MagicEnergyCrystalSlotSystem.cs +++ b/Content.Shared/_CP14/MagicEnergy/SharedCP14MagicEnergyCrystalSlotSystem.cs @@ -1,5 +1,9 @@ +using System.Diagnostics.CodeAnalysis; using Content.Shared._CP14.MagicEnergy.Components; using Content.Shared.Containers.ItemSlots; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Popups; using Robust.Shared.Containers; namespace Content.Shared._CP14.MagicEnergy; @@ -7,6 +11,10 @@ namespace Content.Shared._CP14.MagicEnergy; public abstract class SharedCP14MagicEnergyCrystalSlotSystem : EntitySystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly SharedCP14MagicEnergySystem _magicEnergy = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; public override void Initialize() { @@ -14,6 +22,11 @@ public abstract class SharedCP14MagicEnergyCrystalSlotSystem : EntitySystem SubscribeLocalEvent(OnCrystalInserted); SubscribeLocalEvent(OnCrystalRemoved); + + SubscribeLocalEvent(OnEnergyChanged); + + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnCrystalChanged); } private void OnCrystalRemoved(Entity slot, ref EntRemovedFromContainerMessage args) @@ -37,4 +50,105 @@ public abstract class SharedCP14MagicEnergyCrystalSlotSystem : EntitySystem _appearance.SetData(slot, CP14MagicSlotVisuals.Inserted, true); RaiseLocalEvent(slot, new CP14SlotCrystalChangedEvent(false)); } + + public bool TryGetEnergyCrystalFromSlot(Entity ent, + [NotNullWhen(true)] out Entity? energyEnt) + { + energyEnt = null; + + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + if (!_itemSlots.TryGetSlot(ent, ent.Comp.SlotId, out var slot)) + return false; + + if (slot.Item is null) + return false; + + if (!TryComp(slot.Item, out var energyComp)) + return false; + + energyEnt = (slot.Item.Value, energyComp); + return true; + } + public bool HasEnergy(Entity ent, + FixedPoint2 energy, + EntityUid? user = null) + { + if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt)) + { + if (user is not null) + _popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent,user.Value); + + return false; + } + + if (energyEnt.Value.Comp.Energy >= energy) + return true; + + if (user is not null) + _popup.PopupEntity(Loc.GetString("cp14-magic-energy-insufficient"), ent, user.Value); + + return false; + } + + public bool TryChangeEnergy(Entity ent, + FixedPoint2 energy, + EntityUid? user = null, + bool safe = false) + { + if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt)) + { + if (user is not null) + _popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent, user.Value); + + return false; + } + + _magicEnergy.ChangeEnergy((energyEnt.Value, energyEnt.Value), energy, out _, out _, safe); + return true; + } + + private void OnCrystalChanged(Entity ent, ref CP14SlotCrystalChangedEvent args) + { + var realPowered = TryGetEnergyCrystalFromSlot((ent, ent), out var energyComp); + if (energyComp is not null) + realPowered = energyComp.Value.Comp.Energy > 0; + + if (ent.Comp.Powered == realPowered) + return; + + ent.Comp.Powered = realPowered; + _appearance.SetData(ent, CP14MagicSlotVisuals.Powered, realPowered); + + RaiseLocalEvent(ent, new CP14SlotCrystalPowerChangedEvent(realPowered)); + } + + private void OnEnergyChanged(Entity crystal, ref CP14MagicEnergyLevelChangeEvent args) + { + if (!_container.TryGetContainingContainer((crystal.Owner, null, null), out var container)) + return; + + if (!TryComp(container.Owner, out CP14MagicEnergyCrystalSlotComponent? slot)) + return; + + if (!_itemSlots.TryGetSlot(container.Owner, slot.SlotId, out var itemSlot)) + return; + + if (itemSlot.Item != crystal) + return; + + RaiseLocalEvent(container.Owner, new CP14SlotCrystalChangedEvent(false)); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (!TryGetEnergyCrystalFromSlot((ent, ent), out var energyEnt)) + return; + + if (!args.IsInDetailsRange) + return; + + args.PushMarkup(_magicEnergy.GetEnergyExaminedText((energyEnt.Value, energyEnt))); + } }