Фиксы двойных шлюзов (#3602)

This commit is contained in:
ThereDrD 2026-01-07 14:22:23 +03:00 committed by GitHub
parent 62ab601908
commit b90fc2adf1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -57,7 +57,14 @@ public abstract partial class SharedDoorSystem : EntitySystem
/// </summary>
private readonly HashSet<Entity<DoorComponent>> _activeDoors = new();
private readonly HashSet<Entity<PhysicsComponent>> _doorIntersecting = new();
// Sunrise edit start - для двойных шлюзов пришлось поменять на просто EntityUid
// Так как метода с Entity<T> нет
private readonly HashSet<EntityUid> _doorIntersecting = new();
// Sunrise edit end
// Sunrise added start - фикс двойных шлюзов
private EntityQuery<PhysicsComponent> _physicsQuery;
// Sunrise added end
public override void Initialize()
{
@ -80,6 +87,10 @@ public abstract partial class SharedDoorSystem : EntitySystem
SubscribeLocalEvent<DoorComponent, WeldableChangedEvent>(OnWeldChanged);
SubscribeLocalEvent<DoorComponent, GetPryTimeModifierEvent>(OnPryTimeModifier);
SubscribeLocalEvent<DoorComponent, GotEmaggedEvent>(OnEmagged);
// Sunrise added start - фикс двойных шлюзов
_physicsQuery = GetEntityQuery<PhysicsComponent>();
// Sunrise added end
}
protected virtual void OnComponentInit(Entity<DoorComponent> ent, ref ComponentInit args)
@ -589,44 +600,53 @@ public abstract partial class SharedDoorSystem : EntitySystem
var tileRef = _mapSystem.GetTileRef(xform.GridUid.Value, mapGridComp, xform.Coordinates);
_doorIntersecting.Clear();
_entityLookup.GetLocalEntitiesIntersecting(xform.GridUid.Value,
tileRef.GridIndices,
// Sunrise edit start - фикс двойных шлюзов
var aabb = _entityLookup.GetWorldAABB(uid);
_entityLookup.GetEntitiesIntersecting(xform.GridUid.Value,
aabb,
_doorIntersecting,
gridComp: mapGridComp,
flags: (LookupFlags.All & ~LookupFlags.Sensors));
// Sunrise edit end
// TODO SLOTH fix electro's code.
// ReSharper disable once InconsistentNaming
// Sunrise edit start - фикс двойных шлюзов
// Просто методя с Entity<T> нет, поэтому пришлось тут все менять
foreach (var otherPhysics in _doorIntersecting)
{
if (otherPhysics.Comp == physics)
if (!_physicsQuery.TryComp(otherPhysics, out var physicsComp))
continue;
if (!otherPhysics.Comp.CanCollide)
if (physicsComp == physics)
continue;
if (!physicsComp.CanCollide)
continue;
//TODO: Make only shutters ignore these objects upon colliding instead of all airlocks
// Excludes Glasslayer for windows, GlassAirlockLayer for windoors, TableLayer for tables
if (otherPhysics.Comp.CollisionLayer == (int)CollisionGroup.GlassLayer ||
otherPhysics.Comp.CollisionLayer == (int)CollisionGroup.GlassAirlockLayer ||
otherPhysics.Comp.CollisionLayer == (int)CollisionGroup.TableLayer)
if (physicsComp.CollisionLayer == (int)CollisionGroup.GlassLayer ||
physicsComp.CollisionLayer == (int)CollisionGroup.GlassAirlockLayer ||
physicsComp.CollisionLayer == (int)CollisionGroup.TableLayer)
continue;
// Ignore low-passable entities.
if ((otherPhysics.Comp.CollisionMask & (int)CollisionGroup.LowImpassable) == 0)
if ((physicsComp.CollisionMask & (int)CollisionGroup.LowImpassable) == 0)
continue;
//For when doors need to close over conveyor belts
if (otherPhysics.Comp.CollisionLayer == (int)CollisionGroup.ConveyorMask)
if (physicsComp.CollisionLayer == (int)CollisionGroup.ConveyorMask)
continue;
if ((physics.CollisionMask & otherPhysics.Comp.CollisionLayer) == 0 &&
(otherPhysics.Comp.CollisionMask & physics.CollisionLayer) == 0)
if ((physics.CollisionMask & physicsComp.CollisionLayer) == 0 &&
(physicsComp.CollisionMask & physics.CollisionLayer) == 0)
continue;
yield return otherPhysics.Owner;
yield return otherPhysics;
}
// Sunrise edit end
}
private void PreventCollision(EntityUid uid, DoorComponent component, ref PreventCollideEvent args)