Fix gas tank and other hand-interaction bugs (#9700)

This commit is contained in:
Leon Friedrich
2022-07-31 14:56:26 +12:00
committed by GitHub
parent e227f208bc
commit bae540ab2f
6 changed files with 46 additions and 19 deletions

View File

@@ -45,7 +45,7 @@ namespace Content.IntegrationTests.Tests.Disposal
foreach (var entity in entities) foreach (var entity in entities)
{ {
Assert.That(system.CanInsert(unit, entity), Is.EqualTo(result)); Assert.That(system.CanInsert(unit, entity), Is.EqualTo(result));
system.TryInsert(unit.Owner, entity, entity); system.TryInsert(unit.Owner, entity, null);
} }
} }

View File

@@ -42,7 +42,17 @@ namespace Content.Server.Atmos.Components
/// <summary> /// <summary>
/// Tank is connected to internals. /// Tank is connected to internals.
/// </summary> /// </summary>
[ViewVariables] public bool IsConnected { get; set; } [ViewVariables] public bool IsConnected => User != null;
[ViewVariables]
public EntityUid? User;
/// <summary>
/// True if this entity was recently moved out of a container. This might have been a hand -> inventory
/// transfer, or it might have been the user dropping the tank. This indicates the tank needs to be checked.
/// </summary>
[ViewVariables]
public bool CheckUser;
/// <summary> /// <summary>
/// Pressure at which tanks start leaking. /// Pressure at which tanks start leaking.

View File

@@ -41,8 +41,7 @@ namespace Content.Server.Atmos.EntitySystems
SubscribeLocalEvent<GasTankComponent, GetItemActionsEvent>(OnGetActions); SubscribeLocalEvent<GasTankComponent, GetItemActionsEvent>(OnGetActions);
SubscribeLocalEvent<GasTankComponent, ExaminedEvent>(OnExamined); SubscribeLocalEvent<GasTankComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<GasTankComponent, ToggleActionEvent>(OnActionToggle); SubscribeLocalEvent<GasTankComponent, ToggleActionEvent>(OnActionToggle);
SubscribeLocalEvent<GasTankComponent, DroppedEvent>(OnDropped); SubscribeLocalEvent<GasTankComponent, EntParentChangedMessage>(OnParentChange);
SubscribeLocalEvent<GasTankComponent, GasTankSetPressureMessage>(OnGasTankSetPressure); SubscribeLocalEvent<GasTankComponent, GasTankSetPressureMessage>(OnGasTankSetPressure);
SubscribeLocalEvent<GasTankComponent, GasTankToggleInternalsMessage>(OnGasTankToggleInternals); SubscribeLocalEvent<GasTankComponent, GasTankToggleInternalsMessage>(OnGasTankToggleInternals);
} }
@@ -84,9 +83,12 @@ namespace Content.Server.Atmos.EntitySystems
UpdateUserInterface(component, true); UpdateUserInterface(component, true);
} }
private void OnDropped(EntityUid uid, GasTankComponent component, DroppedEvent args) private void OnParentChange(EntityUid uid, GasTankComponent component, ref EntParentChangedMessage args)
{ {
DisconnectFromInternals(component, args.User); // When an item is moved from hands -> pockets, the container removal briefly dumps the item on the floor.
// So this is a shitty fix, where the parent check is just delayed. But this really needs to get fixed
// properly at some point.
component.CheckUser = true;
} }
private void OnGetActions(EntityUid uid, GasTankComponent component, GetItemActionsEvent args) private void OnGetActions(EntityUid uid, GasTankComponent component, GetItemActionsEvent args)
@@ -122,6 +124,16 @@ namespace Content.Server.Atmos.EntitySystems
foreach (var gasTank in EntityManager.EntityQuery<GasTankComponent>()) foreach (var gasTank in EntityManager.EntityQuery<GasTankComponent>())
{ {
if (gasTank.CheckUser)
{
gasTank.CheckUser = false;
if (Transform(gasTank.Owner).ParentUid != gasTank.User)
{
DisconnectFromInternals(gasTank);
continue;
}
}
_atmosphereSystem.React(gasTank.Air, gasTank); _atmosphereSystem.React(gasTank.Air, gasTank);
CheckStatus(gasTank); CheckStatus(gasTank);
if (_ui.IsUiOpen(gasTank.Owner, SharedGasTankUiKey.Key)) if (_ui.IsUiOpen(gasTank.Owner, SharedGasTankUiKey.Key))
@@ -184,7 +196,10 @@ namespace Content.Server.Atmos.EntitySystems
if (!CanConnectToInternals(component)) return; if (!CanConnectToInternals(component)) return;
var internals = GetInternalsComponent(component); var internals = GetInternalsComponent(component);
if (internals == null) return; if (internals == null) return;
component.IsConnected = _internals.TryConnectTank(internals, component.Owner);
if (_internals.TryConnectTank(internals, component.Owner))
component.User = internals.Owner;
_actions.SetToggled(component.ToggleAction, component.IsConnected); _actions.SetToggled(component.ToggleAction, component.IsConnected);
// Couldn't toggle! // Couldn't toggle!
@@ -201,7 +216,7 @@ namespace Content.Server.Atmos.EntitySystems
public void DisconnectFromInternals(GasTankComponent component, EntityUid? owner = null) public void DisconnectFromInternals(GasTankComponent component, EntityUid? owner = null)
{ {
if (!component.IsConnected) return; if (!component.IsConnected) return;
component.IsConnected = false; component.User = null;
_actions.SetToggled(component.ToggleAction, false); _actions.SetToggled(component.ToggleAction, false);
_internals.DisconnectTank(GetInternalsComponent(component, owner)); _internals.DisconnectTank(GetInternalsComponent(component, owner));

View File

@@ -181,10 +181,10 @@ namespace Content.Server.Disposal.Unit.EntitySystems
return; return;
} }
if (!unit.Container.Insert(toInsert)) if (ev.User != null && !_handsSystem.TryDropIntoContainer(ev.User.Value, ev.ToInsert, unit.Container))
{
return; return;
} else
unit.Container.Insert(toInsert);
AfterInsert(unit, toInsert); AfterInsert(unit, toInsert);
} }
@@ -466,7 +466,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
return state == SharedDisposalUnitComponent.PressureState.Ready && component.RecentlyEjected.Count == 0; return state == SharedDisposalUnitComponent.PressureState.Ready && component.RecentlyEjected.Count == 0;
} }
public bool TryInsert(EntityUid unitId, EntityUid toInsertId, EntityUid userId, DisposalUnitComponent? unit = null) public bool TryInsert(EntityUid unitId, EntityUid toInsertId, EntityUid? userId, DisposalUnitComponent? unit = null)
{ {
if (!Resolve(unitId, ref unit)) if (!Resolve(unitId, ref unit))
return false; return false;
@@ -477,7 +477,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
var delay = userId == toInsertId ? unit.EntryDelay : unit.DraggedEntryDelay; var delay = userId == toInsertId ? unit.EntryDelay : unit.DraggedEntryDelay;
var ev = new DoInsertDisposalUnitEvent(userId, toInsertId, unitId); var ev = new DoInsertDisposalUnitEvent(userId, toInsertId, unitId);
if (delay <= 0) if (delay <= 0 || userId == null)
{ {
DoInsertDisposalUnit(ev); DoInsertDisposalUnit(ev);
return true; return true;
@@ -485,7 +485,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
// Can't check if our target AND disposals moves currently so we'll just check target. // Can't check if our target AND disposals moves currently so we'll just check target.
// if you really want to check if disposals moves then add a predicate. // if you really want to check if disposals moves then add a predicate.
var doAfterArgs = new DoAfterEventArgs(userId, delay, default, toInsertId) var doAfterArgs = new DoAfterEventArgs(userId.Value, delay, default, toInsertId)
{ {
BreakOnDamage = true, BreakOnDamage = true,
BreakOnStun = true, BreakOnStun = true,

View File

@@ -1,4 +1,4 @@
namespace Content.Server.Disposal.Unit.EntitySystems namespace Content.Server.Disposal.Unit.EntitySystems
{ {
public record DoInsertDisposalUnitEvent(EntityUid User, EntityUid ToInsert, EntityUid Unit); public record DoInsertDisposalUnitEvent(EntityUid? User, EntityUid ToInsert, EntityUid Unit);
} }

View File

@@ -12,6 +12,7 @@ using Content.Shared.Interaction.Events;
using Content.Shared.Body.Components; using Content.Shared.Body.Components;
using Content.Shared.Body.Part; using Content.Shared.Body.Part;
using Content.Shared.Popups; using Content.Shared.Popups;
using Content.Server.Hands.Systems;
namespace Content.Server.Kitchen.EntitySystems namespace Content.Server.Kitchen.EntitySystems
{ {
@@ -19,6 +20,8 @@ namespace Content.Server.Kitchen.EntitySystems
internal sealed class MicrowaveSystem : EntitySystem internal sealed class MicrowaveSystem : EntitySystem
{ {
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly HandsSystem _handsSystem = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -114,8 +117,7 @@ namespace Content.Server.Kitchen.EntitySystems
} }
args.Handled = true; args.Handled = true;
_handsSystem.TryDropIntoContainer(args.User, args.Used, component.Storage);
component.Storage.Insert(args.Used);
component.DirtyUi(); component.DirtyUi();
} }