Фиксы двойных шлюзов (#3602)
This commit is contained in:
parent
62ab601908
commit
b90fc2adf1
1 changed files with 34 additions and 14 deletions
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue