The disposals pushing and pulling update (#1875)
* Add collision to disposal unit and pipes Make disposal unit and pipes pullable Implement proper handling of collisions in disposals * Implement IsExiting Move DisposalSystem to shared * Change SharedDisosalUnitComponent to call manager.ContainsEntity directly * Update saltern.yml Co-authored-by: Julian Giebel <j.giebel@netrocks.info>
This commit is contained in:
@@ -4,6 +4,7 @@ using Robust.Shared.GameObjects;
|
|||||||
namespace Content.Client.GameObjects.Components.Disposal
|
namespace Content.Client.GameObjects.Components.Disposal
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
|
[ComponentReference(typeof(SharedDisposalUnitComponent))]
|
||||||
public class DisposalUnitComponent : SharedDisposalUnitComponent
|
public class DisposalUnitComponent : SharedDisposalUnitComponent
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ using Robust.Shared.ViewVariables;
|
|||||||
|
|
||||||
namespace Content.Server.GameObjects.Components.Disposal
|
namespace Content.Server.GameObjects.Components.Disposal
|
||||||
{
|
{
|
||||||
// TODO: Make unanchored pipes pullable
|
|
||||||
public abstract class DisposalTubeComponent : Component, IDisposalTubeComponent, IBreakAct
|
public abstract class DisposalTubeComponent : Component, IDisposalTubeComponent, IBreakAct
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
@@ -182,6 +181,8 @@ namespace Content.Server.GameObjects.Components.Disposal
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
collidable.CanCollide = !collidable.Anchored;
|
||||||
|
|
||||||
if (collidable.Anchored)
|
if (collidable.Anchored)
|
||||||
{
|
{
|
||||||
OnAnchor();
|
OnAnchor();
|
||||||
@@ -220,6 +221,8 @@ namespace Content.Server.GameObjects.Components.Disposal
|
|||||||
var collidable = Owner.EnsureComponent<CollidableComponent>();
|
var collidable = Owner.EnsureComponent<CollidableComponent>();
|
||||||
|
|
||||||
collidable.AnchoredChanged += AnchoredChanged;
|
collidable.AnchoredChanged += AnchoredChanged;
|
||||||
|
|
||||||
|
collidable.CanCollide = !collidable.Anchored;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Startup()
|
protected override void Startup()
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ using Robust.Shared.Interfaces.GameObjects;
|
|||||||
using Robust.Shared.Interfaces.Timing;
|
using Robust.Shared.Interfaces.Timing;
|
||||||
using Robust.Shared.IoC;
|
using Robust.Shared.IoC;
|
||||||
using Robust.Shared.Localization;
|
using Robust.Shared.Localization;
|
||||||
|
using Robust.Shared.Log;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.ViewVariables;
|
using Robust.Shared.ViewVariables;
|
||||||
using Timer = Robust.Shared.Timers.Timer;
|
using Timer = Robust.Shared.Timers.Timer;
|
||||||
@@ -36,6 +37,7 @@ using Timer = Robust.Shared.Timers.Timer;
|
|||||||
namespace Content.Server.GameObjects.Components.Disposal
|
namespace Content.Server.GameObjects.Components.Disposal
|
||||||
{
|
{
|
||||||
[RegisterComponent]
|
[RegisterComponent]
|
||||||
|
[ComponentReference(typeof(SharedDisposalUnitComponent))]
|
||||||
[ComponentReference(typeof(IInteractUsing))]
|
[ComponentReference(typeof(IInteractUsing))]
|
||||||
public class DisposalUnitComponent : SharedDisposalUnitComponent, IInteractHand, IInteractUsing, IDragDropOn
|
public class DisposalUnitComponent : SharedDisposalUnitComponent, IInteractHand, IInteractUsing, IDragDropOn
|
||||||
{
|
{
|
||||||
@@ -429,8 +431,9 @@ namespace Content.Server.GameObjects.Components.Disposal
|
|||||||
: LightState.Ready);
|
: LightState.Ready);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(float frameTime)
|
public override void Update(float frameTime)
|
||||||
{
|
{
|
||||||
|
base.Update(frameTime);
|
||||||
if (!Powered)
|
if (!Powered)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
@@ -512,10 +515,15 @@ namespace Content.Server.GameObjects.Components.Disposal
|
|||||||
{
|
{
|
||||||
base.Startup();
|
base.Startup();
|
||||||
|
|
||||||
Owner.EnsureComponent<AnchorableComponent>();
|
if(!Owner.HasComponent<AnchorableComponent>())
|
||||||
|
{
|
||||||
|
Logger.WarningS("VitalComponentMissing", $"Disposal unit {Owner.Uid} is missing an anchorable component");
|
||||||
|
}
|
||||||
|
|
||||||
var collidable = Owner.EnsureComponent<CollidableComponent>();
|
if (Owner.TryGetComponent(out CollidableComponent? collidable))
|
||||||
collidable.AnchoredChanged += UpdateVisualState;
|
{
|
||||||
|
collidable.AnchoredChanged += UpdateVisualState;
|
||||||
|
}
|
||||||
|
|
||||||
if (Owner.TryGetComponent(out PowerReceiverComponent? receiver))
|
if (Owner.TryGetComponent(out PowerReceiverComponent? receiver))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
using Content.Server.GameObjects.Components.Disposal;
|
|
||||||
using JetBrains.Annotations;
|
|
||||||
using Robust.Shared.GameObjects.Systems;
|
|
||||||
|
|
||||||
namespace Content.Server.GameObjects.EntitySystems
|
|
||||||
{
|
|
||||||
[UsedImplicitly]
|
|
||||||
internal sealed class DisposalUnitSystem : EntitySystem
|
|
||||||
{
|
|
||||||
public override void Update(float frameTime)
|
|
||||||
{
|
|
||||||
foreach (var comp in ComponentManager.EntityQuery<DisposalUnitComponent>())
|
|
||||||
{
|
|
||||||
comp.Update(frameTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +1,25 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Robust.Shared.GameObjects;
|
using Robust.Shared.GameObjects;
|
||||||
|
using Robust.Shared.GameObjects.Components;
|
||||||
using Robust.Shared.GameObjects.Components.UserInterface;
|
using Robust.Shared.GameObjects.Components.UserInterface;
|
||||||
|
using Robust.Shared.Interfaces.GameObjects;
|
||||||
|
using Robust.Shared.Interfaces.GameObjects.Components;
|
||||||
|
using Robust.Shared.IoC;
|
||||||
|
using Robust.Shared.Physics;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
namespace Content.Shared.GameObjects.Components.Disposal
|
namespace Content.Shared.GameObjects.Components.Disposal
|
||||||
{
|
{
|
||||||
public abstract class SharedDisposalUnitComponent : Component
|
public abstract class SharedDisposalUnitComponent : Component, ICollideSpecial
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||||
|
|
||||||
public override string Name => "DisposalUnit";
|
public override string Name => "DisposalUnit";
|
||||||
|
|
||||||
|
private readonly List<IEntity> _intersecting = new List<IEntity>();
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public enum Visuals
|
public enum Visuals
|
||||||
{
|
{
|
||||||
@@ -57,6 +68,46 @@ namespace Content.Shared.GameObjects.Components.Disposal
|
|||||||
Pressurizing
|
Pressurizing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ICollideSpecial.PreventCollide(IPhysBody collided)
|
||||||
|
{
|
||||||
|
if (IsExiting(collided.Entity)) return true;
|
||||||
|
if (!Owner.TryGetComponent(out IContainerManager manager)) return false;
|
||||||
|
|
||||||
|
if (manager.ContainsEntity(collided.Entity))
|
||||||
|
{
|
||||||
|
if (!_intersecting.Contains(collided.Entity))
|
||||||
|
{
|
||||||
|
_intersecting.Add(collided.Entity);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Update(float frameTime)
|
||||||
|
{
|
||||||
|
UpdateIntersecting();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsExiting(IEntity entity)
|
||||||
|
{
|
||||||
|
return _intersecting.Contains(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateIntersecting()
|
||||||
|
{
|
||||||
|
if(_intersecting.Count == 0) return;
|
||||||
|
|
||||||
|
var intersectingEntities = _entityManager.GetEntitiesIntersecting(Owner);
|
||||||
|
for (var i = _intersecting.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (!intersectingEntities.Contains(_intersecting[i]))
|
||||||
|
{
|
||||||
|
_intersecting.RemoveAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Serializable, NetSerializable]
|
[Serializable, NetSerializable]
|
||||||
public class DisposalUnitBoundUserInterfaceState : BoundUserInterfaceState, IEquatable<DisposalUnitBoundUserInterfaceState>
|
public class DisposalUnitBoundUserInterfaceState : BoundUserInterfaceState, IEquatable<DisposalUnitBoundUserInterfaceState>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using Content.Shared.GameObjects.Components.Disposal;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Shared.GameObjects.Systems;
|
||||||
|
|
||||||
|
namespace Content.Shared.GameObjects.EntitySystems
|
||||||
|
{
|
||||||
|
[UsedImplicitly]
|
||||||
|
public sealed class SharedDisposalUnitSystem : EntitySystem
|
||||||
|
{
|
||||||
|
public override void Update(float frameTime)
|
||||||
|
{
|
||||||
|
foreach (var comp in ComponentManager.EntityQuery<SharedDisposalUnitComponent>())
|
||||||
|
{
|
||||||
|
comp.Update(frameTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -8,13 +8,28 @@
|
|||||||
components:
|
components:
|
||||||
- type: Clickable
|
- type: Clickable
|
||||||
- type: InteractionOutline
|
- type: InteractionOutline
|
||||||
- type: Physics
|
- type: Collidable
|
||||||
anchored: true
|
anchored: true
|
||||||
|
shapes:
|
||||||
|
- !type:PhysShapeAabb
|
||||||
|
bounds: "-0.3,-0.3,0.3,0.3"
|
||||||
|
mask:
|
||||||
|
- Impassable
|
||||||
|
- MobImpassable
|
||||||
|
- VaultImpassable
|
||||||
|
- SmallImpassable
|
||||||
|
layer:
|
||||||
|
- Opaque
|
||||||
|
- Impassable
|
||||||
|
- MobImpassable
|
||||||
|
- VaultImpassable
|
||||||
|
- SmallImpassable
|
||||||
- type: SnapGrid
|
- type: SnapGrid
|
||||||
offset: Center
|
offset: Center
|
||||||
- type: Anchorable
|
- type: Anchorable
|
||||||
- type: Breakable
|
- type: Breakable
|
||||||
- type: Rotatable
|
- type: Rotatable
|
||||||
|
- type: Pullable
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: DisposalHolder
|
id: DisposalHolder
|
||||||
@@ -117,22 +132,22 @@
|
|||||||
flushTime: 2
|
flushTime: 2
|
||||||
- type: Clickable
|
- type: Clickable
|
||||||
- type: InteractionOutline
|
- type: InteractionOutline
|
||||||
- type: Physics
|
|
||||||
anchored: true
|
|
||||||
shapes:
|
|
||||||
- !type:PhysShapeAabb
|
|
||||||
bounds: "-0.3,-0.3,0.3,0.3"
|
|
||||||
layer:
|
|
||||||
- Impassable
|
|
||||||
- MobImpassable
|
|
||||||
- type: Collidable
|
- type: Collidable
|
||||||
anchored: true
|
anchored: true
|
||||||
shapes:
|
shapes:
|
||||||
- !type:PhysShapeAabb
|
- !type:PhysShapeAabb
|
||||||
bounds: "-0.3,-0.3,0.3,0.3"
|
bounds: "-0.35,-0.3,0.35,0.3"
|
||||||
layer:
|
mask:
|
||||||
- Impassable
|
- Impassable
|
||||||
- MobImpassable
|
- MobImpassable
|
||||||
|
- VaultImpassable
|
||||||
|
- SmallImpassable
|
||||||
|
layer:
|
||||||
|
- Opaque
|
||||||
|
- Impassable
|
||||||
|
- MobImpassable
|
||||||
|
- VaultImpassable
|
||||||
|
- SmallImpassable
|
||||||
- type: SnapGrid
|
- type: SnapGrid
|
||||||
offset: Center
|
offset: Center
|
||||||
- type: Anchorable
|
- type: Anchorable
|
||||||
@@ -155,6 +170,7 @@
|
|||||||
interfaces:
|
interfaces:
|
||||||
- key: enum.DisposalUnitUiKey.Key
|
- key: enum.DisposalUnitUiKey.Key
|
||||||
type: DisposalUnitBoundUserInterface
|
type: DisposalUnitBoundUserInterface
|
||||||
|
- type: Pullable
|
||||||
|
|
||||||
- type: entity
|
- type: entity
|
||||||
id: DisposalRouter
|
id: DisposalRouter
|
||||||
|
|||||||
Reference in New Issue
Block a user