Fix mech double interactions (#14672)
This commit is contained in:
@@ -195,7 +195,7 @@ public sealed class MechSystem : SharedMechSystem
|
||||
Priority = 1, // Promote to top to make ejecting the ALT-click action
|
||||
Act = () =>
|
||||
{
|
||||
if (args.User == component.PilotSlot.ContainedEntity)
|
||||
if (args.User == uid || args.User == component.PilotSlot.ContainedEntity)
|
||||
{
|
||||
TryEject(uid, component);
|
||||
return;
|
||||
|
||||
@@ -7,6 +7,8 @@ namespace Content.Shared.Interaction.Components;
|
||||
/// Relays an entities interactions to another entity.
|
||||
/// This doesn't raise the same events, but just relays
|
||||
/// the clicks of the mouse.
|
||||
///
|
||||
/// Note that extreme caution should be taken when using this, as this will probably bypass many normal can-interact checks.
|
||||
/// </summary>
|
||||
[RegisterComponent, NetworkedComponent]
|
||||
[Access(typeof(SharedInteractionSystem))]
|
||||
|
||||
@@ -239,8 +239,13 @@ namespace Content.Shared.Interaction
|
||||
bool checkCanUse = true)
|
||||
{
|
||||
if (TryComp<InteractionRelayComponent>(user, out var relay) && relay.RelayEntity is not null)
|
||||
{
|
||||
// TODO this needs to be handled better. This probably bypasses many complex can-interact checks in weird roundabout ways.
|
||||
if (_actionBlockerSystem.CanInteract(user, target))
|
||||
{
|
||||
UserInteraction(relay.RelayEntity.Value, coordinates, target, altInteract, checkCanInteract, checkAccess, checkCanUse);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (target != null && Deleted(target.Value))
|
||||
|
||||
@@ -125,6 +125,7 @@ public abstract class SharedMechSystem : EntitySystem
|
||||
if (pilot == null)
|
||||
return;
|
||||
|
||||
// TODO why is this being blocked?
|
||||
if (!_timing.IsFirstTimePredicted)
|
||||
return;
|
||||
|
||||
@@ -165,6 +166,8 @@ public abstract class SharedMechSystem : EntitySystem
|
||||
|
||||
var rider = EnsureComp<MechPilotComponent>(pilot);
|
||||
var relay = EnsureComp<RelayInputMoverComponent>(pilot);
|
||||
|
||||
// Warning: this bypasses most normal interaction blocking components on the user, like drone laws and the like.
|
||||
var irelay = EnsureComp<InteractionRelayComponent>(pilot);
|
||||
|
||||
_mover.SetRelay(pilot, mech, relay);
|
||||
|
||||
Reference in New Issue
Block a user