* Rename SolutionContainerCaps -> Capability * Move IExamine event to Chemistry System. * ECS the ISolutionChange into SolutionChangeEvent * Unify SolutionContainer into a single shared component * Replace ISolutionInteraction with SolutionContainerComponent * Move all methods from SolutionContainer to ChemistrySystem * Refactor EntitySystem calls to Dependencies * Refactor SolutionContainer to SolutionManager * Fix yamls * Fix test fails * Fix post merge issues * Fix various issues with SolutionManager * More fixes * Fix more components * Fix events not being directed * Fixes for Hypospray * Separate removal and iteration on Metabolism * Fix creampie problems * Address some of sloth's issues * Refactors for Systems * Refactored solution location * Fix tests * Address more sloth issues * Fix dependency * Fix merge conflicts * Add xmldocs for Capabilities components * Remove HasSolution/TryGetDefaultSolution and Add/Remove Drainable/Refillable * Replace Grindable/Juiceable with Extractable * Refactor field names * Fix Drainable * Fix some issues with spillable and injector * Fix issues with Grinder * Fix Beaker having duplicate solutions * Fix foaming * Address some MGS issues * Fix Uid issues * Fix errors in solution Tranfer * Fixed some extra values constant values * Cola is drinkable now
69 lines
2.6 KiB
C#
69 lines
2.6 KiB
C#
using Content.Shared.Chemistry.Components;
|
|
using Content.Shared.Chemistry.Reagent;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.Serialization.Manager.Attributes;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.Damage.Components;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Serialization;
|
|
|
|
namespace Content.Server.Chemistry.ReagentEffects
|
|
{
|
|
/// <summary>
|
|
/// Default metabolism for medicine reagents. Attempts to find a DamageableComponent on the target,
|
|
/// and to update its damage values.
|
|
/// </summary>
|
|
public class HealthChange : ReagentEffect, ISerializationHooks
|
|
{
|
|
/// <summary>
|
|
/// How much damage is changed when 1u of the reagent is metabolized.
|
|
/// </summary>
|
|
[DataField("healthChange")]
|
|
public float AmountToChange { get; set; } = 1.0f;
|
|
|
|
// TODO DAMAGE UNITS When damage units support decimals, get rid of this.
|
|
// See also _accumulatedDamage in ThirstComponent and HungerComponent
|
|
private float _accumulatedDamage;
|
|
|
|
/// <summary>
|
|
/// Damage group to change.
|
|
/// </summary>
|
|
// TODO PROTOTYPE Replace this datafield variable with prototype references, once they are supported.
|
|
// Also remove ISerializationHooks, if no longer needed.
|
|
[DataField("damageGroup", required: true)]
|
|
private readonly string _damageGroupID = default!;
|
|
public DamageGroupPrototype DamageGroup = default!;
|
|
void ISerializationHooks.AfterDeserialization()
|
|
{
|
|
DamageGroup = IoCManager.Resolve<IPrototypeManager>().Index<DamageGroupPrototype>(_damageGroupID);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Changes damage if a DamageableComponent can be found.
|
|
/// </summary>
|
|
public override void Metabolize(IEntity solutionEntity, Solution.ReagentQuantity amount)
|
|
{
|
|
if (solutionEntity.TryGetComponent(out IDamageableComponent? damageComponent))
|
|
{
|
|
damageComponent.TryChangeDamage(DamageGroup, (int)AmountToChange, true);
|
|
|
|
float decHealthChange = (float) (AmountToChange - (int) AmountToChange);
|
|
_accumulatedDamage += decHealthChange;
|
|
|
|
if (_accumulatedDamage >= 1)
|
|
{
|
|
damageComponent.TryChangeDamage(DamageGroup, 1, true);
|
|
_accumulatedDamage -= 1;
|
|
}
|
|
|
|
else if(_accumulatedDamage <= -1)
|
|
{
|
|
damageComponent.TryChangeDamage(DamageGroup, -1, true);
|
|
_accumulatedDamage += 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|