using System.Collections.Generic; using Content.Server.Shuttles.Components; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Physics; namespace Content.Server.Shuttles.EntitySystems { [UsedImplicitly] internal sealed class ShuttleSystem : EntitySystem { private const float TileMassMultiplier = 4f; public float ShuttleIdleLinearDamping = 0.1f; public float ShuttleIdleAngularDamping = 0.2f; public float ShuttleMovingLinearDamping = 0.05f; public float ShuttleMovingAngularDamping = 0.05f; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnShuttleAdd); SubscribeLocalEvent(OnShuttleStartup); SubscribeLocalEvent(OnShuttleShutdown); SubscribeLocalEvent(OnGridInit); SubscribeLocalEvent(OnGridFixtureChange); } private void OnShuttleAdd(EntityUid uid, ShuttleComponent component, ComponentAdd args) { // Easier than doing it in the comp and they don't have constructors. for (var i = 0; i < component.LinearThrusters.Length; i++) { component.LinearThrusters[i] = new List(); } } private void OnGridFixtureChange(GridFixtureChangeEvent args) { // Look this is jank but it's a placeholder until we design it. if (args.NewFixtures.Count == 0) return; foreach (var fixture in args.NewFixtures) { fixture.Mass = fixture.Area * TileMassMultiplier; fixture.Restitution = 0.1f; } } private void OnGridInit(GridInitializeEvent ev) { EntityManager.EnsureComponent(ev.EntityUid); } private void OnShuttleStartup(EntityUid uid, ShuttleComponent component, ComponentStartup args) { if (!EntityManager.HasComponent(component.Owner)) { return; } if (!EntityManager.TryGetComponent(component.Owner, out PhysicsComponent? physicsComponent)) { return; } if (component.Enabled) { Enable(physicsComponent); } } public void Toggle(ShuttleComponent component) { if (!EntityManager.TryGetComponent(component.Owner, out PhysicsComponent? physicsComponent)) return; component.Enabled = !component.Enabled; if (component.Enabled) { Enable(physicsComponent); } else { Disable(physicsComponent); } } private void Enable(PhysicsComponent component) { component.BodyType = BodyType.Dynamic; component.BodyStatus = BodyStatus.InAir; //component.FixedRotation = false; TODO WHEN ROTATING SHUTTLES FIXED. component.FixedRotation = false; component.LinearDamping = ShuttleIdleLinearDamping; component.AngularDamping = ShuttleIdleAngularDamping; } private void Disable(PhysicsComponent component) { component.BodyType = BodyType.Static; component.BodyStatus = BodyStatus.OnGround; component.FixedRotation = true; } private void OnShuttleShutdown(EntityUid uid, ShuttleComponent component, ComponentShutdown args) { // None of the below is necessary for any cleanup if we're just deleting. if (EntityManager.GetComponent(uid).EntityLifeStage >= EntityLifeStage.Terminating) return; if (!EntityManager.TryGetComponent(component.Owner, out PhysicsComponent? physicsComponent)) { return; } Disable(physicsComponent); foreach (var fixture in physicsComponent.Fixtures) { fixture.Mass = 0f; } } } }