Fix pulling mispredicts (#22941)

* Fix pulling mispredicts

* Make behaviour consistent

* Good ol terminating entities
This commit is contained in:
Leon Friedrich
2023-12-25 02:33:32 -05:00
committed by GitHub
parent 9eaa4c3a5d
commit 721a445bbd
8 changed files with 42 additions and 77 deletions

View File

@@ -25,6 +25,9 @@ public abstract partial class SharedHandsSystem
var didUnequip = new DidUnequipHandEvent(uid, args.Entity, hand);
RaiseLocalEvent(uid, didUnequip);
if (TryComp(args.Entity, out HandVirtualItemComponent? @virtual))
_virtualSystem.Delete((args.Entity, @virtual), uid);
}
/// <summary>
@@ -100,8 +103,14 @@ public abstract partial class SharedHandsSystem
var entity = hand.HeldEntity!.Value;
DoDrop(uid, hand, doDropInteraction: doDropInteraction, handsComp);
var userXform = Transform(uid);
if (TerminatingOrDeleted(entity))
return true;
var itemXform = Transform(entity);
if (itemXform.MapUid == null)
return true;
var userXform = Transform(uid);
var isInContainer = ContainerSystem.IsEntityInContainer(uid);
if (targetDropLocation == null || isInContainer)

View File

@@ -20,6 +20,7 @@ public abstract partial class SharedHandsSystem
[Dependency] private readonly SharedItemSystem _items = default!;
[Dependency] private readonly SharedStorageSystem _storage = default!;
[Dependency] protected readonly SharedTransformSystem TransformSystem = default!;
[Dependency] private readonly SharedHandVirtualItemSystem _virtualSystem = default!;
protected event Action<Entity<HandsComponent>?>? OnHandSetActive;

View File

@@ -11,6 +11,7 @@ public abstract class SharedHandVirtualItemSystem : EntitySystem
{
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
public override void Initialize()
{
@@ -82,14 +83,16 @@ public abstract class SharedHandVirtualItemSystem : EntitySystem
/// </summary>
public void Delete(Entity<HandVirtualItemComponent> item, EntityUid user)
{
if (_net.IsClient)
return;
var userEv = new VirtualItemDeletedEvent(item.Comp.BlockingEntity, user);
RaiseLocalEvent(user, userEv);
var targEv = new VirtualItemDeletedEvent(item.Comp.BlockingEntity, user);
RaiseLocalEvent(item.Comp.BlockingEntity, targEv);
QueueDel(item);
if (TerminatingOrDeleted(item))
return;
_transform.DetachParentToNull(item, Transform(item));
if (_net.IsServer)
QueueDel(item);
}
}