Fix non-humanoid mobs being destroyed on devour (#38087)
* Allow non-preference living things to be added to a devourer's stomach * Fix ordering of devour logic * Minor refactor for whitelist on storage and food preference * Fix linter issue * Coerce workflow to run again; also fix bad indenting error * Code review changes
This commit is contained in:
@@ -3,13 +3,14 @@ using Content.Shared.Body.Events;
|
||||
using Content.Shared.Chemistry.Components;
|
||||
using Content.Shared.Devour;
|
||||
using Content.Shared.Devour.Components;
|
||||
using Content.Shared.Humanoid;
|
||||
using Content.Shared.Whitelist;
|
||||
|
||||
namespace Content.Server.Devour;
|
||||
|
||||
public sealed class DevourSystem : SharedDevourSystem
|
||||
{
|
||||
[Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!;
|
||||
[Dependency] private readonly EntityWhitelistSystem _entityWhitelistSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -26,18 +27,20 @@ public sealed class DevourSystem : SharedDevourSystem
|
||||
|
||||
var ichorInjection = new Solution(component.Chemical, component.HealRate);
|
||||
|
||||
if (component.FoodPreference == FoodPreference.All ||
|
||||
(component.FoodPreference == FoodPreference.Humanoid && HasComp<HumanoidAppearanceComponent>(args.Args.Target)))
|
||||
// Grant ichor if the devoured thing meets the dragon's food preference
|
||||
if (args.Args.Target != null && _entityWhitelistSystem.IsWhitelistPassOrNull(component.FoodPreferenceWhitelist, (EntityUid)args.Args.Target))
|
||||
{
|
||||
if (component.ShouldStoreDevoured && args.Args.Target is not null)
|
||||
{
|
||||
ContainerSystem.Insert(args.Args.Target.Value, component.Stomach);
|
||||
}
|
||||
_bloodstreamSystem.TryAddToChemicals(uid, ichorInjection);
|
||||
}
|
||||
|
||||
// If the devoured thing meets the stomach whitelist criteria, add it to the stomach
|
||||
if (args.Args.Target != null && _entityWhitelistSystem.IsWhitelistPass(component.StomachStorageWhitelist, (EntityUid)args.Args.Target))
|
||||
{
|
||||
ContainerSystem.Insert(args.Args.Target.Value, component.Stomach);
|
||||
}
|
||||
//TODO: Figure out a better way of removing structures via devour that still entails standing still and waiting for a DoAfter. Somehow.
|
||||
//If it's not human, it must be a structure
|
||||
//If it's not alive, it must be a structure.
|
||||
// Delete if the thing isn't in the stomach storage whitelist (or the stomach whitelist is null/empty)
|
||||
else if (args.Args.Target != null)
|
||||
{
|
||||
QueueDel(args.Args.Target.Value);
|
||||
@@ -48,7 +51,7 @@ public sealed class DevourSystem : SharedDevourSystem
|
||||
|
||||
private void OnGibContents(EntityUid uid, DevourerComponent component, ref BeingGibbedEvent args)
|
||||
{
|
||||
if (!component.ShouldStoreDevoured)
|
||||
if (component.StomachStorageWhitelist == null)
|
||||
return;
|
||||
|
||||
// For some reason we have two different systems that should handle gibbing,
|
||||
|
||||
Reference in New Issue
Block a user