// SPDX-FileCopyrightText: 2025 Ark // SPDX-FileCopyrightText: 2025 sleepyyapril // // SPDX-License-Identifier: AGPL-3.0-or-later using System.Numerics; using Content.Server.Chat.Managers; using Content.Shared.Chat; using Content.Shared.Localizations; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server._Mono.Shipyard; /// /// A system that tells players which direction their newly purchased ship is located /// public sealed class ShipyardDirectionSystem : EntitySystem { [Dependency] private readonly IChatManager _chatManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly TransformSystem _transformSystem = default!; /// /// Sends a message to the player indicating the compass direction of their newly purchased ship /// public void SendShipDirectionMessage(EntityUid player, EntityUid ship) { if (!TryComp(player, out TransformComponent? playerTransform) || !TryComp(ship, out TransformComponent? shipTransform)) return; TryComp(ship, out MetaDataComponent? metaData); // Make sure both entities are on the same map if (playerTransform.MapID != shipTransform.MapID) return; var gridOffset = Angle.Zero; var grid = playerTransform.ParentUid; if (HasComp(grid)) gridOffset = Transform(grid).LocalRotation; // get the world position of ship and player var playerPos = _transformSystem.GetWorldPosition(player); var shipPos = _transformSystem.GetWorldPosition(ship); // get the angle between the two positions, adjusted for the grid rotation so that // we properly preserve north in relation to the grid. var direction = playerPos - shipPos; var directionAngle = direction.ToWorldAngle(); var adjustedDir = (directionAngle - gridOffset).GetDir(); var length = (playerPos - shipPos).LengthSquared(); // Skip if they're at the same position (very unlikely but just in case) if (length < 0.01f) return; // Get compass direction var directionName = ContentLocalizationManager.FormatDirection(adjustedDir).ToLower(); // lua localization var distance = Math.Round(direction.Length(), 1); var shipName = metaData?.EntityName ?? "ship"; // Send message to player var message = Loc.GetString("shipyard-direction-message", ("shipName", shipName), ("direction", directionName), ("distance", distance)); if (_playerManager.TryGetSessionByEntity(player, out var session)) { _chatManager.ChatMessageToOne(ChatChannel.Server, message, message, EntityUid.Invalid, false, session.Channel); } } //lua start ///// ///// Converts a direction vector to a compass direction ///// //private string GetCompassDirection(Vector2 direction) //{ // var angle = new Angle(direction); // var dir = angle.GetDir(); // return dir switch // { // Direction.North => "North", // Direction.NorthEast => "North East", // Direction.East => "East", // Direction.SouthEast => "South East", // Direction.South => "South", // Direction.SouthWest => "South West", // Direction.West => "West", // Direction.NorthWest => "North West", // _ => "Unknown" // }; //} //lua end }