Content update for ECS physics (#13291)

This commit is contained in:
metalgearsloth
2023-01-15 15:38:59 +11:00
committed by GitHub
parent 46d24bc36b
commit bf79d76666
61 changed files with 431 additions and 379 deletions

View File

@@ -44,6 +44,7 @@ public sealed class ClimbSystem : SharedClimbSystem
[Dependency] private readonly InteractionSystem _interactionSystem = default!;
[Dependency] private readonly StunSystem _stunSystem = default!;
[Dependency] private readonly AudioSystem _audioSystem = default!;
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
private const string ClimbingFixtureName = "climb";
private const int ClimbingCollisionGroup = (int) (CollisionGroup.TableLayer | CollisionGroup.LowImpassable);
@@ -162,7 +163,7 @@ public sealed class ClimbSystem : SharedClimbSystem
if (!Resolve(uid, ref climbing, ref physics, ref fixtures, false))
return;
if (!ReplaceFixtures(climbing, physics, fixtures))
if (!ReplaceFixtures(climbing, fixtures))
return;
climbing.IsClimbing = true;
@@ -202,8 +203,10 @@ public sealed class ClimbSystem : SharedClimbSystem
/// Replaces the current fixtures with non-climbing collidable versions so that climb end can be detected
/// </summary>
/// <returns>Returns whether adding the new fixtures was successful</returns>
private bool ReplaceFixtures(ClimbingComponent climbingComp, PhysicsComponent physicsComp, FixturesComponent fixturesComp)
private bool ReplaceFixtures(ClimbingComponent climbingComp, FixturesComponent fixturesComp)
{
var uid = climbingComp.Owner;
// Swap fixtures
foreach (var (name, fixture) in fixturesComp.Fixtures)
{
@@ -213,13 +216,21 @@ public sealed class ClimbSystem : SharedClimbSystem
continue;
climbingComp.DisabledFixtureMasks.Add(fixture.ID, fixture.CollisionMask & ClimbingCollisionGroup);
fixture.CollisionMask &= ~ClimbingCollisionGroup;
_physics.SetCollisionMask(uid, fixture, fixture.CollisionMask & ~ClimbingCollisionGroup, fixturesComp);
}
if (!_fixtureSystem.TryCreateFixture(physicsComp,
new Fixture(new PhysShapeCircle { Radius = 0.35f }, (int) CollisionGroup.None, ClimbingCollisionGroup, false)
{ID = ClimbingFixtureName}, manager: fixturesComp))
if (!_fixtureSystem.TryCreateFixture(
uid,
new PhysShapeCircle(0.35f),
ClimbingFixtureName,
collisionLayer: (int) CollisionGroup.None,
collisionMask: ClimbingCollisionGroup,
hard: false,
manager: fixturesComp))
{
return false;
}
return true;
}
@@ -250,8 +261,11 @@ public sealed class ClimbSystem : SharedClimbSystem
foreach (var (name, fixtureMask) in climbing.DisabledFixtureMasks)
{
if (!fixtures.Fixtures.TryGetValue(name, out var fixture))
{
continue;
fixture.CollisionMask |= fixtureMask;
}
_physics.SetCollisionMask(uid, fixture, fixture.CollisionMask | fixtureMask, fixtures);
}
climbing.DisabledFixtureMasks.Clear();
@@ -397,16 +411,18 @@ public sealed class ClimbSystem : SharedClimbSystem
// Since there are bodies with different masses:
// mass * 10 seems enough to move entity
// instead of launching cats like rockets against the walls with constant impulse value.
physics.ApplyLinearImpulse((to - from).Normalized * velocity * physics.Mass * 10);
physics.BodyType = BodyType.Dynamic;
_physics.ApplyLinearImpulse(uid, (to - from).Normalized * velocity * physics.Mass * 10, body: physics);
_physics.SetBodyType(uid, BodyType.Dynamic, body: physics);
climbing.OwnerIsTransitioning = true;
_actionBlockerSystem.UpdateCanMove(uid);
// Transition back to KinematicController after BufferTime
climbing.Owner.SpawnTimer((int) (ClimbingComponent.BufferTime * 1000), () =>
{
if (climbing.Deleted) return;
physics.BodyType = BodyType.KinematicController;
if (climbing.Deleted)
return;
_physics.SetBodyType(uid, BodyType.KinematicController);
climbing.OwnerIsTransitioning = false;
_actionBlockerSystem.UpdateCanMove(uid);
});
@@ -418,10 +434,13 @@ public sealed class ClimbSystem : SharedClimbSystem
{
if (!TryComp<PhysicsComponent>(uid, out var physicsComp)
|| !TryComp<FixturesComponent>(uid, out var fixturesComp))
{
continue;
}
foreach (var fixture in fixtures)
{
_fixtureSystem.DestroyFixture(physicsComp, fixture, true, fixturesComp);
_fixtureSystem.DestroyFixture(uid, fixture, body: physicsComp, manager: fixturesComp);
}
}