diff --git a/Content.Client/CartridgeLoader/CartridgeLoaderBoundUserInterface.cs b/Content.Client/CartridgeLoader/CartridgeLoaderBoundUserInterface.cs index c07f14c6e9..aaa17b7976 100644 --- a/Content.Client/CartridgeLoader/CartridgeLoaderBoundUserInterface.cs +++ b/Content.Client/CartridgeLoader/CartridgeLoaderBoundUserInterface.cs @@ -1,4 +1,5 @@ -using Content.Shared.CartridgeLoader; +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader; using Robust.Client.GameObjects; using Robust.Client.UserInterface; @@ -10,7 +11,7 @@ public abstract class CartridgeLoaderBoundUserInterface : BoundUserInterface [Dependency] private readonly IEntityManager? _entityManager = default!; private EntityUid? _activeProgram; - private CartridgeUI? _activeCartridgeUI; + private UIFragment? _activeCartridgeUI; private Control? _activeUiFragment; protected CartridgeLoaderBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey) @@ -127,9 +128,9 @@ public abstract class CartridgeLoaderBoundUserInterface : BoundUserInterface SendMessage(message); } - private CartridgeUI? RetrieveCartridgeUI(EntityUid? cartridgeUid) + private UIFragment? RetrieveCartridgeUI(EntityUid? cartridgeUid) { - var component = _entityManager?.GetComponentOrNull(cartridgeUid); + var component = _entityManager?.GetComponentOrNull(cartridgeUid); component?.Ui?.Setup(this); return component?.Ui; } diff --git a/Content.Client/CartridgeLoader/CartridgeUiComponent.cs b/Content.Client/CartridgeLoader/CartridgeUiComponent.cs deleted file mode 100644 index c0e62cdaae..0000000000 --- a/Content.Client/CartridgeLoader/CartridgeUiComponent.cs +++ /dev/null @@ -1,14 +0,0 @@ - -namespace Content.Client.CartridgeLoader; - -/// -/// The component used for defining which ui fragment to use for a cartridge -/// -/// -/// -[RegisterComponent] -public sealed class CartridgeUiComponent : Component -{ - [DataField("ui", true)] - public CartridgeUI? Ui = default; -} diff --git a/Content.Client/CartridgeLoader/Cartridges/NetProbeUi.cs b/Content.Client/CartridgeLoader/Cartridges/NetProbeUi.cs index 0dfb9cd2f7..7846b120f9 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NetProbeUi.cs +++ b/Content.Client/CartridgeLoader/Cartridges/NetProbeUi.cs @@ -1,10 +1,11 @@ -using Content.Shared.CartridgeLoader.Cartridges; +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader.Cartridges; using Robust.Client.GameObjects; using Robust.Client.UserInterface; namespace Content.Client.CartridgeLoader.Cartridges; -public sealed class NetProbeUi : CartridgeUI +public sealed class NetProbeUi : UIFragment { private NetProbeUiFragment? _fragment; diff --git a/Content.Client/CartridgeLoader/Cartridges/NotekeeperUi.cs b/Content.Client/CartridgeLoader/Cartridges/NotekeeperUi.cs index df4667ed2a..74ec1032b1 100644 --- a/Content.Client/CartridgeLoader/Cartridges/NotekeeperUi.cs +++ b/Content.Client/CartridgeLoader/Cartridges/NotekeeperUi.cs @@ -1,15 +1,15 @@ -using Content.Shared.CartridgeLoader; +using Content.Client.UserInterface.Fragments; +using Content.Shared.CartridgeLoader; using Content.Shared.CartridgeLoader.Cartridges; using Robust.Client.GameObjects; using Robust.Client.UserInterface; namespace Content.Client.CartridgeLoader.Cartridges; -public sealed class NotekeeperUi : CartridgeUI +public sealed class NotekeeperUi : UIFragment { private NotekeeperUiFragment? _fragment; - public override Control GetUIFragmentRoot() { return _fragment!; diff --git a/Content.Client/Credits/CreditsWindow.xaml.cs b/Content.Client/Credits/CreditsWindow.xaml.cs index 224a1007e1..a2145b479d 100644 --- a/Content.Client/Credits/CreditsWindow.xaml.cs +++ b/Content.Client/Credits/CreditsWindow.xaml.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Linq; -using Content.Client.Links; using Content.Client.Stylesheets; using Content.Shared.CCVar; using Robust.Client.AutoGenerated; @@ -68,7 +67,8 @@ namespace Content.Client.Credits // Do not show "become a patron" button on Steam builds // since Patreon violates Valve's rules about alternative storefronts. - if (!_cfg.GetCVar(CCVars.BrandingSteam)) + var linkPatreon = _cfg.GetCVar(CCVars.InfoLinksPatreon); + if (!_cfg.GetCVar(CCVars.BrandingSteam) && linkPatreon != "") { Button patronButton; patronsContainer.AddChild(patronButton = new Button @@ -78,7 +78,7 @@ namespace Content.Client.Credits }); patronButton.OnPressed += - _ => IoCManager.Resolve().OpenUri(UILinks.Patreon); + _ => IoCManager.Resolve().OpenUri(linkPatreon); } var first = true; @@ -158,8 +158,13 @@ namespace Content.Client.Credits AddSection(Loc.GetString("credits-window-original-remake-team-section-title"), "OriginalRemake.txt"); AddSection(Loc.GetString("credits-window-special-thanks-section-title"), "SpecialThanks.txt", true); + var linkGithub = _cfg.GetCVar(CCVars.InfoLinksGithub); + contributeButton.OnPressed += _ => - IoCManager.Resolve().OpenUri(UILinks.GitHub); + IoCManager.Resolve().OpenUri(linkGithub); + + if (linkGithub == "") + contributeButton.Visible = false; } private sealed class PatronEntry diff --git a/Content.Client/Info/DevInfoBanner.cs b/Content.Client/Info/DevInfoBanner.cs index 9898b60f83..0599b355f5 100644 --- a/Content.Client/Info/DevInfoBanner.cs +++ b/Content.Client/Info/DevInfoBanner.cs @@ -1,8 +1,9 @@ using Content.Client.Changelog; using Content.Client.Credits; -using Content.Client.Links; +using Content.Shared.CCVar; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Shared.Configuration; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Utility; @@ -19,13 +20,18 @@ namespace Content.Client.Info AddChild(buttons); var uriOpener = IoCManager.Resolve(); + var cfg = IoCManager.Resolve(); - var reportButton = new Button {Text = Loc.GetString("server-info-report-button")}; - reportButton.OnPressed += args => uriOpener.OpenUri(UILinks.BugReport); + var bugReport = cfg.GetCVar(CCVars.InfoLinksBugReport); + if (bugReport != "") + { + var reportButton = new Button {Text = Loc.GetString("server-info-report-button")}; + reportButton.OnPressed += args => uriOpener.OpenUri(bugReport); + buttons.AddChild(reportButton); + } var creditsButton = new Button {Text = Loc.GetString("server-info-credits-button")}; creditsButton.OnPressed += args => new CreditsWindow().Open(); - buttons.AddChild(reportButton); buttons.AddChild(creditsButton); } } diff --git a/Content.Client/Info/LinkBanner.cs b/Content.Client/Info/LinkBanner.cs index 6e87dc5c40..569cbc9095 100644 --- a/Content.Client/Info/LinkBanner.cs +++ b/Content.Client/Info/LinkBanner.cs @@ -1,9 +1,10 @@ using Content.Client.Changelog; using Content.Client.Credits; -using Content.Client.Links; using Content.Client.UserInterface.Systems.EscapeMenu; +using Content.Shared.CCVar; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; +using Robust.Shared.Configuration; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Utility; @@ -21,25 +22,31 @@ namespace Content.Client.Info AddChild(buttons); var uriOpener = IoCManager.Resolve(); + var cfg = IoCManager.Resolve(); var rulesButton = new Button() {Text = Loc.GetString("server-info-rules-button")}; rulesButton.OnPressed += args => new RulesAndInfoWindow().Open(); + buttons.AddChild(rulesButton); - var discordButton = new Button {Text = Loc.GetString("server-info-discord-button")}; - discordButton.OnPressed += args => uriOpener.OpenUri(UILinks.Discord); + AddInfoButton("server-info-discord-button", CCVars.InfoLinksDiscord); + AddInfoButton("server-info-website-button", CCVars.InfoLinksWebsite); + AddInfoButton("server-info-wiki-button", CCVars.InfoLinksWiki); + AddInfoButton("server-info-forum-button", CCVars.InfoLinksForum); - var websiteButton = new Button {Text = Loc.GetString("server-info-website-button")}; - websiteButton.OnPressed += args => uriOpener.OpenUri(UILinks.Website); - - var wikiButton = new Button {Text = Loc.GetString("server-info-wiki-button")}; - wikiButton.OnPressed += args => uriOpener.OpenUri(UILinks.Wiki); var changelogButton = new ChangelogButton(); changelogButton.OnPressed += args => UserInterfaceManager.GetUIController().ToggleWindow(); buttons.AddChild(changelogButton); - buttons.AddChild(rulesButton); - buttons.AddChild(discordButton); - buttons.AddChild(websiteButton); - buttons.AddChild(wikiButton); + + void AddInfoButton(string loc, CVarDef cVar) + { + var link = cfg.GetCVar(cVar); + if (link == "") + return; + + var button = new Button { Text = Loc.GetString(loc) }; + button.OnPressed += _ => uriOpener.OpenUri(link); + buttons.AddChild(button); + } } } } diff --git a/Content.Client/Info/ServerInfo.cs b/Content.Client/Info/ServerInfo.cs index f072c50397..23be750626 100644 --- a/Content.Client/Info/ServerInfo.cs +++ b/Content.Client/Info/ServerInfo.cs @@ -1,6 +1,5 @@ using Content.Client.Changelog; using Content.Client.Credits; -using Content.Client.Links; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.IoC; diff --git a/Content.Client/Lathe/UI/LatheMenu.xaml b/Content.Client/Lathe/UI/LatheMenu.xaml index b65cbf2766..fef6d9a171 100644 --- a/Content.Client/Lathe/UI/LatheMenu.xaml +++ b/Content.Client/Lathe/UI/LatheMenu.xaml @@ -65,12 +65,18 @@ VerticalExpand="True"> - - + + (tracker.Owner); + if (sourceTransform.MapID == MapId.Nullspace) + { + // Can happen if the item is outside the client's view. In that case, + // we don't have a sensible transform to draw, so we need to skip it. + continue; + } foreach (var device in _deviceListSystem.GetAllDevices(tracker.Owner, deviceList)) { @@ -57,6 +63,10 @@ public sealed class NetworkConfiguratorLinkOverlay : Overlay } var linkTransform = _entityManager.GetComponent(device); + if (linkTransform.MapID == MapId.Nullspace) + { + continue; + } args.WorldHandle.DrawLine(sourceTransform.WorldPosition, linkTransform.WorldPosition, _colors[tracker.Owner]); } diff --git a/Content.Client/CartridgeLoader/CartridgeUI.cs b/Content.Client/UserInterface/Fragments/UIFragment.cs similarity index 68% rename from Content.Client/CartridgeLoader/CartridgeUI.cs rename to Content.Client/UserInterface/Fragments/UIFragment.cs index 7cbeb499ca..5d09754826 100644 --- a/Content.Client/CartridgeLoader/CartridgeUI.cs +++ b/Content.Client/UserInterface/Fragments/UIFragment.cs @@ -1,10 +1,10 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface; -namespace Content.Client.CartridgeLoader; +namespace Content.Client.UserInterface.Fragments; /// -/// Cartridge ui fragments need to inherit this class. The subclass is then used in yaml to tell the cartridge loader ui to use it as the cartridges ui fragment. +/// Specific ui fragments need to inherit this class. The subclass is then used in yaml to tell a main ui to use it as a ui fragment. /// /// /// This is an example from the yaml definition from the notekeeper ui @@ -14,7 +14,7 @@ namespace Content.Client.CartridgeLoader; /// /// [ImplicitDataDefinitionForInheritors] -public abstract class CartridgeUI +public abstract class UIFragment { public abstract Control GetUIFragmentRoot(); diff --git a/Content.Client/UserInterface/Fragments/UiFragmentComponent.cs b/Content.Client/UserInterface/Fragments/UiFragmentComponent.cs new file mode 100644 index 0000000000..4b7f5fcebd --- /dev/null +++ b/Content.Client/UserInterface/Fragments/UiFragmentComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Client.UserInterface.Fragments; + +/// +/// The component used for defining a ui fragment to attach to an entity +/// +/// +/// This is used primarily for PDA cartridges. +/// +/// +[RegisterComponent] +public sealed class UIFragmentComponent : Component +{ + [DataField("ui", true)] + public UIFragment? Ui; +} diff --git a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs index 663cb3dd0a..1f00af0fe1 100644 --- a/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs +++ b/Content.Client/UserInterface/Systems/Chat/Widgets/ChatBox.xaml.cs @@ -168,6 +168,7 @@ public partial class ChatBox : UIWidget if (args.Function == EngineKeyFunctions.TextReleaseFocus) { ChatInput.Input.ReleaseKeyboardFocus(); + ChatInput.Input.Clear(); args.Handle(); return; } diff --git a/Content.Client/UserInterface/Systems/EscapeMenu/EscapeUIController.cs b/Content.Client/UserInterface/Systems/EscapeMenu/EscapeUIController.cs index 4af5c04216..68cc5392e5 100644 --- a/Content.Client/UserInterface/Systems/EscapeMenu/EscapeUIController.cs +++ b/Content.Client/UserInterface/Systems/EscapeMenu/EscapeUIController.cs @@ -1,13 +1,14 @@ using Content.Client.Gameplay; using Content.Client.Info; -using Content.Client.Links; using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Systems.Info; +using Content.Shared.CCVar; using JetBrains.Annotations; using Robust.Client.Console; using Robust.Client.Input; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Configuration; using Robust.Shared.Input; using Robust.Shared.Input.Binding; using Robust.Shared.Utility; @@ -20,6 +21,7 @@ public sealed class EscapeUIController : UIController, IOnStateEntered { - _uri.OpenUri(UILinks.Wiki); + _uri.OpenUri(_cfg.GetCVar(CCVars.InfoLinksWiki)); }; + // Hide wiki button if we don't have a link for it. + _escapeWindow.WikiButton.Visible = _cfg.GetCVar(CCVars.InfoLinksWiki) != ""; + CommandBinds.Builder .Bind(EngineKeyFunctions.EscapeMenu, InputCmdHandler.FromDelegate(_ => ToggleWindow())) diff --git a/Content.Server/Body/Commands/AddHandCommand.cs b/Content.Server/Body/Commands/AddHandCommand.cs index 11fcedcdb2..c056553207 100644 --- a/Content.Server/Body/Commands/AddHandCommand.cs +++ b/Content.Server/Body/Commands/AddHandCommand.cs @@ -23,11 +23,6 @@ namespace Content.Server.Body.Commands public void Execute(IConsoleShell shell, string argStr, string[] args) { var player = shell.Player as IPlayerSession; - if (args.Length > 1) - { - shell.WriteLine(Help); - return; - } var entityManager = IoCManager.Resolve(); var prototypeManager = IoCManager.Resolve(); diff --git a/Content.Server/Entry/EntryPoint.cs b/Content.Server/Entry/EntryPoint.cs index eab1a5cebf..54426e127f 100644 --- a/Content.Server/Entry/EntryPoint.cs +++ b/Content.Server/Entry/EntryPoint.cs @@ -19,6 +19,7 @@ using Content.Server.Maps; using Content.Server.NodeContainer.NodeGroups; using Content.Server.Players.PlayTimeTracking; using Content.Server.Preferences.Managers; +using Content.Server.ServerInfo; using Content.Server.ServerUpdates; using Content.Server.Voting.Managers; using Content.Shared.Administration; @@ -102,6 +103,7 @@ namespace Content.Server.Entry IoCManager.Resolve().Initialize(); // Corvax-Sponsors IoCManager.Resolve().Initialize(); // Corvax-Queue IoCManager.Resolve().Initialize(); // Corvax-JoinPlaytime + IoCManager.Resolve().Initialize(); _voteManager.Initialize(); _updateManager.Initialize(); diff --git a/Content.Server/Entry/IgnoredComponents.cs b/Content.Server/Entry/IgnoredComponents.cs index c92523e27f..559bc3b8a1 100644 --- a/Content.Server/Entry/IgnoredComponents.cs +++ b/Content.Server/Entry/IgnoredComponents.cs @@ -15,7 +15,7 @@ namespace Content.Server.Entry "ClientEntitySpawner", "HandheldGPS", "CableVisualizer", - "CartridgeUi", + "UIFragment", "PDABorderColor", }; } diff --git a/Content.Server/IoC/ServerContentIoC.cs b/Content.Server/IoC/ServerContentIoC.cs index 29048b7b01..7c84878cf7 100644 --- a/Content.Server/IoC/ServerContentIoC.cs +++ b/Content.Server/IoC/ServerContentIoC.cs @@ -19,6 +19,7 @@ using Content.Server.Objectives; using Content.Server.Objectives.Interfaces; using Content.Server.Players.PlayTimeTracking; using Content.Server.Preferences.Managers; +using Content.Server.ServerInfo; using Content.Server.ServerUpdates; using Content.Server.Voting.Managers; using Content.Shared.Administration; @@ -61,6 +62,7 @@ namespace Content.Server.IoC IoCManager.Register(); // Corvax-Sponsors IoCManager.Register(); // Corvax-Queue IoCManager.Register(); // Corvax-JoinPlaytime + IoCManager.Register(); } } } diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 37dae47d85..7e726aceeb 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -261,6 +261,11 @@ namespace Content.Server.Nutrition.EntitySystems // logging _adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(user):user} is forcing {ToPrettyString(target):target} to drink {ToPrettyString(drink.Owner):drink} {SolutionContainerSystem.ToPrettyString(drinkSolution)}"); } + else + { + // log voluntary drinking + _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is drinking {ToPrettyString(drink.Owner):drink} {SolutionContainerSystem.ToPrettyString(drinkSolution)}"); + } drink.CancelToken = new CancellationTokenSource(); var moveBreak = user != target; @@ -351,6 +356,9 @@ namespace Content.Server.Nutrition.EntitySystems _popupSystem.PopupEntity( Loc.GetString("drink-component-force-feed-success-user", ("target", targetName)), args.User, Filter.Entities(args.User)); + + // log successful forced drinking + _adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.User):target} to drink {ToPrettyString(args.Drink.Owner):drink}"); } else { @@ -359,6 +367,9 @@ namespace Content.Server.Nutrition.EntitySystems Filter.Entities(args.User)); _popupSystem.PopupEntity( Loc.GetString("drink-component-try-use-drink-success-slurp"), args.User, Filter.PvsExcept(args.User)); + + // log successful voluntary drinking + _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} drank {ToPrettyString(args.Drink.Owner):drink}"); } SoundSystem.Play(args.Drink.UseSound.GetSound(), Filter.Pvs(uid), uid, AudioParams.Default.WithVolume(-2f)); diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 8c9033e1c3..c00313432e 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -125,6 +125,11 @@ namespace Content.Server.Nutrition.EntitySystems // logging _adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(user):user} is forcing {ToPrettyString(target):target} to eat {ToPrettyString(food.Owner):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}"); } + else + { + // log voluntary eating + _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is eating {ToPrettyString(food.Owner):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}"); + } var moveBreak = user != target; @@ -193,10 +198,16 @@ namespace Content.Server.Nutrition.EntitySystems _popupSystem.PopupEntity(Loc.GetString("food-system-force-feed-success-user", ("target", targetName)), args.User, Filter.Entities(args.User)); + + // log successful force feed + _adminLogger.Add(LogType.ForceFeed, LogImpact.Medium, $"{ToPrettyString(uid):user} forced {ToPrettyString(args.User):target} to eat {ToPrettyString(args.Food.Owner):food}"); } else { _popupSystem.PopupEntity(Loc.GetString(args.Food.EatMessage, ("food", args.Food.Owner), ("flavors", flavors)), args.User, Filter.Entities(args.User)); + + // log successful voluntary eating + _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(args.User):target} ate {ToPrettyString(args.Food.Owner):food}"); } SoundSystem.Play(args.Food.UseSound.GetSound(), Filter.Pvs(uid), uid, AudioParams.Default.WithVolume(-1f)); diff --git a/Content.Server/ServerInfo/ServerInfoManager.cs b/Content.Server/ServerInfo/ServerInfoManager.cs new file mode 100644 index 0000000000..d2e35e9663 --- /dev/null +++ b/Content.Server/ServerInfo/ServerInfoManager.cs @@ -0,0 +1,44 @@ +using System.Text.Json.Nodes; +using Content.Shared.CCVar; +using Robust.Server.ServerStatus; +using Robust.Shared.Configuration; + +namespace Content.Server.ServerInfo; + +/// +/// Adds additional data like info links to the server info endpoint +/// +public sealed class ServerInfoManager +{ + private static readonly (CVarDef cVar, string icon, string name)[] Vars = + { + // @formatter:off + (CCVars.InfoLinksDiscord, "discord", "info-link-discord"), + (CCVars.InfoLinksForum, "forum", "info-link-forum"), + (CCVars.InfoLinksGithub, "github", "info-link-github"), + (CCVars.InfoLinksWebsite, "web", "info-link-website"), + (CCVars.InfoLinksWiki, "wiki", "info-link-wiki") + // @formatter:on + }; + + [Dependency] private readonly IStatusHost _statusHost = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly ILocalizationManager _loc = default!; + + public void Initialize() + { + _statusHost.OnInfoRequest += OnInfoRequest; + } + + private void OnInfoRequest(JsonNode json) + { + foreach (var (cVar, icon, name) in Vars) + { + var url = _cfg.GetCVar(cVar); + if (string.IsNullOrEmpty(url)) + continue; + + StatusHostHelpers.AddLink(json, _loc.GetString(name), url, icon); + } + } +} diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 496a2f8a38..b340abb566 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1361,6 +1361,52 @@ namespace Content.Shared.CCVar public static readonly CVarDef PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY); + /* + * INFOLINKS + */ + + /// + /// Link to Discord server to show in the launcher. + /// + public static readonly CVarDef InfoLinksDiscord = + CVarDef.Create("infolinks.discord", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to website to show in the launcher. + /// + public static readonly CVarDef InfoLinksForum = + CVarDef.Create("infolinks.forum", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to GitHub page to show in the launcher. + /// + public static readonly CVarDef InfoLinksGithub = + CVarDef.Create("infolinks.github", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to website to show in the launcher. + /// + public static readonly CVarDef InfoLinksWebsite = + CVarDef.Create("infolinks.website", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to wiki to show in the launcher. + /// + public static readonly CVarDef InfoLinksWiki = + CVarDef.Create("infolinks.wiki", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to Patreon. Not shown in the launcher currently. + /// + public static readonly CVarDef InfoLinksPatreon = + CVarDef.Create("infolinks.patreon", "", CVar.SERVER | CVar.REPLICATED); + + /// + /// Link to the bug report form. + /// + public static readonly CVarDef InfoLinksBugReport = + CVarDef.Create("infolinks.bug_report", "", CVar.SERVER | CVar.REPLICATED); + /** * Corvax | Sponsors */ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 06daa18fd3..8d5db7a8d0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,26 +1,4 @@ Entries: -- author: JustinTrotter - changes: - - {message: Increased stripping menu height and reordered inventory, type: Tweak} - id: 2213 - time: '2022-09-01T02:21:02.0000000+00:00' -- author: 20kdc - changes: - - {message: 'Salvages now spawn somewhere near the salvage magnet, rather than directly - in front of it.', type: Tweak} - id: 2214 - time: '2022-09-01T02:25:05.0000000+00:00' -- author: JustinTrotter - changes: - - {message: Bots can now be stuffed into closets, type: Tweak} - id: 2215 - time: '2022-09-01T02:40:16.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Added a poster celebrating the current state of our forthcoming server., - type: Add} - id: 2216 - time: '2022-09-01T02:56:27.0000000+00:00' - author: Peptide90 changes: - {message: Mini Jetpack now fits in your suit storage slot., type: Tweak} @@ -2949,3 +2927,27 @@ Entries: - {message: Kick AFK players, type: Add} id: 2712 time: '2022-12-01T16:38:20.0000000+00:00' +- author: jick + changes: + - {message: Escape key clears chat input, type: Tweak} + id: 2713 + time: '2022-12-03T01:15:59.0000000+00:00' +- author: deltanedas + changes: + - {message: Weld modular mines and grenades to salvage them, type: Tweak} + id: 2714 + time: '2022-12-03T01:20:38.0000000+00:00' +- author: Flareguy + changes: + - {message: Updated all Engineering jumpsuit sprites, type: Tweak} + - {message: Updated the Emergency Firesuit's sprite, type: Tweak} + - {message: Partially resprited most hardhats, type: Tweak} + - {message: Added the orange hardhat to the engidrobe vendor, type: Tweak} + id: 2715 + time: '2022-12-03T01:41:06.0000000+00:00' +- author: GoodWheatley + changes: + - {message: The Syndicate has adjusted the price of several uplink items to encourage + traitors to use more diverse strategies., type: Add} + id: 2716 + time: '2022-12-03T01:48:25.0000000+00:00' diff --git a/Resources/Locale/en-US/connection-messages.ftl b/Resources/Locale/en-US/connection-messages.ftl index 2c66ce358b..b62dec9d68 100644 --- a/Resources/Locale/en-US/connection-messages.ftl +++ b/Resources/Locale/en-US/connection-messages.ftl @@ -22,7 +22,7 @@ ban-banned-1 = You, or another user of this computer or connection, are banned f ban-banned-2 = The ban reason is: "{$reason}" soft-player-cap-full = The server is full! -panic-bunker-account-denied = This server is in Panic mode and you were rejected. Contact the server administrator for help. -panic-bunker-account-denied-reason = This server is in Panic mode and you were rejected. Reason: "{$reason}" -panic-bunker-account-reason-account = Age of account must be more that {$minutes} minutes -panic-bunker-account-reason-overall = Minimum required overall playing time {$hours} hours +panic-bunker-account-denied = This server is in panic bunker mode. New connections are not being accepted at this time. Try again later +panic-bunker-account-denied-reason = This server is in panic bunker mode and you were rejected. Reason: "{$reason}" +panic-bunker-account-reason-account = The account's age must be older than {$minutes} minutes +panic-bunker-account-reason-overall = The account's overall playtime must be greater than {$hours} hours diff --git a/Resources/Locale/en-US/info/server-info.ftl b/Resources/Locale/en-US/info/server-info.ftl index e406a704b5..0686b78c3b 100644 --- a/Resources/Locale/en-US/info/server-info.ftl +++ b/Resources/Locale/en-US/info/server-info.ftl @@ -2,5 +2,6 @@ server-info-rules-button = Rules server-info-discord-button = Discord server-info-website-button = Website server-info-wiki-button = Wiki +server-info-forum-button = Forum server-info-report-button = Report Bugs server-info-credits-button = Credits diff --git a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl index 2dd8d87e1d..241431e6f1 100644 --- a/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl +++ b/Resources/Locale/en-US/lathe/ui/lathe-menu.ftl @@ -4,5 +4,5 @@ lathe-menu-server-list = Server list lathe-menu-sync = Sync lathe-menu-search-designs = Search designs lathe-menu-search-filter = Filter -lathe-menu-search-amount = Amount -lathe-menu-material-display = {$material} {$amount} cm³ \ No newline at end of file +lathe-menu-amount = Amount: +lathe-menu-material-display = {$material} {$amount} cm³ diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-engineering.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-engineering.ftl index c6e0ce5493..e21a111d99 100644 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-engineering.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-engineering.ftl @@ -17,4 +17,7 @@ ent-EngineeringJetpack = { ent-CrateEngineeringJetpack } .desc = { ent-CrateEngineeringJetpack.desc } ent-EngineeringMiniJetpack = { ent-CrateEngineeringMiniJetpack } - .desc = { ent-CrateEngineeringMiniJetpack.desc } \ No newline at end of file + .desc = { ent-CrateEngineeringMiniJetpack.desc } + +ent-AirlockKit = { ent-CrateAirlockKit } + .desc = { ent-CrateAirlockKit.desc } \ No newline at end of file diff --git a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-medical.ftl b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-medical.ftl index f5ca9f6447..9189ef9869 100644 --- a/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-medical.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/cargo/cargo-medical.ftl @@ -3,3 +3,21 @@ ent-MedicalSupplies = { ent-CrateMedicalSupplies } ent-MedicalChemistrySupplies = { ent-CrateChemistrySupplies } .desc = { ent-CrateChemistrySupplies.desc } + +ent-EmergencyBurnKit = { ent-CrateEmergencyBurnKit } + .desc = { ent-CrateEmergencyBurnKit.desc } + +ent-EmergencyToxinKit = { ent-CrateEmergencyToxinKit } + .desc = { ent-CrateEmergencyToxinKit.desc } + +ent-EmergencyO2Kit = { ent-CrateEmergencyO2Kit } + .desc = { ent-CrateEmergencyO2Kit.desc } + +ent-EmergencyBruteKit = { ent-CrateEmergencyBruteKit } + .desc = { ent-CrateEmergencyBruteKit.desc } + +ent-EmergencyAdvancedKit = { ent-CrateEmergencyAdvancedKit } + .desc = { ent-CrateEmergencyAdvancedKit.desc } + +ent-EmergencyRadiationKit = { ent-CrateEmergencyRadiationKit } + .desc = { ent-CrateEmergencyRadiationKit.desc } \ No newline at end of file diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/engineering-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/engineering-crates.ftl index 79bd852472..f0e97ef92f 100644 --- a/Resources/Locale/en-US/prototypes/catalog/fills/crates/engineering-crates.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/engineering-crates.ftl @@ -26,4 +26,7 @@ ent-CrateEngineeringJetpack = Jetpack crate .desc = Two jetpacks for those who don't know how to use fire extinguishers. ent-CrateEngineeringMiniJetpack = Mini jetpack crate - .desc = Two mini jetpacks for those who want an extra challenge. \ No newline at end of file + .desc = Two mini jetpacks for those who want an extra challenge. + +ent-CrateAirlockKit = Airlock kit + .desc = A kit for building 6 airlocks, doesn't include tools. diff --git a/Resources/Locale/en-US/prototypes/catalog/fills/crates/medical-crates.ftl b/Resources/Locale/en-US/prototypes/catalog/fills/crates/medical-crates.ftl index 8f1583e6e1..506e718823 100644 --- a/Resources/Locale/en-US/prototypes/catalog/fills/crates/medical-crates.ftl +++ b/Resources/Locale/en-US/prototypes/catalog/fills/crates/medical-crates.ftl @@ -11,3 +11,21 @@ ent-CrateMedicalSurgery = Surgical supplies crate ent-CrateMedicalScrubs = Medical scrubs crate .desc = Medical clothings. + +ent-CrateEmergencyBurnKit = Emergency burn kit + .desc = Crate filled with four burn treatment kits + +ent-CrateEmergencyToxinKit = Emergency toxin kit + .desc = Crate filled with four toxin treatment kits + +ent-CrateEmergencyO2Kit = Emergency O2 kit + .desc = Crate filled with four O2 treatment kits + +ent-CrateEmergencyBruteKit = Emergency brute kit + .desc = Crate filled with four brute treatment kits + +ent-CrateEmergencyAdvancedKit = Emergency advanced kit + .desc = Crate filled with four advanced treatment kits + +ent-CrateEmergencyRadiationKit = Emergency radiation kit + .desc = Crate filled with four radiation treatment kits \ No newline at end of file diff --git a/Resources/Locale/en-US/server-info/info-links.ftl b/Resources/Locale/en-US/server-info/info-links.ftl new file mode 100644 index 0000000000..0f8f9eb7d9 --- /dev/null +++ b/Resources/Locale/en-US/server-info/info-links.ftl @@ -0,0 +1,7 @@ +### Strings for link buttons shown in the launcher's server description. + +info-link-discord = Discord +info-link-forum = Forum +info-link-github = GitHub +info-link-website = Website +info-link-wiki = Wiki diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index 1eb134fd22..2f9716d7e5 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -486,7 +486,7 @@ entities: components: - type: MetaData - pos: 0.4558292,0.42837813 - parent: null + parent: 943 type: Transform - chunks: 0,-1: @@ -557,7 +557,7 @@ entities: tiles: SwAAA0sAAABLAAADSwAAAksAAAJYAAAAAAAAAAAAAABYAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAEsAAAJLAAABSwAAA0sAAANLAAAAWAAAAAAAAAAAAAAAWAAAAEgAAABYAAAAWAAAAFUAAAJYAAAAWAAAAFcAAABQAAAAUAAAAEsAAANLAAACSwAAAlgAAAAAAAAAAAAAAFgAAABIAAAAWAAAAFgAAABYAAAAVQAAA1gAAABXAAAAUAAAAFAAAAJLAAACSwAAAksAAAJYAAAAVwAAAAAAAABYAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFAAAABQAAAASwAAAUsAAANLAAADWAAAAAAAAAAAAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABLAAAASwAAAUsAAAFLAAADSwAAAFgAAAAAAAAAAAAAAFgAAABIAAAAWAAAAFgAAABVAAADWAAAAFgAAABXAAAASwAAAUsAAAJLAAAASwAAAksAAANYAAAAVwAAAFcAAABYAAAASAAAAFgAAABYAAAAVQAAAlUAAAJYAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABLAAACSwAAAEsAAAFLAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAWAAAAAAAAABXAAAASwAAAksAAAFLAAAASwAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAFgAAAAAAAAAVwAAAEsAAABLAAABSwAAAksAAAJYAAAASAAAAFgAAABIAAAASAAAAEgAAABIAAAAWAAAAFcAAABYAAAAAAAAAFcAAABLAAABSwAAA0sAAANLAAABWAAAAEgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABXAAAAWAAAAAAAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAAWAAAAFgAAABIAAAAWAAAAFgAAABYAAAAVwAAAFgAAAAAAAAAVwAAAEsAAABLAAAAWAAAAAAAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAFcAAABLAAABSwAAAlgAAAAAAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAAAAAAAAAAABXAAAASwAAAUsAAANYAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAVwAAAA== 2,-1: ind: 2,-1 - tiles: WAAAAEsAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABLAAACSwAAAUsAAANLAAACWAAAAEsAAAFLAAAASwAAAUsAAANLAAAAWAAAADYAAAA2AAAANgAAADYAAABYAAAASwAAAksAAAFLAAABWAAAABUAAAFLAAABSwAAAUsAAAJLAAABSwAAAVgAAAA2AAAANgAAADYAAAA2AAAANgAAAEsAAANQAAAASwAAABUAAAEVAAAASwAAAksAAAJLAAACSwAAAEsAAAFYAAAANgAAADYAAAA2AAAANgAAAFgAAABLAAAASwAAAksAAANYAAAAFQAAAFgAAAAVAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASwAAAksAAAJLAAABWAAAAFgAAAAVAAADFQAAABUAAAJYAAAAFQAAAxUAAAIVAAABFQAAAxUAAAMVAAABWAAAAEsAAAJLAAADSwAAAlgAAABLAAAAFQAAAxUAAAAVAAADWAAAABUAAAAVAAADFQAAAxUAAAEVAAABFQAAAhUAAANLAAACUAAAA0sAAANLAAABSwAAAFgAAABYAAAAWAAAAFgAAAAVAAABFQAAABUAAAMVAAADFQAAABUAAABYAAAASwAAA0sAAABLAAADWAAAAEsAAAFYAAAAWAAAAFgAAABYAAAAFQAAAxUAAAIVAAABFQAAABUAAAEVAAACWAAAAFgAAABLAAABWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAFQAAARUAAAAVAAADFQAAARUAAAIVAAADFQAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAAAVAAACFQAAABUAAAAVAAAAFQAAARUAAABYAAAAWAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAD4AAAM+AAACPgAAAz4AAAM+AAAAFQAAAD4AAAEVAAADPgAAAT4AAAI+AAACWAAAAFgAAABYAAAAWAAAAD4AAAI+AAADPgAAAD4AAAA+AAAAPgAAAhUAAAA+AAADFQAAAD4AAAE+AAABPgAAAQ== + tiles: WAAAAEsAAAFYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABLAAACSwAAAUsAAANLAAACWAAAAEsAAAFLAAAASwAAAUsAAANLAAAAWAAAADYAAAA2AAAANgAAADYAAABYAAAASwAAAksAAAFLAAABWAAAABUAAAFLAAABSwAAAUsAAAJLAAABSwAAAVgAAAA2AAAANgAAADYAAAA2AAAANgAAAEsAAANLAAAASwAAABUAAAEVAAAASwAAAksAAAJLAAACSwAAAEsAAAFYAAAANgAAADYAAAA2AAAANgAAAFgAAABLAAAASwAAAksAAANYAAAAFQAAAFgAAAAVAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAASwAAAksAAAJLAAABWAAAAFgAAAAVAAADFQAAABUAAAJYAAAAFQAAAxUAAAIVAAABFQAAAxUAAAMVAAABWAAAAEsAAAJLAAADSwAAAlgAAABLAAAAFQAAAxUAAAAVAAADWAAAABUAAAAVAAADFQAAAxUAAAEVAAABFQAAAhUAAANLAAACSwAAAEsAAANLAAABSwAAAFgAAABYAAAAWAAAAFgAAAAVAAABFQAAABUAAAMVAAADFQAAABUAAABYAAAASwAAA0sAAABLAAADWAAAAEsAAAFYAAAAWAAAAFgAAABYAAAAFQAAAxUAAAIVAAABFQAAABUAAAEVAAACWAAAAFgAAABLAAABWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAFQAAARUAAAAVAAADFQAAARUAAAIVAAADFQAAAlgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAAAVAAACFQAAABUAAAAVAAAAFQAAARUAAABYAAAAWAAAAEgAAABIAAAASAAAAEgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABIAAAASAAAAEgAAABYAAAAWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAABUAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAPgAAAD4AAAM+AAACPgAAAz4AAAM+AAAAFQAAAD4AAAEVAAADPgAAAT4AAAI+AAACWAAAAFgAAABYAAAAWAAAAD4AAAI+AAADPgAAAD4AAAA+AAAAPgAAAhUAAAA+AAADFQAAAD4AAAE+AAABPgAAAQ== 3,-1: ind: 3,-1 tiles: WAAAAFgAAABLAAADAAAAAFcAAABYAAAAWAAAAEEAAABBAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAABUAAAIVAAAAWAAAAAAAAABXAAAAWAAAAFgAAABYAAAAQQAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAAAVAAABFQAAAFgAAAAAAAAAVwAAAFgAAABYAAAAQQAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAFQAAARUAAABYAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABLAAADSwAAAEsAAAJYAAAASAAAAFgAAABYAAAAWAAAAEEAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAASwAAAUsAAAJLAAADWAAAAEgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAEsAAANLAAAASwAAAlgAAABIAAAAWAAAAFgAAABBAAAAQQAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAFgAAABYAAAAQQAAAEEAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABBAAAAWAAAAFcAAABXAAAAVwAAAFcAAABXAAAAVwAAAFgAAABIAAAAWAAAAFgAAABYAAAAWAAAAFgAAABBAAAAWAAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAFcAAABYAAAAWAAAAFgAAABYAAAASAAAAEgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAABXAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAADPgAAAD4AAAE+AAABWAAAAFgAAABYAAAAWAAAAFcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAz4AAAI+AAABPgAAAlgAAABYAAAAWAAAAFgAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== @@ -32352,6 +32352,15 @@ entities: type: Transform - color: '#0335FCFF' type: AtmosPipeColor +- uid: 943 + components: + - type: MetaData + - type: Transform + - index: 4 + type: Map + - type: PhysicsMap + - type: Broadphase + - type: OccluderTree - uid: 944 type: ScalpelLaser components: @@ -34382,9 +34391,9 @@ entities: parent: 60 type: Transform - uid: 1201 - type: TableReinforced + type: TransmitterSubspaceStockPart components: - - pos: -67.5,9.5 + - pos: -63.585518,9.577888 parent: 60 type: Transform - uid: 1202 @@ -52221,6 +52230,9 @@ entities: - pos: 48.5,-39.5 parent: 60 type: Transform + - SecondsUntilStateChange: -37666.23 + state: Opening + type: Door - uid: 3729 type: PoweredSmallLight components: @@ -55988,7 +56000,7 @@ entities: - uid: 4259 type: Paper components: - - desc: '' + - desc: "" type: MetaData - pos: -48.414677,-15.437268 parent: 60 @@ -85547,9 +85559,9 @@ entities: parent: 60 type: Transform - uid: 8563 - type: SuperCapacitorStockPart + type: TableReinforced components: - - pos: -63.726524,9.579115 + - pos: -67.5,9.5 parent: 60 type: Transform - uid: 8564 @@ -113526,9 +113538,9 @@ entities: - canCollide: False type: Physics - uid: 13012 - type: QuadraticCapacitorStockPart + type: DrinkGoldschlagerBottleFull components: - - pos: -63.445274,9.579115 + - pos: 6.371938,-6.0707817 parent: 60 type: Transform - uid: 13013 @@ -113538,15 +113550,15 @@ entities: parent: 60 type: Transform - uid: 13014 - type: SuperMatterBinStockPart + type: MicroManipulatorStockPart components: - - pos: -67.67991,9.5806675 + - pos: -66.58286,9.687263 parent: 60 type: Transform - uid: 13015 - type: SuperMatterBinStockPart + type: ScanningModuleStockPart components: - - pos: -67.08533,9.845674 + - pos: -67.444885,9.609138 parent: 60 type: Transform - uid: 13016 @@ -113556,9 +113568,9 @@ entities: parent: 60 type: Transform - uid: 13017 - type: UltraHighPowerMicroLaserStockPart + type: ScanningModuleStockPart components: - - pos: -66.61741,9.6119175 + - pos: -67.61676,9.687263 parent: 60 type: Transform - uid: 13018 @@ -113670,23 +113682,20 @@ entities: parent: 60 type: Transform - uid: 13036 - type: HighPowerMicroLaserStockPart + type: Poweredlight components: - - pos: -66.27366,9.6119175 + - rot: 3.141592653589793 rad + pos: -51.5,11.5 parent: 60 type: Transform + - powerLoad: 0 + type: ApcPowerReceiver - uid: 13037 type: WallSolid components: - pos: -63.5,42.5 parent: 60 type: Transform -- uid: 13038 - type: FemtoManipulatorStockPart - components: - - pos: -64.40966,9.65759 - parent: 60 - type: Transform - uid: 13039 type: AirlockQuartermasterLocked components: @@ -123899,6 +123908,9 @@ entities: - pos: 31.5,-19.5 parent: 60 type: Transform + - SecondsUntilStateChange: -31179.133 + state: Closing + type: Door - uid: 14524 type: ReinforcedWindow components: @@ -170573,7 +170585,7 @@ entities: - 21492 - 21491 - 18608 - - null + - invalid - 18272 - 18270 - 18368 @@ -171347,7 +171359,7 @@ entities: - 18915 - 18906 - 18910 - - null + - invalid - 18892 - 18893 type: DeviceList @@ -171611,7 +171623,7 @@ entities: - 21568 - 2370 - 2360 - - null + - invalid type: DeviceList - uid: 21568 type: AirSensor @@ -172380,7 +172392,7 @@ entities: - devices: - 21631 - 7146 - - null + - invalid - 6015 - 5990 - 21632 @@ -172603,7 +172615,7 @@ entities: - 21648 - 16559 - 16560 - - null + - invalid type: DeviceList - uid: 21648 type: AirSensor @@ -172634,7 +172646,7 @@ entities: - 21648 - 16559 - 16560 - - null + - invalid - 21655 - 21656 type: DeviceList diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index 31200f6905..614127563f 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -67,3 +67,13 @@ cost: 750 category: Engineering group: market + +- type: cargoProduct + id: AirlockKit + icon: + sprite: Objects/Tools/Toolboxes/toolbox_yellow.rsi + state: icon + product: CrateAirlockKit + cost: 1100 + category: Engineering + group: market diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml index 40b0708f45..ae1e6d2b0b 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml @@ -17,3 +17,63 @@ cost: 750 category: Medical group: market + +- type: cargoProduct + id: EmergencyBurnKit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: burnkit + product: CrateEmergencyBurnKit + cost: 2100 + category: Medical + group: market + +- type: cargoProduct + id: EmergencyToxinKit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: toxinkit + product: CrateEmergencyToxinKit + cost: 700 + category: Medical + group: market + +- type: cargoProduct + id: EmergencyO2Kit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: o2kit + product: CrateEmergencyO2Kit + cost: 1100 + category: Medical + group: market + +- type: cargoProduct + id: EmergencyBruteKit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: brutekit + product: CrateEmergencyBruteKit + cost: 3600 + category: Medical + group: market + +- type: cargoProduct + id: EmergencyAdvancedKit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: advkit + product: CrateEmergencyAdvancedKit + cost: 3700 + category: Medical + group: market + +- type: cargoProduct + id: EmergencyRadiationKit + icon: + sprite: Objects/Specific/Medical/firstaidkits.rsi + state: radkit + product: CrateEmergencyRadiationKit + cost: 2500 + category: Medical + group: market \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml index 303a3ec1f4..a3c6a31ddb 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml @@ -105,3 +105,16 @@ contents: - id: JetpackMini amount: 2 + +- type: entity + id: CrateAirlockKit + parent: CrateGenericSteel + components: + - type: StorageFill + contents: + - id: SheetSteel + amount: 1 + - id: CableApcStack + amount: 1 + - id: DoorElectronics + amount: 6 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/medical.yml b/Resources/Prototypes/Catalog/Fills/Crates/medical.yml index b96b0a5394..faeb7ac7a3 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/medical.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/medical.yml @@ -82,3 +82,57 @@ amount: 1 - id: ClothingMaskSterile amount: 3 + +- type: entity + id: CrateEmergencyBurnKit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitBurnFilled + amount: 4 + +- type: entity + id: CrateEmergencyToxinKit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitToxinFilled + amount: 4 + +- type: entity + id: CrateEmergencyO2Kit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitOxygenFilled + amount: 4 + +- type: entity + id: CrateEmergencyBruteKit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitBruteFilled + amount: 4 + +- type: entity + id: CrateEmergencyAdvancedKit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitAdvancedFilled + amount: 4 + +- type: entity + id: CrateEmergencyRadiationKit + parent: CrateMedical + components: + - type: StorageFill + contents: + - id: MedkitRadiationFilled + amount: 4 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml index 0a73287c60..bb12c8797e 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/engidrobe.yml @@ -11,5 +11,6 @@ ClothingOuterVestHazard: 3 ClothingShoesBootsWork: 3 ClothingHeadHatHardhatYellow: 3 + ClothingHeadHatHardhatOrange: 3 ClothingHeadsetEngineering: 3 ClothingOuterWinterEngi: 2 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index b67cd00ffb..53751f811d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -38,7 +38,7 @@ description: A bolt action service rifle that has seen many wars. Not modern by any standard, hand loaded, and terrible recoil, but it is cheap. productEntity: WeaponSniperMosin cost: - Telecrystal: 4 + Telecrystal: 2 categories: - UplinkWeapons @@ -94,7 +94,7 @@ id: UplinkSyndieMiniBomb productEntity: SyndieMiniBomb cost: - Telecrystal: 7 + Telecrystal: 6 categories: - UplinkExplosives @@ -194,7 +194,7 @@ description: A deep shoulder holster capable of holding many types of ballistics. productEntity: ClothingBeltSyndieHolster cost: - Telecrystal: 2 + Telecrystal: 1 categories: - UplinkUtility @@ -224,7 +224,7 @@ description: A black jetpack. It allows you to fly around in space. Additional fuel not included. productEntity: JetpackBlack cost: - Telecrystal: 5 + Telecrystal: 4 categories: - UplinkUtility @@ -235,7 +235,7 @@ productEntity: ReinforcementTeleporterSyndicate icon: Objects/Devices/communication.rsi/old-radio.png cost: - Telecrystal: 25 + Telecrystal: 20 categories: - UplinkUtility @@ -266,7 +266,7 @@ description: A chemical hypospray disguised as a pen, capable of instantly injecting up to 15u of reagents. Starts empty. productEntity: Hypopen cost: - Telecrystal: 4 + Telecrystal: 6 categories: - UplinkUtility @@ -276,7 +276,7 @@ description: A gas mask that lets you adjust your voice to whoever you can think of. productEntity: ClothingMaskGasVoiceMasker cost: - Telecrystal: 5 + Telecrystal: 4 categories: - UplinkUtility @@ -458,7 +458,7 @@ id: UplinkPowerSink productEntity: PowerSink cost: - Telecrystal: 5 + Telecrystal: 8 categories: - UplinkTools @@ -466,7 +466,7 @@ id: UplinkCarpDehydrated productEntity: DehydratedSpaceCarp cost: - Telecrystal: 3 + Telecrystal: 2 categories: - UplinkTools @@ -477,7 +477,7 @@ description: And who says guns don't grow on trees? productEntity: GatfruitSeeds cost: - Telecrystal: 4 + Telecrystal: 6 categories: - UplinkJob conditions: @@ -490,7 +490,7 @@ description: An unholy book capable of summoning a demonic familiar. productEntity: BibleNecronomicon cost: - Telecrystal: 6 + Telecrystal: 4 categories: - UplinkJob conditions: @@ -511,7 +511,7 @@ productEntity: ClothingBackpackChameleonFill icon: /Textures/Clothing/Uniforms/Jumpsuit/rainbow.rsi/icon.png cost: - Telecrystal: 4 + Telecrystal: 6 categories: - UplinkArmor @@ -539,7 +539,7 @@ id: UplinkClothingOuterVestWeb productEntity: ClothingOuterVestWeb cost: - Telecrystal: 5 + Telecrystal: 4 categories: - UplinkArmor @@ -566,7 +566,7 @@ description: A simple EVA suit that offers no protection other than what's needed to survive in space. productEntity: ClothingBackpackDuffelSyndicateEVABundle cost: - Telecrystal: 4 + Telecrystal: 2 categories: - UplinkArmor @@ -586,7 +586,7 @@ description: Cybersun's legal department pen. Smells vaguely of hard-light and war profiteering. productEntity: CyberPen cost: - Telecrystal: 4 + Telecrystal: 3 categories: - UplinkMisc @@ -624,14 +624,6 @@ categories: - UplinkMisc -#- type: listing -# id: UplinkCostumeCentcom -# productEntity: ClothingBackpackDuffelSyndicateCostumeCentcom -# cost: -# Telecrystal: 4 -# categories: -# - UplinkMisc - # - type: listing # id: UplinkGigacancerScanner # name: Ultragigacancer Health Analyzer diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index aefdf6334a..98229a10dd 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -110,17 +110,23 @@ launchForwardsMultiplier: 6.0 - type: StepTrigger intersectRatio: 0.2 + - type: Physics + bodyType: Dynamic - type: Fixtures fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.35 + id: "slips" + hard: false + layer: + - SlipLayer - shape: !type:PhysShapeCircle radius: 0.35 density: 20 mask: - MobMask - layer: - - MobLayer - - SlipLayer - type: Construction graph: HonkBot node: bot diff --git a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml index 1266002640..7b102b27bc 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml @@ -11,7 +11,7 @@ - type: Icon sprite: Objects/Devices/cartridge.rsi state: cart-y - - type: CartridgeUi + - type: UIFragment ui: !type:NotekeeperUi - type: Cartridge programName: notekeeper-program-name @@ -33,7 +33,7 @@ - type: Icon sprite: Objects/Devices/cartridge.rsi state: cart-y - - type: CartridgeUi + - type: UIFragment ui: !type:NetProbeUi - type: Cartridge programName: net-probe-program-name diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml index f2240fe18e..7f93512811 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml @@ -21,6 +21,15 @@ steps: - material: Cable doAfter: 0.5 + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 5 + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 2 - node: wiredCase entity: ModularGrenade @@ -80,4 +89,4 @@ doAfter: 0.5 completed: - !type:EmptyContainer - container: payload \ No newline at end of file + container: payload diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_mine.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_mine.yml index 637bbf0161..820676d173 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_mine.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_mine.yml @@ -23,6 +23,15 @@ sprite: Objects/Misc/proximity_sensor.rsi state: icon name: proximity sensor + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 5 + - !type:DeleteEntity + steps: + - tool: Welding + doAfter: 2 - node: wiredCase entity: LandMineModular