Puddles & spreader refactor (#15191)

This commit is contained in:
metalgearsloth
2023-04-10 15:37:03 +10:00
committed by GitHub
parent 3178ab83f6
commit 317a4013eb
141 changed files with 3046 additions and 3201 deletions

View File

@@ -1,43 +0,0 @@
using System.Linq;
using Content.Server.Chemistry.Components;
using Content.Server.Chemistry.ReactionEffects;
using Content.Shared.Chemistry.Reaction;
using JetBrains.Annotations;
namespace Content.Server.Chemistry.EntitySystems
{
[UsedImplicitly]
public sealed class SolutionAreaEffectSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SolutionAreaEffectComponent, ReactionAttemptEvent>(OnReactionAttempt);
}
public override void Update(float frameTime)
{
foreach (var inception in EntityManager.EntityQuery<SolutionAreaEffectInceptionComponent>().ToArray())
{
inception.InceptionUpdate(frameTime);
}
}
private void OnReactionAttempt(EntityUid uid, SolutionAreaEffectComponent component, ReactionAttemptEvent args)
{
if (args.Solution.Name != SolutionAreaEffectComponent.SolutionName)
return;
// Prevent smoke/foam fork bombs (smoke creating more smoke).
foreach (var effect in args.Reaction.Effects)
{
if (effect is AreaReactionEffect)
{
args.Cancel();
return;
}
}
}
}
}

View File

@@ -8,6 +8,7 @@ using Content.Shared.Chemistry.Reagent;
using Content.Shared.Examine;
using Content.Shared.FixedPoint;
using JetBrains.Annotations;
using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -127,6 +128,17 @@ public sealed partial class SolutionContainerSystem : EntitySystem
return splitSol;
}
/// <summary>
/// Splits a solution without the specified reagent.
/// </summary>
public Solution SplitSolutionWithout(EntityUid targetUid, Solution solutionHolder, FixedPoint2 quantity,
string reagent)
{
var splitSol = solutionHolder.SplitSolutionWithout(quantity, reagent);
UpdateChemicals(targetUid, solutionHolder);
return splitSol;
}
public void UpdateChemicals(EntityUid uid, Solution solutionHolder, bool needsReactionsProcessing = false, ReactionMixerComponent? mixerComponent = null)
{
DebugTools.Assert(solutionHolder.Name != null && TryGetSolution(uid, solutionHolder.Name, out var tmp) && tmp == solutionHolder);
@@ -491,6 +503,37 @@ public sealed partial class SolutionContainerSystem : EntitySystem
return false;
}
/// <summary>
/// Gets the most common reagent across all solutions by volume.
/// </summary>
/// <param name="component"></param>
public ReagentPrototype? GetMaxReagent(SolutionContainerManagerComponent component)
{
if (component.Solutions.Count == 0)
return null;
var reagentCounts = new Dictionary<string, FixedPoint2>();
foreach (var solution in component.Solutions.Values)
{
foreach (var reagent in solution.Contents)
{
reagentCounts.TryGetValue(reagent.ReagentId, out var existing);
existing += reagent.Quantity;
reagentCounts[reagent.ReagentId] = existing;
}
}
var max = reagentCounts.Max();
return _prototypeManager.Index<ReagentPrototype>(max.Key);
}
public SoundSpecifier? GetSound(SolutionContainerManagerComponent component)
{
var max = GetMaxReagent(component);
return max?.FootstepSound;
}
// Thermal energy and temperature management.