Generalize ReagentUnit into FixedPoint2 and use it for damage calculations (#5151)

* Damage units

* sum ext method
This commit is contained in:
mirrorcult
2021-11-03 16:48:03 -07:00
committed by GitHub
parent 8165d8f38c
commit 3ab4a30a0f
100 changed files with 730 additions and 601 deletions

View File

@@ -1,6 +1,7 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.Audio;
using Robust.Shared.GameObjects;
using Robust.Shared.Player;
@@ -9,7 +10,7 @@ namespace Content.Server.Chemistry.EntitySystems
{
public class ChemicalReactionSystem : SharedChemicalReactionSystem
{
protected override void OnReaction(Solution solution, ReactionPrototype reaction, IEntity owner, ReagentUnit unitReactions)
protected override void OnReaction(Solution solution, ReactionPrototype reaction, IEntity owner, FixedPoint2 unitReactions)
{
base.OnReaction(solution, reaction, owner, unitReactions);

View File

@@ -1,6 +1,7 @@
using Content.Server.Chemistry.Components;
using Content.Server.Popups;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -21,7 +22,7 @@ namespace Content.Server.Chemistry.EntitySystems
private void OnSolutionChange(EntityUid uid, RehydratableComponent component, SolutionChangedEvent args)
{
if (_solutionsSystem.GetReagentQuantity(uid, component.CatalystPrototype) > ReagentUnit.Zero)
if (_solutionsSystem.GetReagentQuantity(uid, component.CatalystPrototype) > FixedPoint2.Zero)
{
Expand(component, component.Owner);
}

View File

@@ -2,6 +2,7 @@
using Content.Server.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Robust.Shared.GameObjects;
namespace Content.Server.Chemistry.EntitySystems
@@ -26,7 +27,7 @@ namespace Content.Server.Chemistry.EntitySystems
TryAddSolution(targetUid, targetSolution, addedSolution);
}
public Solution Draw(EntityUid targetUid, Solution solution, ReagentUnit amount,
public Solution Draw(EntityUid targetUid, Solution solution, FixedPoint2 amount,
DrawableSolutionComponent? drawableSolution = null)
{
if (!Resolve(targetUid, ref drawableSolution, false))
@@ -35,7 +36,7 @@ namespace Content.Server.Chemistry.EntitySystems
return SplitSolution(targetUid, solution, amount);
}
public Solution Drain(EntityUid targetUid, Solution targetSolution, ReagentUnit amount,
public Solution Drain(EntityUid targetUid, Solution targetSolution, FixedPoint2 amount,
DrainableSolutionComponent? drainableSolution = null)
{
if (!Resolve(targetUid, ref drainableSolution, false))
@@ -106,10 +107,10 @@ namespace Content.Server.Chemistry.EntitySystems
return true;
}
public ReagentUnit DrainAvailable(EntityUid uid)
public FixedPoint2 DrainAvailable(EntityUid uid)
{
return !TryGetDrainableSolution(uid, out var solution)
? ReagentUnit.Zero
? FixedPoint2.Zero
: solution.CurrentVolume;
}

View File

@@ -7,6 +7,7 @@ using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Examine;
using Content.Shared.FixedPoint;
using JetBrains.Annotations;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
@@ -51,7 +52,7 @@ namespace Content.Server.Chemistry.EntitySystems
foreach (var keyValue in component.Solutions)
{
var solutionHolder = keyValue.Value;
if (solutionHolder.MaxVolume == ReagentUnit.Zero)
if (solutionHolder.MaxVolume == FixedPoint2.Zero)
{
solutionHolder.MaxVolume = solutionHolder.TotalVolume > solutionHolder.InitialMaxVolume
? solutionHolder.TotalVolume
@@ -115,7 +116,7 @@ namespace Content.Server.Chemistry.EntitySystems
/// <param name="solutionHolder"></param>
/// <param name="quantity">the volume of solution to remove.</param>
/// <returns>The solution that was removed.</returns>
public Solution SplitSolution(EntityUid targetUid, Solution solutionHolder, ReagentUnit quantity)
public Solution SplitSolution(EntityUid targetUid, Solution solutionHolder, FixedPoint2 quantity)
{
var splitSol = solutionHolder.SplitSolution(quantity);
UpdateChemicals(targetUid, solutionHolder);
@@ -164,8 +165,8 @@ namespace Content.Server.Chemistry.EntitySystems
/// <param name="quantity">The amount of reagent to add.</param>
/// <param name="acceptedQuantity">The amount of reagent successfully added.</param>
/// <returns>If all the reagent could be added.</returns>
public bool TryAddReagent(EntityUid targetUid, Solution targetSolution, string reagentId, ReagentUnit quantity,
out ReagentUnit acceptedQuantity)
public bool TryAddReagent(EntityUid targetUid, Solution targetSolution, string reagentId, FixedPoint2 quantity,
out FixedPoint2 acceptedQuantity)
{
acceptedQuantity = targetSolution.AvailableVolume > quantity ? quantity : targetSolution.AvailableVolume;
targetSolution.AddReagent(reagentId, acceptedQuantity);
@@ -184,7 +185,7 @@ namespace Content.Server.Chemistry.EntitySystems
/// <param name="reagentId">The Id of the reagent to remove.</param>
/// <param name="quantity">The amount of reagent to remove.</param>
/// <returns>If the reagent to remove was found in the container.</returns>
public bool TryRemoveReagent(EntityUid targetUid, Solution? container, string reagentId, ReagentUnit quantity)
public bool TryRemoveReagent(EntityUid targetUid, Solution? container, string reagentId, FixedPoint2 quantity)
{
if (container == null || !container.ContainsReagent(reagentId))
return false;
@@ -248,7 +249,7 @@ namespace Content.Server.Chemistry.EntitySystems
return solutionsMgr.Solutions[name];
}
public string[] RemoveEachReagent(Solution solution, ReagentUnit quantity)
public string[] RemoveEachReagent(Solution solution, FixedPoint2 quantity)
{
var removedReagent = new string[solution.Contents.Count];
if (quantity <= 0)
@@ -284,9 +285,9 @@ namespace Content.Server.Chemistry.EntitySystems
}
}
public ReagentUnit GetReagentQuantity(EntityUid ownerUid, string reagentId)
public FixedPoint2 GetReagentQuantity(EntityUid ownerUid, string reagentId)
{
var reagentQuantity = ReagentUnit.New(0);
var reagentQuantity = FixedPoint2.New(0);
if (EntityManager.TryGetEntity(ownerUid, out var owner)
&& owner.TryGetComponent(out SolutionContainerManagerComponent? managerComponent))
{

View File

@@ -6,6 +6,7 @@ using Robust.Shared.Localization;
using Robust.Server.GameObjects;
using System.Collections.Generic;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Content.Shared.Popups;
namespace Content.Server.Chemistry.EntitySystems
@@ -53,7 +54,7 @@ namespace Content.Server.Chemistry.EntitySystems
verb.Category = VerbCategory.SetTransferAmount;
verb.Act = () =>
{
component.TransferAmount = ReagentUnit.New(amount);
component.TransferAmount = FixedPoint2.New(amount);
args.User.PopupMessage(Loc.GetString("comp-solution-transfer-set-amount", ("amount", amount)));
};

View File

@@ -2,6 +2,7 @@
using Content.Server.Chemistry.Components.SolutionManager;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.FixedPoint;
using Content.Shared.Physics;
using Content.Shared.Vapor;
using JetBrains.Annotations;
@@ -104,7 +105,7 @@ namespace Content.Server.Chemistry.EntitySystems
var tile = mapGrid.GetTileRef(entity.Transform.Coordinates.ToVector2i(EntityManager, _mapManager));
foreach (var reagentQuantity in contents.Contents.ToArray())
{
if (reagentQuantity.Quantity == ReagentUnit.Zero) continue;
if (reagentQuantity.Quantity == FixedPoint2.Zero) continue;
var reagent = _protoManager.Index<ReagentPrototype>(reagentQuantity.ReagentId);
_solutionContainerSystem.TryRemoveReagent(vapor.Owner.Uid, contents, reagentQuantity.ReagentId,
reagent.ReactionTile(tile, (reagentQuantity.Quantity / vapor.TransferAmount) * 0.25f));