From 2dd804930dc41f037209e93d971b16257d923acf Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Tue, 6 Sep 2022 17:08:19 +1200 Subject: [PATCH] Fix log component parenting issues (#11073) --- .../Botany/Components/LogComponent.cs | 1 + Content.Server/Botany/Systems/LogSystem.cs | 30 ++++++++++++---- .../EntitySystems/SliceableFoodSystem.cs | 35 +++++++++++++------ 3 files changed, 50 insertions(+), 16 deletions(-) diff --git a/Content.Server/Botany/Components/LogComponent.cs b/Content.Server/Botany/Components/LogComponent.cs index f72638a74a..eb45bae672 100644 --- a/Content.Server/Botany/Components/LogComponent.cs +++ b/Content.Server/Botany/Components/LogComponent.cs @@ -4,6 +4,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Server.Botany.Components; // TODO: This should probably be merged with SliceableFood somehow or made into a more generic Choppable. +// Yeah this is pretty trash. also consolidating this type of behavior will avoid future transform parenting bugs (see #6090). [RegisterComponent] [Access(typeof(LogSystem))] diff --git a/Content.Server/Botany/Systems/LogSystem.cs b/Content.Server/Botany/Systems/LogSystem.cs index 675e0dc8e9..e9ac926d8a 100644 --- a/Content.Server/Botany/Systems/LogSystem.cs +++ b/Content.Server/Botany/Systems/LogSystem.cs @@ -1,12 +1,17 @@ -using Content.Server.Botany.Components; +using Content.Server.Botany.Components; using Content.Server.Kitchen.Components; +using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Random.Helpers; +using Robust.Shared.Containers; namespace Content.Server.Botany.Systems; public sealed class LogSystem : EntitySystem { + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + public override void Initialize() { base.Initialize(); @@ -16,15 +21,28 @@ public sealed class LogSystem : EntitySystem private void OnInteractUsing(EntityUid uid, LogComponent component, InteractUsingEvent args) { - if (HasComp(args.Used)) + if (!HasComp(args.Used)) + return; + + // if in some container, try pick up, else just drop to world + var inContainer = _containerSystem.IsEntityInContainer(uid); + var pos = Transform(uid).Coordinates; + + for (var i = 0; i < component.SpawnCount; i++) { - for (var i = 0; i < component.SpawnCount; i++) + var plank = Spawn(component.SpawnedPrototype, pos); + + if (inContainer) + _handsSystem.PickupOrDrop(args.User, plank); + else { - var plank = Spawn(component.SpawnedPrototype, Transform(uid).Coordinates); + var xform = Transform(plank); + _containerSystem.AttachParentToContainerOrGrid(xform); + xform.LocalRotation = 0; plank.RandomOffset(0.25f); } - - QueueDel(uid); } + + QueueDel(uid); } } diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index c0ba14b1bd..3cd84ecb28 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -64,12 +64,16 @@ namespace Content.Server.Nutrition.EntitySystems // Fill new slice FillSlice(sliceUid, lostSolution); - if (EntityManager.TryGetComponent(user, out HandsComponent? handsComponent)) + var inCont = _containerSystem.IsEntityInContainer(component.Owner); + if (inCont) { - if (_containerSystem.IsEntityInContainer(component.Owner)) - { - _handsSystem.PickupOrDrop(user, sliceUid, handsComp: handsComponent); - } + _handsSystem.PickupOrDrop(user, sliceUid); + } + else + { + var xform = Transform(sliceUid); + _containerSystem.AttachParentToContainerOrGrid(xform); + xform.LocalRotation = 0; } SoundSystem.Play(component.Sound.GetSound(), Filter.Pvs(uid), @@ -84,15 +88,26 @@ namespace Content.Server.Nutrition.EntitySystems } // Split last slice - if (component.Count == 1) { - var lastSlice = EntityManager.SpawnEntity(component.Slice, transform.Coordinates); + if (component.Count > 1) + return true; - // Fill last slice with the rest of the solution - FillSlice(lastSlice, solution); + sliceUid = EntityManager.SpawnEntity(component.Slice, transform.Coordinates); - EntityManager.DeleteEntity(uid); + // Fill last slice with the rest of the solution + FillSlice(sliceUid, solution); + + if (inCont) + { + _handsSystem.PickupOrDrop(user, sliceUid); + } + else + { + var xform = Transform(sliceUid); + _containerSystem.AttachParentToContainerOrGrid(xform); + xform.LocalRotation = 0; } + EntityManager.DeleteEntity(uid); return true; }