Sharedization of entityEffects and crystals slots system
This commit is contained in:
@@ -1,38 +0,0 @@
|
||||
using Content.Shared.EntityEffects;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Chemistry.ReagentEffect;
|
||||
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class CP14AffectSolutionTemperature : EntityEffect
|
||||
{
|
||||
/// <summary>
|
||||
/// Temperature added to the solution. If negative, the solution is cooling.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
private float AddTemperature = -300f;
|
||||
|
||||
|
||||
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
{
|
||||
return Loc.GetString("cp14-reagent-effect-guidebook-temp-affect",
|
||||
("chance", Probability),
|
||||
("temperature", AddTemperature));
|
||||
}
|
||||
|
||||
public override void Effect(EntityEffectBaseArgs args)
|
||||
{
|
||||
if (args is EntityEffectReagentArgs reagentArgs)
|
||||
{
|
||||
if (reagentArgs.Source != null)
|
||||
reagentArgs.Source.Temperature += AddTemperature;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Someone needs to figure out how to do this for non-reagent effects.
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Chemistry.EntitySystems;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.EntityEffects;
|
||||
using Content.Shared.FixedPoint;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Chemistry.ReagentEffect;
|
||||
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class CP14InverseEffect : EntityEffect
|
||||
{
|
||||
[DataField]
|
||||
public Dictionary<ProtoId<ReagentPrototype>, ProtoId<ReagentPrototype>> Inversion = new();
|
||||
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
{
|
||||
return Loc.GetString("cp14-reagent-effect-guidebook-inverse-effect", ("chance", Probability));
|
||||
}
|
||||
|
||||
public override void Effect(EntityEffectBaseArgs args)
|
||||
{
|
||||
if (args is EntityEffectReagentArgs reagentArgs)
|
||||
{
|
||||
if (reagentArgs.Source is null)
|
||||
return;
|
||||
|
||||
if (reagentArgs.SolutionEntity is null)
|
||||
return;
|
||||
|
||||
var solutionContainer = args.EntityManager.System<SharedSolutionContainerSystem>();
|
||||
|
||||
Dictionary<ReagentId, FixedPoint2> taskList = new();
|
||||
|
||||
foreach (var reagent in reagentArgs.Source.Contents)
|
||||
{
|
||||
if (Inversion.ContainsKey(reagent.Reagent.Prototype))
|
||||
taskList.Add(reagent.Reagent, reagent.Quantity);
|
||||
}
|
||||
|
||||
foreach (var task in taskList)
|
||||
{
|
||||
solutionContainer.RemoveReagent(reagentArgs.SolutionEntity.Value, task.Key, task.Value);
|
||||
solutionContainer.TryAddReagent(reagentArgs.SolutionEntity.Value, Inversion[task.Key.Prototype].Id, task.Value);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: Someone needs to figure out how to do this for non-reagent effects.
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
using Content.Server._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;
|
||||
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class CP14ManaChange : EntityEffect
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public float ManaDelta = 1;
|
||||
|
||||
[DataField]
|
||||
public bool Safe;
|
||||
|
||||
[DataField]
|
||||
public bool ScaleByQuantity;
|
||||
|
||||
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
{
|
||||
return Loc.GetString(ManaDelta >= 0 ? "cp14-reagent-effect-guidebook-mana-add" : "cp14-reagent-effect-guidebook-mana-remove",
|
||||
("chance", Probability),
|
||||
("amount", Math.Abs(ManaDelta)));
|
||||
}
|
||||
|
||||
public override void Effect(EntityEffectBaseArgs args)
|
||||
{
|
||||
var entityManager = args.EntityManager;
|
||||
var scale = FixedPoint2.New(1);
|
||||
|
||||
if (args is EntityEffectReagentArgs reagentArgs)
|
||||
scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale;
|
||||
|
||||
var magicSystem = entityManager.System<CP14MagicEnergySystem>();
|
||||
magicSystem.ChangeEnergy(args.TargetEntity, ManaDelta * scale, out var changed, out var overload, safe: Safe);
|
||||
|
||||
scale -= FixedPoint2.Abs(changed + overload);
|
||||
|
||||
if (!args.EntityManager.TryGetComponent<CP14MagicEnergyCrystalSlotComponent>(args.TargetEntity, out var crystalSlot))
|
||||
return;
|
||||
|
||||
var slotSystem = entityManager.System<CP14MagicEnergyCrystalSlotSystem>();
|
||||
slotSystem.TryChangeEnergy((args.TargetEntity, crystalSlot), ManaDelta * scale);
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
using System.Text;
|
||||
using Content.Shared._CP14.Farming;
|
||||
using Content.Shared._CP14.Farming.Components;
|
||||
using Content.Shared.EntityEffects;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server._CP14.Chemistry.ReagentEffect;
|
||||
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed partial class CP14PlantResourceModify : EntityEffect
|
||||
{
|
||||
[DataField]
|
||||
public float Energy = 0f;
|
||||
|
||||
[DataField]
|
||||
public float Resourse = 0f;
|
||||
|
||||
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
if (Energy != 0)
|
||||
sb.Append(Loc.GetString(Energy > 0 ? "cp14-reagent-effect-guidebook-plant-add-energy" : "cp14-reagent-effect-guidebook-plant-remove-energy", ("amount", Energy), ("chance", Probability)));
|
||||
if (Resourse != 0)
|
||||
sb.Append(Loc.GetString(Resourse > 0 ? "cp14-reagent-effect-guidebook-plant-add-resource" : "cp14-reagent-effect-guidebook-plant-remove-resource", ("amount", Resourse), ("chance", Probability)));
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public override void Effect(EntityEffectBaseArgs args)
|
||||
{
|
||||
var scale = 1f;
|
||||
|
||||
if (args is EntityEffectReagentArgs reagentArgs)
|
||||
{
|
||||
scale = reagentArgs.Quantity.Float() * reagentArgs.Scale.Float();
|
||||
}
|
||||
|
||||
if (!args.EntityManager.TryGetComponent<CP14PlantComponent>(args.TargetEntity, out var plantComp))
|
||||
return;
|
||||
|
||||
var plantSystem = args.EntityManager.System<CP14SharedFarmingSystem>();
|
||||
|
||||
plantSystem.AffectEnergy((args.TargetEntity, plantComp), Energy * scale);
|
||||
plantSystem.AffectResource((args.TargetEntity, plantComp), Resourse * scale);
|
||||
}
|
||||
}
|
||||
@@ -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<CP14MagicEnergyCrystalComponent, CP14MagicEnergyLevelChangeEvent>(OnEnergyChanged);
|
||||
|
||||
SubscribeLocalEvent<CP14MagicEnergyCrystalSlotComponent, ExaminedEvent>(OnExamined);
|
||||
SubscribeLocalEvent<CP14MagicEnergyCrystalSlotComponent, CP14SlotCrystalChangedEvent>(OnCrystalChanged);
|
||||
}
|
||||
|
||||
private void OnCrystalChanged(Entity<CP14MagicEnergyCrystalSlotComponent> 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<CP14MagicEnergyCrystalComponent> 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<CP14MagicEnergyCrystalSlotComponent> 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<CP14MagicEnergyCrystalSlotComponent?> ent,
|
||||
[NotNullWhen(true)] out Entity<CP14MagicEnergyContainerComponent>? 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<CP14MagicEnergyContainerComponent>(slot.Item, out var energyComp))
|
||||
return false;
|
||||
|
||||
energyEnt = (slot.Item.Value, energyComp);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool HasEnergy(Entity<CP14MagicEnergyCrystalSlotComponent?> 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<CP14MagicEnergyCrystalSlotComponent?> 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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user