| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- using Content.Server.Destructible;
- using Content.Shared.Construction;
- using Content.Shared.Damage;
- using Content.Shared.Examine;
- using Content.Shared.FixedPoint;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Content.Server.Construction.Conditions;
- /// <summary>
- /// Requires that the structure has at least some amount of health
- /// </summary>
- [DataDefinition]
- public sealed partial class MinHealth : IGraphCondition
- {
- /// <summary>
- /// If ByProportion is true, Threshold is a value less than or equal to 1, but more than 0,
- /// which is compared to the percent of health remaining in the structure.
- /// Else, Threshold is any positive value with at most 2 decimal points of percision,
- /// which is compared to the current health of the structure.
- /// </summary>
- [DataField]
- public FixedPoint2 Threshold = 1;
- [DataField]
- public bool ByProportion = false;
- [DataField]
- public bool IncludeEquals = true;
- public bool Condition(EntityUid uid, IEntityManager entMan)
- {
- if (!entMan.TryGetComponent(uid, out DestructibleComponent? destructibleComp) ||
- !entMan.TryGetComponent(uid, out DamageableComponent? damageComp))
- {
- return false;
- }
- var destructionSys = entMan.System<DestructibleSystem>();
- var maxHealth = destructionSys.DestroyedAt(uid, destructibleComp);
- var curHealth = maxHealth - damageComp.TotalDamage;
- var proportionHealth = curHealth / maxHealth;
- if (IncludeEquals)
- {
- if (ByProportion)
- {
- return proportionHealth >= Threshold;
- }
- else
- {
- return curHealth >= Threshold;
- }
- }
- else
- {
- if (ByProportion)
- {
- return proportionHealth > Threshold;
- }
- else
- {
- return curHealth > Threshold;
- }
- }
- }
- public bool DoExamine(ExaminedEvent args)
- {
- var entMan = IoCManager.Resolve<IEntityManager>();
- var entity = args.Examined;
- if (Condition(entity, entMan))
- {
- return false;
- }
- args.PushMarkup(Loc.GetString("construction-examine-condition-low-health"));
- return true;
- }
- public IEnumerable<ConstructionGuideEntry> GenerateGuideEntry()
- {
- yield return new ConstructionGuideEntry()
- {
- Localization = "construction-step-condition-low-health"
- };
- }
- }
|