From af72f2e17cdf4392f5d3c214ec865ffa434f8c18 Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Sat, 12 Oct 2024 22:21:44 -0700 Subject: [PATCH 001/130] Applying Fix from #32764 to staging --- Content.Server/Thief/Systems/ThiefBeaconSystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs index 80471b64279..4c65ba5c449 100644 --- a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs +++ b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Foldable; using Content.Shared.Popups; using Content.Shared.Verbs; +using Content.Shared.Roles; using Robust.Shared.Audio.Systems; namespace Content.Server.Thief.Systems; @@ -18,7 +19,7 @@ public sealed class ThiefBeaconSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly MindSystem _mind = default!; - + [Dependency] private readonly SharedRoleSystem _roles = default!; public override void Initialize() { base.Initialize(); @@ -37,7 +38,7 @@ private void OnGetInteractionVerbs(Entity beacon, ref GetV return; var mind = _mind.GetMind(args.User); - if (!HasComp(mind)) + if (mind == null || !_roles.MindHasRole(mind.Value)) return; var user = args.User; From 30effd5ccd898bd4745e9e30640d08515c978ffa Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:17:01 +0200 Subject: [PATCH 002/130] Fix random test fail in DeleteAllThenGhost (#32753) It's simple. We kill the heisentest --- Content.Shared/Roles/SharedRoleSystem.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index cd3fe141b2b..925f61e7c75 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -478,7 +478,13 @@ public bool MindIsExclusiveAntagonist(EntityUid? mindId) var exclusiveAntag = false; foreach (var role in mind.MindRoles) { - var roleComp = Comp(role); + if (!TryComp(role, out var roleComp)) + { + //If this ever shows up outside of an integration test, then we need to look into this further. + Log.Warning($"Mind Role Entity {role} does not have MindRoleComponent!"); + continue; + } + if (roleComp.Antag || exclusiveAntag) antagonist = true; if (roleComp.ExclusiveAntag) From e5ad32fe9388db4cf970eb7ba650a711a6560b74 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:17:01 +0200 Subject: [PATCH 003/130] Fix random test fail in DeleteAllThenGhost (#32753) It's simple. We kill the heisentest --- Content.Shared/Roles/SharedRoleSystem.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index cd3fe141b2b..925f61e7c75 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -478,7 +478,13 @@ public bool MindIsExclusiveAntagonist(EntityUid? mindId) var exclusiveAntag = false; foreach (var role in mind.MindRoles) { - var roleComp = Comp(role); + if (!TryComp(role, out var roleComp)) + { + //If this ever shows up outside of an integration test, then we need to look into this further. + Log.Warning($"Mind Role Entity {role} does not have MindRoleComponent!"); + continue; + } + if (roleComp.Antag || exclusiveAntag) antagonist = true; if (roleComp.ExclusiveAntag) From 796764d755186195541756b056f16a835c499cca Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 13 Oct 2024 23:00:40 +0200 Subject: [PATCH 004/130] Fix some rounds failing to end due to mind roles (#32792) (#32793) * Fix some rounds failing to end due to mind roles Fixes #32791 This is caused by ShowRoundEndScoreboard running into a bug trying to display antags: some player is showing up as antag with MindIsAntagonist(), but has no antag roles listed in MindGetAllRoleInfo(). This was caused by one of the roles of the player having the Antag boolean set, but having no AntagPrototype set. The responsible mind role appeared to be MindRoleSubvertedSilicon which is missing a set for the SubvertedSilicon antag prototype. I also added resilience to the round-end code to make it so that an exception showing the scoreboard (and sending the Discord message) would not cause the round end logic to completely abort from an exception. I am planning to add an integration test to cover this bug (no prototype in mind roles), but I'll leave that for not-the-immediate-hotfix. * At least one maintainer approved this tiny PR without reading it, not naming names. --- .../GameTicking/GameTicker.RoundFlow.cs | 19 +++++++++++++++++-- .../Prototypes/Roles/MindRoles/mind_roles.yml | 2 ++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 683061d8edc..e544870bd27 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -341,8 +341,23 @@ public void EndRound(string text = "") RunLevel = GameRunLevel.PostRound; - ShowRoundEndScoreboard(text); - SendRoundEndDiscordMessage(); + try + { + ShowRoundEndScoreboard(text); + } + catch (Exception e) + { + Log.Error($"Error while showing round end scoreboard: {e}"); + } + + try + { + SendRoundEndDiscordMessage(); + } + catch (Exception e) + { + Log.Error($"Error while sending round end Discord message: {e}"); + } } public void ShowRoundEndScoreboard(string text = "") diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index eb92fa51ae9..926ce512b41 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -46,6 +46,8 @@ description: components: - type: SubvertedSiliconRole + - type: MindRole + antagPrototype: SubvertedSilicon # Dragon - type: entity From 519a6b24749e284df3e9aaaf8bab5f96d597fe8e Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:41:31 +0200 Subject: [PATCH 005/130] HOTFIX: Fix tech anomaly nexttimer (#32805) (#32807) Fix tech anomaly nexttimer (#32805) Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> --- Content.Server/Anomaly/Effects/TechAnomalySystem.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs index 3e4d101f4fd..9f81c64dbc1 100644 --- a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs @@ -22,11 +22,17 @@ public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnTechMapInit); SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical); SubscribeLocalEvent(OnStabilityChanged); } + private void OnTechMapInit(Entity ent, ref MapInitEvent args) + { + ent.Comp.NextTimer = _timing.CurTime; + } + public override void Update(float frameTime) { base.Update(frameTime); From e04e3a625056df9b335419508a51dfe8d70c85b7 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:17:18 +0200 Subject: [PATCH 006/130] HOTFIX spider clan charges can be armed again (#32866) * fix ninja bomb component check * remove TryGetRole --- Content.Server/Ninja/Systems/SpiderChargeSystem.cs | 10 ++++++---- Content.Shared/Mind/SharedMindSystem.cs | 13 ------------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs index c916d568d5f..6594d7883bc 100644 --- a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs +++ b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs @@ -1,14 +1,12 @@ using Content.Server.Explosion.EntitySystems; -using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; using Content.Server.Objectives.Components; using Content.Server.Popups; using Content.Server.Roles; -using Content.Shared.Interaction; using Content.Shared.Ninja.Components; using Content.Shared.Ninja.Systems; +using Content.Shared.Roles; using Content.Shared.Sticky; -using Robust.Shared.GameObjects; namespace Content.Server.Ninja.Systems; @@ -19,6 +17,7 @@ public sealed class SpiderChargeSystem : SharedSpiderChargeSystem { [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SpaceNinjaSystem _ninja = default!; @@ -41,7 +40,10 @@ private void OnAttemptStick(EntityUid uid, SpiderChargeComponent comp, ref Attem var user = args.User; - if (!_mind.TryGetRole(user, out var _)) + if (!_mind.TryGetMind(args.User, out var mind, out _)) + return; + + if (!_role.MindHasRole(mind)) { _popup.PopupEntity(Loc.GetString("spider-charge-not-ninja"), user, user); args.Cancelled = true; diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index 162bca495ca..bf0b5f650ad 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -483,19 +483,6 @@ public bool TryGetMind( return false; } - /// - /// Gets a role component from a player's mind. - /// - /// Whether a role was found - public bool TryGetRole(EntityUid user, [NotNullWhen(true)] out T? role) where T : IComponent - { - role = default; - if (!TryComp(user, out var mindContainer) || mindContainer.Mind == null) - return false; - - return TryComp(mindContainer.Mind, out role); - } - /// /// Sets the Mind's UserId, Session, and updates the player's PlayerData. This should have no direct effect on the /// entity that any mind is connected to, except as a side effect of the fact that it may change a player's From b137b0caa2adf80e963b77214e9d89be94d68137 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 18 Oct 2024 16:59:50 +0200 Subject: [PATCH 007/130] HOTFIX Plushies no longer delete items when recycled (#32882) Fix: Plushies no longer delete items when recycled (#32838) fix Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> --- .../EntitySystems/SecretStashSystem.cs | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs index 08a69c345f0..af9b768e98b 100644 --- a/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SecretStashSystem.cs @@ -14,6 +14,8 @@ using Content.Shared.IdentityManagement; using Content.Shared.Tools.EntitySystems; using Content.Shared.Whitelist; +using Content.Shared.Materials; +using Robust.Shared.Map; namespace Content.Shared.Storage.EntitySystems; @@ -35,6 +37,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnDestroyed); + SubscribeLocalEvent(OnReclaimed); SubscribeLocalEvent(OnInteractUsing, after: new[] { typeof(ToolOpenableSystem) }); SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent>(OnGetVerb); @@ -47,12 +50,12 @@ private void OnInit(Entity entity, ref ComponentInit args) private void OnDestroyed(Entity entity, ref DestructionEventArgs args) { - var storedInside = _containerSystem.EmptyContainer(entity.Comp.ItemContainer); - if (storedInside != null && storedInside.Count >= 1) - { - var popup = Loc.GetString("comp-secret-stash-on-destroyed-popup", ("stashname", GetStashName(entity))); - _popupSystem.PopupEntity(popup, storedInside[0], PopupType.MediumCaution); - } + DropContentsAndAlert(entity); + } + + private void OnReclaimed(Entity entity, ref GotReclaimedEvent args) + { + DropContentsAndAlert(entity, args.ReclaimerCoordinates); } private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) @@ -211,5 +214,18 @@ private bool HasItemInside(Entity entity) return entity.Comp.ItemContainer.ContainedEntity != null; } + /// + /// Drop the item stored in the stash and alert all nearby players with a popup. + /// + private void DropContentsAndAlert(Entity entity, EntityCoordinates? cords = null) + { + var storedInside = _containerSystem.EmptyContainer(entity.Comp.ItemContainer, true, cords); + if (storedInside != null && storedInside.Count >= 1) + { + var popup = Loc.GetString("comp-secret-stash-on-destroyed-popup", ("stashname", GetStashName(entity))); + _popupSystem.PopupPredicted(popup, storedInside[0], null, PopupType.MediumCaution); + } + } + #endregion } From 928877f0ef7d16120843228ed619242acdc4feab Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 19 Oct 2024 18:05:48 +0200 Subject: [PATCH 008/130] HOTFIX (stable) submodule update (#32900) Update submodule This fixes an important memory leak. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index d1d43f834b8..32bca7cfd41 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit d1d43f834b8845da698ef1898e8191ab159ee367 +Subproject commit 32bca7cfd417edcad9a60c2b1703eba8675f56af From 2b02545f97d06d9ce6f4dba38921ee10dda268b2 Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Wed, 23 Oct 2024 01:34:11 +0300 Subject: [PATCH 009/130] Hotfix server config changes for playercap and Levi bunker (#32925) Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Resources/ConfigPresets/WizardsDen/leviathan.toml | 4 ---- Resources/ConfigPresets/WizardsDen/wizardsDen.toml | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Resources/ConfigPresets/WizardsDen/leviathan.toml b/Resources/ConfigPresets/WizardsDen/leviathan.toml index 7560833f13a..a1a0e5b704d 100644 --- a/Resources/ConfigPresets/WizardsDen/leviathan.toml +++ b/Resources/ConfigPresets/WizardsDen/leviathan.toml @@ -4,10 +4,6 @@ [game] hostname = "[EN] Wizard's Den Leviathan [US East 1]" -panic_bunker.enabled = false -panic_bunker.disable_with_admins = false -panic_bunker.enable_without_admins = false -panic_bunker.custom_reason = "" [hub] tags = "lang:en,region:am_n_e,rp:low" diff --git a/Resources/ConfigPresets/WizardsDen/wizardsDen.toml b/Resources/ConfigPresets/WizardsDen/wizardsDen.toml index 077ff3fe40a..2b059ca40e3 100644 --- a/Resources/ConfigPresets/WizardsDen/wizardsDen.toml +++ b/Resources/ConfigPresets/WizardsDen/wizardsDen.toml @@ -4,12 +4,12 @@ [game] desc = "Official English Space Station 14 servers. Vanilla, roleplay ruleset." lobbyenabled = true -soft_max_players = 80 +soft_max_players = 70 panic_bunker.enabled = true panic_bunker.disable_with_admins = true panic_bunker.enable_without_admins = true panic_bunker.show_reason = true -panic_bunker.custom_reason = "You have not played on a Wizard's Den server long enough to connect to this server. Please play on Wizard's Den Lizard, Leviathan, or Farm Grass Hopper until you have more playtime." +panic_bunker.custom_reason = "You have not played on a Wizard's Den server long enough to connect to this server. Please play on Wizard's Den Lizard or Farm Grass Hopper until you have more playtime." [infolinks] bug_report = "https://github.com/space-wizards/space-station-14/issues/new/choose" From ae1c5572fcda25e159a1c9762e2d71b0d7ec9c2b Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Sat, 12 Oct 2024 22:21:44 -0700 Subject: [PATCH 010/130] Applying Fix from #32764 to staging --- Content.Server/Thief/Systems/ThiefBeaconSystem.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs index de1c3d2e6d1..4c65ba5c449 100644 --- a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs +++ b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs @@ -20,7 +20,6 @@ public sealed class ThiefBeaconSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - public override void Initialize() { base.Initialize(); From 4fbe50ab28be11c89c6d11684e0908d2309f2ce1 Mon Sep 17 00:00:00 2001 From: Thomas <87614336+Aeshus@users.noreply.github.com> Date: Sun, 27 Oct 2024 13:41:29 -0500 Subject: [PATCH 011/130] Fix Bug With Uppercase Radio Keys (#32997) --- Content.Shared/Chat/SharedChatSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Chat/SharedChatSystem.cs b/Content.Shared/Chat/SharedChatSystem.cs index 84b0e2266ec..e5f3d469974 100644 --- a/Content.Shared/Chat/SharedChatSystem.cs +++ b/Content.Shared/Chat/SharedChatSystem.cs @@ -106,7 +106,7 @@ public void GetRadioKeycodePrefix(EntityUid source, if (!(input.StartsWith(RadioChannelPrefix) || input.StartsWith(RadioChannelAltPrefix))) return; - if (!_keyCodes.TryGetValue(input[1], out _)) + if (!_keyCodes.TryGetValue(char.ToLower(input[1]), out _)) return; prefix = input[..2]; From a4717556e196d0e6997ba9a672e1a7237509b7aa Mon Sep 17 00:00:00 2001 From: BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> Date: Sat, 26 Oct 2024 04:16:45 +0200 Subject: [PATCH 012/130] Fix loneop spawnrate by reverting it to not use the shuttle event system. (#32942) Fix loneop spawnrate by reverting it to not use the custom shuttle event system. --- Resources/Prototypes/GameRules/events.yml | 3 ++- Resources/Prototypes/GameRules/unknown_shuttles.yml | 5 ++--- Resources/Prototypes/Shuttles/shuttle_incoming_event.yml | 5 ----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index e5e1192fc68..08218accede 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -35,6 +35,7 @@ - id: RevenantSpawn - id: SleeperAgents - id: ZombieOutbreak + - id: LoneOpsSpawn - type: entity id: BaseStationEvent @@ -451,7 +452,7 @@ duration: 1 - type: RuleGrids - type: LoadMapRule - preloadedGrid: ShuttleStriker + mapPath: /Maps/Shuttles/ShuttleEvent/striker.yml - type: NukeopsRule roundEndBehavior: Nothing - type: AntagSelection diff --git a/Resources/Prototypes/GameRules/unknown_shuttles.yml b/Resources/Prototypes/GameRules/unknown_shuttles.yml index afbd552af3f..f3391333b53 100644 --- a/Resources/Prototypes/GameRules/unknown_shuttles.yml +++ b/Resources/Prototypes/GameRules/unknown_shuttles.yml @@ -20,7 +20,6 @@ - id: UnknownShuttleMeatZone - id: UnknownShuttleMicroshuttle - id: UnknownShuttleSpacebus - - id: UnknownShuttleInstigator - type: entityTable id: UnknownShuttlesFreelanceTable @@ -32,9 +31,9 @@ id: UnknownShuttlesHostileTable table: !type:AllSelector # we need to pass a list of rules, since rules have further restrictions to consider via StationEventComp children: - - id: LoneOpsSpawn + - id: UnknownShuttleInstigator -# Shuttle Game Rules +# Shuttle Game Rules - type: entity abstract: true diff --git a/Resources/Prototypes/Shuttles/shuttle_incoming_event.yml b/Resources/Prototypes/Shuttles/shuttle_incoming_event.yml index a5269a73dae..1703e0c6980 100644 --- a/Resources/Prototypes/Shuttles/shuttle_incoming_event.yml +++ b/Resources/Prototypes/Shuttles/shuttle_incoming_event.yml @@ -1,8 +1,3 @@ -- type: preloadedGrid - id: ShuttleStriker - path: /Maps/Shuttles/ShuttleEvent/striker.yml - copies: 2 - - type: preloadedGrid id: ShuttleCargoLost path: /Maps/Shuttles/ShuttleEvent/lost_cargo.yml From 0468c0f6bb3dbd10e4c7e2c5d1909ed87ca4eb64 Mon Sep 17 00:00:00 2001 From: Stalen <33173619+stalengd@users.noreply.github.com> Date: Mon, 28 Oct 2024 21:00:00 +0300 Subject: [PATCH 013/130] Fix playtime formatting (#32974) --- .../Info/PlaytimeStats/PlaytimeStatsEntry.cs | 3 ++- .../Info/PlaytimeStats/PlaytimeStatsWindow.cs | 3 +-- .../ContentLocalizationManager.cs | 21 +++++++++++++++++++ .../DepartmentTimeRequirement.cs | 3 ++- .../OverallPlaytimeRequirement.cs | 3 ++- .../JobRequirement/RoleTimeRequirement.cs | 3 ++- Resources/Locale/en-US/_lib.ftl | 3 +++ .../Locale/en-US/info/playtime-stats.ftl | 3 +-- .../Locale/en-US/job/role-requirements.ftl | 1 - 9 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Content.Client/Info/PlaytimeStats/PlaytimeStatsEntry.cs b/Content.Client/Info/PlaytimeStats/PlaytimeStatsEntry.cs index 16e8f55a7e2..632ad8de4ac 100644 --- a/Content.Client/Info/PlaytimeStats/PlaytimeStatsEntry.cs +++ b/Content.Client/Info/PlaytimeStats/PlaytimeStatsEntry.cs @@ -1,3 +1,4 @@ +using Content.Shared.Localizations; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; @@ -16,7 +17,7 @@ public PlaytimeStatsEntry(string role, TimeSpan playtime, StyleBox styleBox) RoleLabel.Text = role; Playtime = playtime; // store the TimeSpan value directly - PlaytimeLabel.Text = playtime.ToString(Loc.GetString("ui-playtime-time-format")); // convert to string for display + PlaytimeLabel.Text = ContentLocalizationManager.FormatPlaytime(playtime); // convert to string for display BackgroundColorPanel.PanelOverride = styleBox; } diff --git a/Content.Client/Info/PlaytimeStats/PlaytimeStatsWindow.cs b/Content.Client/Info/PlaytimeStats/PlaytimeStatsWindow.cs index 1a530d950f9..98241b2ccab 100644 --- a/Content.Client/Info/PlaytimeStats/PlaytimeStatsWindow.cs +++ b/Content.Client/Info/PlaytimeStats/PlaytimeStatsWindow.cs @@ -104,8 +104,7 @@ private void PopulatePlaytimeData() { var overallPlaytime = _jobRequirementsManager.FetchOverallPlaytime(); - var formattedPlaytime = overallPlaytime.ToString(Loc.GetString("ui-playtime-time-format")); - OverallPlaytimeLabel.Text = Loc.GetString("ui-playtime-overall", ("time", formattedPlaytime)); + OverallPlaytimeLabel.Text = Loc.GetString("ui-playtime-overall", ("time", overallPlaytime)); var rolePlaytimes = _jobRequirementsManager.FetchPlaytimeByRoles(); diff --git a/Content.Shared/Localizations/ContentLocalizationManager.cs b/Content.Shared/Localizations/ContentLocalizationManager.cs index ad8890ae0fd..e60ca74a37f 100644 --- a/Content.Shared/Localizations/ContentLocalizationManager.cs +++ b/Content.Shared/Localizations/ContentLocalizationManager.cs @@ -36,6 +36,7 @@ public void Initialize() _loc.AddFunction(culture, "LOC", FormatLoc); _loc.AddFunction(culture, "NATURALFIXED", FormatNaturalFixed); _loc.AddFunction(culture, "NATURALPERCENT", FormatNaturalPercent); + _loc.AddFunction(culture, "PLAYTIME", FormatPlaytime); /* @@ -141,6 +142,16 @@ public static string FormatDirection(Direction dir) return Loc.GetString($"zzzz-fmt-direction-{dir.ToString()}"); } + /// + /// Formats playtime as hours and minutes. + /// + public static string FormatPlaytime(TimeSpan time) + { + var hours = (int)time.TotalHours; + var minutes = time.Minutes; + return Loc.GetString($"zzzz-fmt-playtime", ("hours", hours), ("minutes", minutes)); + } + private static ILocValue FormatLoc(LocArgs args) { var id = ((LocValueString) args.Args[0]).Value; @@ -229,5 +240,15 @@ private static ILocValue FormatUnits(LocArgs args) return new LocValueString(res); } + + private static ILocValue FormatPlaytime(LocArgs args) + { + var time = TimeSpan.Zero; + if (args.Args is { Count: > 0 } && args.Args[0].Value is TimeSpan timeArg) + { + time = timeArg; + } + return new LocValueString(FormatPlaytime(time)); + } } } diff --git a/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs b/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs index 78c6bd25177..8c862992103 100644 --- a/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/DepartmentTimeRequirement.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Localizations; using Content.Shared.Preferences; using JetBrains.Annotations; using Robust.Shared.Prototypes; @@ -49,7 +50,7 @@ public override bool Check(IEntityManager entManager, var deptDiffSpan = Time - playtime; var deptDiff = deptDiffSpan.TotalMinutes; - var formattedDeptDiff = deptDiffSpan.ToString(Loc.GetString("role-timer-time-format")); + var formattedDeptDiff = ContentLocalizationManager.FormatPlaytime(deptDiffSpan); var nameDepartment = "role-timer-department-unknown"; if (protoManager.TryIndex(Department, out var departmentIndexed)) diff --git a/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs b/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs index ed985cadfba..67b3938e1a7 100644 --- a/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/OverallPlaytimeRequirement.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Localizations; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Preferences; using JetBrains.Annotations; @@ -27,7 +28,7 @@ public override bool Check(IEntityManager entManager, var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); var overallDiffSpan = Time - overallTime; var overallDiff = overallDiffSpan.TotalMinutes; - var formattedOverallDiff = overallDiffSpan.ToString(Loc.GetString("role-timer-time-format")); + var formattedOverallDiff = ContentLocalizationManager.FormatPlaytime(overallDiffSpan); if (!Inverted) { diff --git a/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs b/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs index 23498ab91ad..e75a18f011d 100644 --- a/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs +++ b/Content.Shared/Roles/JobRequirement/RoleTimeRequirement.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using Content.Shared.Localizations; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Preferences; using Content.Shared.Roles.Jobs; @@ -36,7 +37,7 @@ public override bool Check(IEntityManager entManager, playTimes.TryGetValue(proto, out var roleTime); var roleDiffSpan = Time - roleTime; var roleDiff = roleDiffSpan.TotalMinutes; - var formattedRoleDiff = roleDiffSpan.ToString(Loc.GetString("role-timer-time-format")); + var formattedRoleDiff = ContentLocalizationManager.FormatPlaytime(roleDiffSpan); var departmentColor = Color.Yellow; if (entManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) diff --git a/Resources/Locale/en-US/_lib.ftl b/Resources/Locale/en-US/_lib.ftl index c901d0f461e..5c6f73af66f 100644 --- a/Resources/Locale/en-US/_lib.ftl +++ b/Resources/Locale/en-US/_lib.ftl @@ -31,3 +31,6 @@ zzzz-fmt-power-joules = { TOSTRING($divided, "F1") } { $places -> [4] TJ *[5] ??? } + +# Used internally by the PLAYTIME() function. +zzzz-fmt-playtime = {$hours}H {$minutes}M \ No newline at end of file diff --git a/Resources/Locale/en-US/info/playtime-stats.ftl b/Resources/Locale/en-US/info/playtime-stats.ftl index 85508c1d09c..b4925176a76 100644 --- a/Resources/Locale/en-US/info/playtime-stats.ftl +++ b/Resources/Locale/en-US/info/playtime-stats.ftl @@ -2,9 +2,8 @@ ui-playtime-stats-title = User Playtime Stats ui-playtime-overall-base = Overall Playtime: -ui-playtime-overall = Overall Playtime: {$time} +ui-playtime-overall = Overall Playtime: {PLAYTIME($time)} ui-playtime-first-time = First Time Playing ui-playtime-roles = Playtime per Role -ui-playtime-time-format = %h\H\ %m\M ui-playtime-header-role-type = Role ui-playtime-header-role-time = Time diff --git a/Resources/Locale/en-US/job/role-requirements.ftl b/Resources/Locale/en-US/job/role-requirements.ftl index 79a216fccaf..686fcb93cb1 100644 --- a/Resources/Locale/en-US/job/role-requirements.ftl +++ b/Resources/Locale/en-US/job/role-requirements.ftl @@ -4,7 +4,6 @@ role-timer-overall-insufficient = You require [color=yellow]{$time}[/color] more role-timer-overall-too-high = You require [color=yellow]{$time}[/color] less overall playtime to play this role. (Are you trying to play a trainee role?) role-timer-role-insufficient = You require [color=yellow]{$time}[/color] more playtime with [color={$departmentColor}]{$job}[/color] to play this role. role-timer-role-too-high = You require[color=yellow] {$time}[/color] less playtime with [color={$departmentColor}]{$job}[/color] to play this role. (Are you trying to play a trainee role?) -role-timer-time-format = %h\H\ %m\M role-timer-age-too-old = Your character must be under the age of [color=yellow]{$age}[/color] to play this role. role-timer-age-too-young = Your character must be over the age of [color=yellow]{$age}[/color] to play this role. role-timer-whitelisted-species = Your character must be one of the following species to play this role: From a399c1ec7cdd0f7aa86577d2a813ed04a845edda Mon Sep 17 00:00:00 2001 From: deathride58 Date: Thu, 31 Oct 2024 17:30:58 -0400 Subject: [PATCH 014/130] Fixes tailthump breaking positional audio by making it mono (#33092) --- .../Voice/Reptilian/reptilian_tailthump.ogg | Bin 31956 -> 9215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Audio/Voice/Reptilian/reptilian_tailthump.ogg b/Resources/Audio/Voice/Reptilian/reptilian_tailthump.ogg index e4bf25f7b8d1e743e34826b343f33e41e9298e16..fff0a8728a7d7123dc4d9b89f23603f677396a34 100644 GIT binary patch delta 8227 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 Hm4W{O+Q|*_ literal 31956 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 Date: Thu, 31 Oct 2024 17:21:05 -0700 Subject: [PATCH 015/130] ExaminableDamage now puts its message at the bottom and in color (#32820) * the examineableDamage component now puts its messages at the bottom, and in color * god help us if something is priority -100 :godo: --- Content.Server/Damage/Systems/ExaminableDamageSystem.cs | 2 +- Resources/Locale/en-US/window/window-component.ftl | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Content.Server/Damage/Systems/ExaminableDamageSystem.cs b/Content.Server/Damage/Systems/ExaminableDamageSystem.cs index dd7c4b12e84..c80e19a53d6 100644 --- a/Content.Server/Damage/Systems/ExaminableDamageSystem.cs +++ b/Content.Server/Damage/Systems/ExaminableDamageSystem.cs @@ -39,7 +39,7 @@ private void OnExamine(EntityUid uid, ExaminableDamageComponent component, Exami var level = GetDamageLevel(uid, component); var msg = Loc.GetString(messages[level]); - args.PushMarkup(msg); + args.PushMarkup(msg,-99); } private int GetDamageLevel(EntityUid uid, ExaminableDamageComponent? component = null, diff --git a/Resources/Locale/en-US/window/window-component.ftl b/Resources/Locale/en-US/window/window-component.ftl index 3ecceb8a94e..62e9c46f1be 100644 --- a/Resources/Locale/en-US/window/window-component.ftl +++ b/Resources/Locale/en-US/window/window-component.ftl @@ -2,13 +2,14 @@ # Shown when examining the window. Each entry represents the window's health condition comp-window-damaged-1 = It looks fully intact. -comp-window-damaged-2 = It has a few scratches +comp-window-damaged-2 = It has a few scratches. comp-window-damaged-3 = It has a few small cracks. -comp-window-damaged-4 = It has several big cracks running along its surface. -comp-window-damaged-5 = It has deep cracks across multiple layers. -comp-window-damaged-6 = It's extremely cracked and on the verge of shattering. +comp-window-damaged-4 = [color=yellow]It has several big cracks running along its surface.[/color] +comp-window-damaged-5 = [color=orange]It has deep cracks across multiple layers.[/color] +comp-window-damaged-6 = [color=red]It's extremely cracked and on the verge of shattering.[/color] ### Interaction Messages # Shown when knocking on a window comp-window-knock = *knock knock* + From 835d0b4d4a861c4697c473841c0e00ae7115e4d0 Mon Sep 17 00:00:00 2001 From: Khoa Nguyen Date: Thu, 31 Oct 2024 21:43:11 -0400 Subject: [PATCH 016/130] Fixed trash not being spawned when throwing pies (#33013) * Fixed trash not being spawned when throwing pies * Completely removed trash component flag check prior to the spawn loop --- Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index 2ff94760f6b..b107e47c79d 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -51,12 +51,9 @@ protected override void SplattedCreamPie(EntityUid uid, CreamPieComponent creamP { _puddle.TrySpillAt(uid, solution, out _, false); } - if (foodComp.Trash.Count == 0) + foreach (var trash in foodComp.Trash) { - foreach (var trash in foodComp.Trash) - { - EntityManager.SpawnEntity(trash, Transform(uid).Coordinates); - } + EntityManager.SpawnEntity(trash, Transform(uid).Coordinates); } } ActivatePayload(uid); From 59f1287aa3fa7848d815926d64c15c276f79bc56 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 1 Nov 2024 01:44:18 +0000 Subject: [PATCH 017/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c8301b98078..f5a8a7fb968 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Oxygen and nitrogen canisters now have new sprites when worn. - type: Add - id: 7071 - time: '2024-08-09T10:32:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30809 - author: Plykiya changes: - message: Buckling someone now triggers a short do-after. @@ -3947,3 +3940,10 @@ id: 7570 time: '2024-10-31T21:30:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33092 +- author: reesque + changes: + - message: pie not dropping tin on thrown + type: Fix + id: 7571 + time: '2024-11-01T01:43:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33013 From b3190b89359ffe6e4e1d58e1c1ef69b8d7f70476 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:47:59 +0100 Subject: [PATCH 018/130] Lower in-round votekick requirements (#32953) Initial commit --- Content.Client/Voting/UI/VoteCallMenu.xaml.cs | 2 +- Content.Shared/CCVar/CCVars.cs | 4 ++-- Resources/Locale/en-US/voting/ui/vote-call-menu.ftl | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Client/Voting/UI/VoteCallMenu.xaml.cs b/Content.Client/Voting/UI/VoteCallMenu.xaml.cs index c5746c24d79..c682a937120 100644 --- a/Content.Client/Voting/UI/VoteCallMenu.xaml.cs +++ b/Content.Client/Voting/UI/VoteCallMenu.xaml.cs @@ -62,7 +62,7 @@ public VoteCallMenu() Stylesheet = IoCManager.Resolve().SheetSpace; CloseButton.OnPressed += _ => Close(); - VoteNotTrustedLabel.Text = Loc.GetString("ui-vote-trusted-users-notice", ("timeReq", _cfg.GetCVar(CCVars.VotekickEligibleVoterDeathtime) / 60)); + VoteNotTrustedLabel.Text = Loc.GetString("ui-vote-trusted-users-notice", ("timeReq", _cfg.GetCVar(CCVars.VotekickEligibleVoterDeathtime))); foreach (StandardVoteType voteType in Enum.GetValues()) { diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 339c0f895fc..f333f6536d4 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1469,7 +1469,7 @@ public static readonly CVarDef /// Config for when the votekick should be allowed to be called based on number of eligible voters. /// public static readonly CVarDef VotekickEligibleNumberRequirement = - CVarDef.Create("votekick.eligible_number", 10, CVar.SERVERONLY); + CVarDef.Create("votekick.eligible_number", 5, CVar.SERVERONLY); /// /// Whether a votekick initiator must be a ghost or not. @@ -1493,7 +1493,7 @@ public static readonly CVarDef /// Config for how many seconds a player must have been dead to initiate a votekick / be able to vote on a votekick. /// public static readonly CVarDef VotekickEligibleVoterDeathtime = - CVarDef.Create("votekick.voter_deathtime", 180, CVar.REPLICATED | CVar.SERVER); + CVarDef.Create("votekick.voter_deathtime", 30, CVar.REPLICATED | CVar.SERVER); /// /// The required ratio of eligible voters that must agree for a votekick to go through. diff --git a/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl b/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl index 7ac9c344fde..fbae3598ed6 100644 --- a/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl +++ b/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl @@ -26,7 +26,7 @@ ui-vote-type-not-available = This vote type has been disabled # Vote option only available for specific users. ui-vote-trusted-users-notice = This vote option is only available to whitelisted players. - In addition, you must have been a ghost for { $timeReq } minutes. + In addition, you must have been a ghost for { $timeReq } seconds. # Warning to not abuse a specific vote option. ui-vote-abuse-warning = From 06da4fcc6020c41d8dcac6612724bf5309518501 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:52:55 +0100 Subject: [PATCH 019/130] Allow votekicks to be initiated in the lobby (#32528) Initial commit --- Content.Client/Voting/UI/VoteCallMenu.xaml.cs | 12 +++++ Content.Client/Voting/VotingSystem.cs | 5 -- .../Managers/VoteManager.DefaultVotes.cs | 15 ++++-- Content.Server/Voting/VotingSystem.cs | 47 ++++++++++++------- Content.Shared/CCVar/CCVars.cs | 6 +++ 5 files changed, 58 insertions(+), 27 deletions(-) diff --git a/Content.Client/Voting/UI/VoteCallMenu.xaml.cs b/Content.Client/Voting/UI/VoteCallMenu.xaml.cs index c682a937120..b9dd11f7a78 100644 --- a/Content.Client/Voting/UI/VoteCallMenu.xaml.cs +++ b/Content.Client/Voting/UI/VoteCallMenu.xaml.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Numerics; +using Content.Client.Gameplay; using Content.Client.Stylesheets; using Content.Shared.Administration; using Content.Shared.CCVar; @@ -8,6 +9,7 @@ using JetBrains.Annotations; using Robust.Client.AutoGenerated; using Robust.Client.Console; +using Robust.Client.State; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; @@ -28,6 +30,7 @@ public sealed partial class VoteCallMenu : BaseWindow [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IEntityNetworkManager _entNetManager = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly IStateManager _state = default!; private VotingSystem _votingSystem; @@ -70,6 +73,7 @@ public VoteCallMenu() VoteTypeButton.AddItem(Loc.GetString(option.Name), (int)voteType); } + _state.OnStateChanged += OnStateChanged; VoteTypeButton.OnItemSelected += VoteTypeSelected; CreateButton.OnPressed += CreatePressed; FollowButton.OnPressed += FollowSelected; @@ -101,6 +105,14 @@ protected override void FrameUpdate(FrameEventArgs args) UpdateVoteTimeout(); } + private void OnStateChanged(StateChangedEventArgs obj) + { + if (obj.NewState is not GameplayState) + return; + + Close(); + } + private void CanCallVoteChanged(bool obj) { if (!obj) diff --git a/Content.Client/Voting/VotingSystem.cs b/Content.Client/Voting/VotingSystem.cs index d2049174605..dd74e1ccb18 100644 --- a/Content.Client/Voting/VotingSystem.cs +++ b/Content.Client/Voting/VotingSystem.cs @@ -19,11 +19,6 @@ public override void Initialize() private void OnVotePlayerListResponseEvent(VotePlayerListResponseEvent msg) { - if (!_ghostSystem.IsGhost) - { - return; - } - VotePlayerListResponse?.Invoke(msg); } diff --git a/Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs b/Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs index 736ff48817e..fb99b3cfad8 100644 --- a/Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs +++ b/Content.Server/Voting/Managers/VoteManager.DefaultVotes.cs @@ -32,6 +32,7 @@ public sealed partial class VoteManager private VotingSystem? _votingSystem; private RoleSystem? _roleSystem; + private GameTicker? _gameTicker; private static readonly Dictionary> _voteTypesToEnableCVars = new() { @@ -70,8 +71,8 @@ public void CreateStandardVote(ICommonSession? initiator, StandardVoteType voteT default: throw new ArgumentOutOfRangeException(nameof(voteType), voteType, null); } - var ticker = _entityManager.EntitySysManager.GetEntitySystem(); - ticker.UpdateInfoText(); + _gameTicker = _entityManager.EntitySysManager.GetEntitySystem(); + _gameTicker.UpdateInfoText(); if (timeoutVote) TimeoutStandardVote(voteType); } @@ -346,8 +347,14 @@ private async void CreateVotekickVote(ICommonSession? initiator, string[]? args) return; } + + + var voterEligibility = _cfg.GetCVar(CCVars.VotekickVoterGhostRequirement) ? VoterEligibility.GhostMinimumPlaytime : VoterEligibility.MinimumPlaytime; + if (_cfg.GetCVar(CCVars.VotekickIgnoreGhostReqInLobby) && _gameTicker!.RunLevel == GameRunLevel.PreRoundLobby) + voterEligibility = VoterEligibility.MinimumPlaytime; + var eligibleVoterNumberRequirement = _cfg.GetCVar(CCVars.VotekickEligibleNumberRequirement); - var eligibleVoterNumber = _cfg.GetCVar(CCVars.VotekickVoterGhostRequirement) ? CalculateEligibleVoterNumber(VoterEligibility.GhostMinimumPlaytime) : CalculateEligibleVoterNumber(VoterEligibility.MinimumPlaytime); + var eligibleVoterNumber = CalculateEligibleVoterNumber(voterEligibility); string target = args[0]; string reason = args[1]; @@ -441,7 +448,7 @@ private async void CreateVotekickVote(ICommonSession? initiator, string[]? args) }, Duration = TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.VotekickTimer)), InitiatorTimeout = TimeSpan.FromMinutes(_cfg.GetCVar(CCVars.VotekickTimeout)), - VoterEligibility = _cfg.GetCVar(CCVars.VotekickVoterGhostRequirement) ? VoterEligibility.GhostMinimumPlaytime : VoterEligibility.MinimumPlaytime, + VoterEligibility = voterEligibility, DisplayVotes = false, TargetEntity = targetNetEntity }; diff --git a/Content.Server/Voting/VotingSystem.cs b/Content.Server/Voting/VotingSystem.cs index 25475c2157a..3d3aeb48598 100644 --- a/Content.Server/Voting/VotingSystem.cs +++ b/Content.Server/Voting/VotingSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Administration.Managers; using Content.Server.Database; +using Content.Server.GameTicking; using Content.Server.Ghost; using Content.Server.Roles.Jobs; using Content.Shared.CCVar; @@ -24,6 +25,7 @@ public sealed class VotingSystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly JobSystem _jobs = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; public override void Initialize() { @@ -34,8 +36,7 @@ public override void Initialize() private async void OnVotePlayerListRequestEvent(VotePlayerListRequestEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not { Valid: true } entity - || !await CheckVotekickInitEligibility(args.SenderSession)) + if (!await CheckVotekickInitEligibility(args.SenderSession)) { var deniedResponse = new VotePlayerListResponseEvent(new (NetUserId, NetEntity, string)[0], true); RaiseNetworkEvent(deniedResponse, args.SenderSession.Channel); @@ -46,17 +47,23 @@ private async void OnVotePlayerListRequestEvent(VotePlayerListRequestEvent msg, foreach (var player in _playerManager.Sessions) { - if (player.AttachedEntity is not { Valid: true } attached) - continue; - - if (attached == entity) continue; + if (args.SenderSession == player) continue; if (_adminManager.IsAdmin(player, false)) continue; - var playerName = GetPlayerVoteListName(attached); - var netEntity = GetNetEntity(attached); - - players.Add((player.UserId, netEntity, playerName)); + if (player.AttachedEntity is not { Valid: true } attached) + { + var playerName = player.Name; + var netEntity = NetEntity.Invalid; + players.Add((player.UserId, netEntity, playerName)); + } + else + { + var playerName = GetPlayerVoteListName(attached); + var netEntity = GetNetEntity(attached); + + players.Add((player.UserId, netEntity, playerName)); + } } var response = new VotePlayerListResponseEvent(players.ToArray(), false); @@ -86,15 +93,19 @@ public async Task CheckVotekickInitEligibility(ICommonSession? initiator) if (initiator.AttachedEntity != null && _adminManager.IsAdmin(initiator.AttachedEntity.Value, false)) return true; - if (_cfg.GetCVar(CCVars.VotekickInitiatorGhostRequirement)) + // If cvar enabled, skip the ghost requirement in the preround lobby + if (!_cfg.GetCVar(CCVars.VotekickIgnoreGhostReqInLobby) || (_cfg.GetCVar(CCVars.VotekickIgnoreGhostReqInLobby) && _gameTicker.RunLevel != GameRunLevel.PreRoundLobby)) { - // Must be ghost - if (!TryComp(initiator.AttachedEntity, out GhostComponent? ghostComp)) - return false; - - // Must have been dead for x seconds - if ((int)_gameTiming.RealTime.Subtract(ghostComp.TimeOfDeath).TotalSeconds < _cfg.GetCVar(CCVars.VotekickEligibleVoterDeathtime)) - return false; + if (_cfg.GetCVar(CCVars.VotekickInitiatorGhostRequirement)) + { + // Must be ghost + if (!TryComp(initiator.AttachedEntity, out GhostComponent? ghostComp)) + return false; + + // Must have been dead for x seconds + if ((int)_gameTiming.RealTime.Subtract(ghostComp.TimeOfDeath).TotalSeconds < _cfg.GetCVar(CCVars.VotekickEligibleVoterDeathtime)) + return false; + } } // Must be whitelisted diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index f333f6536d4..d1dc9d9ade1 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1537,6 +1537,12 @@ public static readonly CVarDef public static readonly CVarDef VotekickBanDuration = CVarDef.Create("votekick.ban_duration", 180, CVar.SERVERONLY); + /// + /// Whether the ghost requirement settings for votekicks should be ignored for the lobby. + /// + public static readonly CVarDef VotekickIgnoreGhostReqInLobby = + CVarDef.Create("votekick.ignore_ghost_req_in_lobby", true, CVar.SERVERONLY); + /* * BAN */ From 973aeb1aaa596e0237bed80a701607c5ccdafcf0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 1 Nov 2024 01:54:01 +0000 Subject: [PATCH 020/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f5a8a7fb968..fc04aaad0e0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Buckling someone now triggers a short do-after. - type: Tweak - id: 7072 - time: '2024-08-09T15:43:02.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29621 - author: Ubaser changes: - message: Normal crowbars cannot be placed in pockets, but can now fit in belts. @@ -3947,3 +3940,10 @@ id: 7571 time: '2024-11-01T01:43:11.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33013 +- author: SlamBamActionman + changes: + - message: Votekicks can now be initiated during the pregame lobby. + type: Fix + id: 7572 + time: '2024-11-01T01:52:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32528 From d708a150e16b79312bc156ab35b38f37887b828a Mon Sep 17 00:00:00 2001 From: PopGamer46 Date: Fri, 1 Nov 2024 03:04:08 +0100 Subject: [PATCH 021/130] Fixes bolt lights of previously unpowered bolted doors (#33063) fix --- Content.Server/Doors/Systems/DoorSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Doors/Systems/DoorSystem.cs b/Content.Server/Doors/Systems/DoorSystem.cs index 292f8ec8e97..754818619ac 100644 --- a/Content.Server/Doors/Systems/DoorSystem.cs +++ b/Content.Server/Doors/Systems/DoorSystem.cs @@ -46,8 +46,8 @@ private void OnBoltPowerChanged(Entity ent, ref PowerChangedE SetBoltsDown(ent, true); } - UpdateBoltLightStatus(ent); ent.Comp.Powered = args.Powered; Dirty(ent, ent.Comp); + UpdateBoltLightStatus(ent); } } From 25b3898b287bcfbb3cc44ef62a4e8a3de3c0d1dd Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 1 Nov 2024 02:05:15 +0000 Subject: [PATCH 022/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fc04aaad0e0..47744c0432f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Normal crowbars cannot be placed in pockets, but can now fit in belts. - type: Tweak - - message: Depending on where you obtained the crowbars, they will now have different - colours. - type: Tweak - id: 7073 - time: '2024-08-09T19:29:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/28988 - author: lzk228 changes: - message: Hotplate works again. @@ -3947,3 +3937,10 @@ id: 7572 time: '2024-11-01T01:52:55.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32528 +- author: PopGamer46 + changes: + - message: Fixed bolt lights of recently unpowered bolted doors + type: Fix + id: 7573 + time: '2024-11-01T02:04:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33063 From 6ce80d914d34807683fcf0118a2c86024ade7eef Mon Sep 17 00:00:00 2001 From: RumiTiger <154005209+RumiTiger@users.noreply.github.com> Date: Fri, 1 Nov 2024 05:06:46 +0300 Subject: [PATCH 023/130] Muffins (#29318) * Update meta.json * Add files via upload * Update misc.yml * Update meal_recipes.yml * Update meta.json * Add files via upload * Update plate.yml * Update food_baked_single.yml * Update dinnerware.yml * Update cooking.yml * Update misc.yml * Add files via upload * Delete Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-cherry.png * Add files via upload * Update meta.json * Update misc.yml * Update meal_recipes.yml * Update meta.json * Fix meta.json * Fix meta.json again * Update misc.yml * Update misc.yml * Update misc.yml * Update misc.yml * Update meta.json * Update meta.json * Update misc.yml * Update meal_recipes.yml * Update Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * Update dinnerware.yml * Delete cherry * Add files via upload * Delete banana * Add banana * Delete chocolate * Add chocolate * lathe recipe fix --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Inventories/dinnerware.yml | 1 + .../Random/Food_Drinks/food_baked_single.yml | 2 + .../Objects/Consumable/Food/Baked/misc.yml | 97 ++++++++++++++++-- .../Consumable/Food/Containers/plate.yml | 24 +++++ .../Entities/Structures/Machines/lathe.yml | 1 + .../Recipes/Cooking/meal_recipes.yml | 61 +++++++++++ .../Prototypes/Recipes/Lathes/cooking.yml | 7 ++ .../Consumable/Food/Baked/misc.rsi/meta.json | 9 +- .../Food/Baked/misc.rsi/muffin-banana.png | Bin 0 -> 373 bytes .../Food/Baked/misc.rsi/muffin-berry.png | Bin 611 -> 3389 bytes .../Food/Baked/misc.rsi/muffin-cherry.png | Bin 285 -> 299 bytes .../Food/Baked/misc.rsi/muffin-chocolate.png | Bin 0 -> 425 bytes .../Consumable/Food/plates.rsi/meta.json | 5 +- .../Consumable/Food/plates.rsi/muffin-tin.png | Bin 0 -> 3023 bytes 14 files changed, 198 insertions(+), 9 deletions(-) create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-banana.png create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-chocolate.png create mode 100644 Resources/Textures/Objects/Consumable/Food/plates.rsi/muffin-tin.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml index d7108ab9955..046607f21aa 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml @@ -11,6 +11,7 @@ FoodPlate: 10 FoodPlateSmall: 10 FoodPlateTin: 5 + FoodPlateMuffinTin: 5 FoodKebabSkewer: 5 DrinkGlass: 5 Beaker: 5 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml index 68d9394ea16..fa285676395 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/food_baked_single.yml @@ -46,6 +46,8 @@ - FoodBakedMuffinBerry - FoodBakedMuffinCherry - FoodBakedMuffinBluecherry + - FoodBakedMuffinChocolate + - FoodBakedMuffinBanana - FoodBakedBunHoney - FoodBakedBunHotX - FoodBakedBunMeat diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index 8b455fe872c..b4be6a8dfd1 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -19,44 +19,84 @@ - type: Item size: Tiny -# Muffins/Buns +# Muffins - type: entity name: muffin - parent: FoodBakedBase + parent: FoodInjectableBase id: FoodBakedMuffin description: A delicious and spongy little cake. components: + - type: Food + trash: + - FoodPlateMuffinTin - type: Sprite + sprite: Objects/Consumable/Food/Baked/misc.rsi state: muffin + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 2 + - type: FlavorProfile + flavors: + - sweet + - type: Item + size: Tiny - type: entity name: berry muffin - parent: FoodBakedBase + parent: FoodBakedMuffin id: FoodBakedMuffinBerry description: A delicious and spongy little cake, with berries. components: - type: Sprite state: muffin-berry + - type: SolutionContainerManager + solutions: + food: + maxVol: 12 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 2 + - ReagentId: JuiceBerry + Quantity: 2 - type: Tag tags: - Fruit - type: entity name: cherry muffin - parent: FoodBakedBase + parent: FoodBakedMuffin id: FoodBakedMuffinCherry description: A sweet muffin with cherry bits. components: - type: Sprite state: muffin-cherry + - type: SolutionContainerManager + solutions: + food: + maxVol: 12 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 2 + - ReagentId: JuiceCherry + Quantity: 2 - type: Tag tags: - Fruit - type: entity name: bluecherry muffin - parent: FoodBakedBase + parent: FoodBakedMuffin id: FoodBakedMuffinBluecherry description: Blue cherries inside a delicious muffin. components: @@ -66,6 +106,51 @@ tags: - Fruit +- type: entity + name: chocolate muffin + parent: FoodBakedMuffin + id: FoodBakedMuffinChocolate + description: A delicious and spongy chocolate muffin. + components: + - type: Sprite + state: muffin-chocolate + - type: SolutionContainerManager + solutions: + food: + maxVol: 12 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 2 + - ReagentId: CocoaPowder + Quantity: 2 + +- type: entity + name: banana muffin + parent: FoodBakedMuffin + id: FoodBakedMuffinBanana + description: A delicious and spongy banana muffin. + components: + - type: Sprite + state: muffin-banana + - type: SolutionContainerManager + solutions: + food: + maxVol: 12 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 2 + - ReagentId: JuiceBanana + Quantity: 2 + - type: Tag + tags: + - Fruit + +# Buns + - type: entity name: honey bun #TODO honey parent: FoodBakedBase @@ -685,4 +770,4 @@ - type: DamageOtherOnHit damage: types: - Blunt: 0 # so the damage stats icon doesn't immediately give away the syndie ones \ No newline at end of file + Blunt: 0 # so the damage stats icon doesn't immediately give away the syndie ones diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/plate.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/plate.yml index 63c47df67e7..2e2f2979bc7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/plate.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/plate.yml @@ -178,3 +178,27 @@ materialComposition: Steel: 60 - type: SpaceGarbage + +# Muffin Tin + +- type: entity + name: muffin tin + parent: BaseItem + id: FoodPlateMuffinTin + description: A cheap foil tin for muffins. + components: + - type: Sprite + sprite: Objects/Consumable/Food/plates.rsi + state: muffin-tin + - type: Item + size: Small + shape: + - 0,0,1,0 + storedOffset: 0,-3 + - type: Tag + tags: + - Trash + - type: PhysicalComposition + materialComposition: + Steel: 30 + - type: SpaceGarbage diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index a8e4d0f43e0..b27f2cc1b98 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -163,6 +163,7 @@ - FoodPlateSmallPlastic - FoodBowlBig - FoodPlateTin + - FoodPlateMuffinTin - FoodKebabSkewer - SprayBottle - MopItem diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index fa2b6573915..173cf9e9dbd 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1779,6 +1779,67 @@ FoodOrange: 1 FoodAmbrosiaVulgaris: 1 +# Muffins + +- type: microwaveMealRecipe + id: RecipeMuffin + name: muffin recipe + result: FoodBakedMuffin + time: 15 + solids: + FoodPlateMuffinTin: 1 + FoodDoughSlice: 1 + reagents: + Sugar: 10 + +- type: microwaveMealRecipe + id: RecipeMuffinChocolate + name: chocolate muffin recipe + result: FoodBakedMuffinChocolate + time: 15 + solids: + FoodPlateMuffinTin: 1 + FoodDoughSlice: 1 + FoodSnackChocolateBar: 1 + reagents: + Sugar: 10 + +- type: microwaveMealRecipe + id: RecipeMuffinBerry + name: berry muffin recipe + result: FoodBakedMuffinBerry + time: 15 + solids: + FoodPlateMuffinTin: 1 + FoodDoughSlice: 1 + FoodBerries: 1 + reagents: + Sugar: 10 + +- type: microwaveMealRecipe + id: RecipeMuffinBanana + name: banana muffin recipe + result: FoodBakedMuffinBanana + time: 15 + solids: + FoodPlateMuffinTin: 1 + FoodDoughSlice: 1 + FoodBanana: 1 + reagents: + Sugar: 10 + +- type: microwaveMealRecipe + id: RecipeMuffinCherry + name: cherry muffin recipe + result: FoodBakedMuffinCherry + time: 15 + solids: + FoodPlateMuffinTin: 1 + FoodDoughSlice: 1 + FoodCherry: 3 + reagents: + Sugar: 10 + # NOT ACTUAL FOOD - type: microwaveMealRecipe diff --git a/Resources/Prototypes/Recipes/Lathes/cooking.yml b/Resources/Prototypes/Recipes/Lathes/cooking.yml index 577d8299dab..c28a9370158 100644 --- a/Resources/Prototypes/Recipes/Lathes/cooking.yml +++ b/Resources/Prototypes/Recipes/Lathes/cooking.yml @@ -98,6 +98,13 @@ materials: Steel: 100 +- type: latheRecipe + id: FoodPlateMuffinTin + result: FoodPlateMuffinTin + completetime: 0.4 + materials: + Steel: 50 + - type: latheRecipe id: FoodKebabSkewer result: FoodKebabSkewer diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json index c6c435a5c9f..ea2e3dc6eae 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. Chevrechaud created by Github user deathride58, croissant taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7ffd61b6fa6a6183daa8900f9a490f46f7a81955", + "copyright": "Taken from tgstation and modified by Swept at https://github.com/tgstation/tgstation/commit/40d75cc340c63582fb66ce15bf75a36115f6bdaa. Chevrechaud created by Github user deathride58, croissant taken from tgstation at commit https://github.com/tgstation/tgstation/commit/7ffd61b6fa6a6183daa8900f9a490f46f7a81955. Muffin-chocolate, muffin-banana and muffin-cherry sprites modified from the original muffin sprite by RumiTiger", "size": { "x": 32, "y": 32 @@ -162,7 +162,12 @@ }, { "name": "croissant" + }, + { + "name": "muffin-chocolate" + }, + { + "name": "muffin-banana" } ] } - diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-banana.png b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-banana.png new file mode 100644 index 0000000000000000000000000000000000000000..51ab05eea1ed98117c1a6c92d1f188e163af63cd GIT binary patch literal 373 zcmV-*0gC>KP)Px$FG)l}R9J=Wl&@06Fc6177(`7gIgxW9;0dt2055PS&hii^c?cYX!D4uTvuA3H z0M`hRiD+FAX?nS#%xnt`f_yWb{MpU!FWV%LNF);for5Whni7ZceFI=&b~P>5s73A# z*AHxDFwhz>8fMFJF%PAVO^Ks`{>%66SpkKDavh2MDFIE1%TzRB2AsM%HHXaz5#kE; zNkVcP&4I6q-F2lLNt`kRsDY%Bu(q>V1KJ`+B;Z}calEZgKpVyujM=qj=ofuQKvfBx zEa+OEI3T_<;b6_9N`#Gu9owz~%R6~oQ3U|BhQ$gV?!Wd~tl;TU8qqWA(RjJ_RX90= z*XPeI!0GibJwyO?4cqQKocqKohs&F3u@Z?y;?Ma26SH9r T#ZNbK00000NkvXXu0mjfI!B%? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-berry.png b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-berry.png index 9e0165e8121f4ef42b231cfa6169f6b531d76893..161da9acb430d928b6ef97426bd06b288562ea4f 100644 GIT binary patch delta 3387 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 R5pVzi002ovPDHLkV1h)-a*F@} delta 587 zcmV-R0<`_T8sh|zBYy%aNklQ`QPz0GcAPjp9#>7DbXR`3S3N;*qpt1CB0`oc8l&%4Tajj8D}8*tpVSAW@+` z;76E(Vntzetc|F@lZaw1t$`DLZwOT*Oe9+veHCK1=zrt%Awd*@FzXa6UT#mc@xxH4 zv@RzcEIT&f_{)q8#iUtLd6|y#y`Ui_9PFKBU9iN=oXW&Zl#puB(Ng35&7@;pM;8Fd zW;GJKBjj><)+hp_s#2Zvk}@?Uu->1ie_x2#X$B!2;OQb$4nuFf3k0002xNklE9XC4n8J3lmf)0-V)&0Vi-yS9u&kk6z|)AVny4JeAD{5y-7O$Br^Zj3!d<_g+W z4IC`v*4R)XOW#2I)&Of~Ju$wE6E};10=lhd!W75@M0i)A8Go6(et56W6f2(~DX)E~ zJ%|1ch^^-qAPHR&trcVYhpO_CfTts5jF6iP-d{!@*2eO=??ArdIUuiB1)#rO2HYlM zGT`o;&=Ax#uBHk*;4xqUj^AoT02NT0apKt0tcMcSzjNqnU~djifm38IMNyQW^8(~K WH~&GnHNF4<00{s|MNUMnLSTYjcX%}b delta 257 zcmV+c0sj800-XYoB!A>dL_t(|oMT`Z1*2dTjDk@x3I-T3lA~#NyV-wqG1tmdWSK>h zCYZ(g&L$Xg7x$ha%OON7-ra8YADhM4972jCm`Jt!V$K5JiJ(ox_ljsnD zfoE@jFh~h=z%7M|kqgKwJQkMdVWe_WeLf0C!6+C7g9ZQqWqwXX&J1V_00000NkvXX Hu0mjfYaVJ* diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-chocolate.png b/Resources/Textures/Objects/Consumable/Food/Baked/misc.rsi/muffin-chocolate.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca1a22cb0651c2a615a77172ea78ea4f54c2b67 GIT binary patch literal 425 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 Rw=)0$002ovPDHLkV1idoz03dr literal 0 HcmV?d00001 From b1a8eee52fe34afcbf866d093a1465615ac9e24e Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 1 Nov 2024 02:07:53 +0000 Subject: [PATCH 024/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 47744c0432f..93619da0016 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Hotplate works again. - type: Fix - id: 7074 - time: '2024-08-10T01:10:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30830 - author: EmoGarbage404 changes: - message: Maintenance closets have more variety in what they can contain. @@ -3944,3 +3937,15 @@ id: 7573 time: '2024-11-01T02:04:09.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33063 +- author: RumiTiger + changes: + - message: A chocolate and banana muffin has been added to the game. The berry and + cherry muffins have also been resprited! + type: Add + - message: Now you can make a regular, chocolate, banana, and berry muffin! + type: Tweak + - message: Muffin tins have been added to the game. They are needed for making muffins! + type: Add + id: 7574 + time: '2024-11-01T02:06:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/29318 From e17d152838a4c34625c52ca51b8a343be5f22b36 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Fri, 1 Nov 2024 03:32:28 +0100 Subject: [PATCH 025/130] Borgs can no longer see mindshield + AI can no longer toggle off seeing job icons (#33069) * :( * Removed the sprite + updated RSI --- Resources/Prototypes/Actions/station_ai.yml | 19 ++---------------- .../Mobs/Cyborgs/base_borg_chassis.yml | 1 - .../Entities/Mobs/Player/admin_ghost.yml | 6 +++--- .../Entities/Mobs/Player/silicon.yml | 2 +- .../Actions/actions_ai.rsi/job_view.png | Bin 508 -> 0 bytes .../Actions/actions_ai.rsi/meta.json | 3 --- 6 files changed, 6 insertions(+), 25 deletions(-) delete mode 100644 Resources/Textures/Interface/Actions/actions_ai.rsi/job_view.png diff --git a/Resources/Prototypes/Actions/station_ai.yml b/Resources/Prototypes/Actions/station_ai.yml index 58513d7db16..dc706038100 100644 --- a/Resources/Prototypes/Actions/station_ai.yml +++ b/Resources/Prototypes/Actions/station_ai.yml @@ -5,35 +5,20 @@ description: Sends your eye back to the core. components: - type: InstantAction - priority: -10 + priority: -9 itemIconStyle: BigAction icon: sprite: Interface/Actions/actions_ai.rsi state: ai_core event: !type:JumpToCoreEvent -- type: entity - id: ActionShowJobIcons - name: Show job icons - description: Shows job icons for crew members. - components: - - type: InstantAction - priority: -5 - itemIconStyle: BigAction - icon: - sprite: Interface/Actions/actions_ai.rsi - state: job_view - event: !type:ActionComponentChangeEvent - components: - - type: ShowJobIcons - - type: entity id: ActionSurvCameraLights name: Toggle camera lights description: Enable surveillance camera lights near wherever you're viewing. components: - type: InstantAction - priority: -6 + priority: -5 itemIconStyle: BigAction icon: sprite: Interface/Actions/actions_ai.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index c65db8fe19f..0db92ac941d 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -285,7 +285,6 @@ - type: AccessReader access: [["Command"], ["Research"]] - type: ShowJobIcons - - type: ShowMindShieldIcons - type: entity id: BaseBorgChassisSyndicate diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 1c3862e99a3..0a40e64fd77 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -127,7 +127,7 @@ icon: { sprite: Interface/Actions/actions_ai.rsi, state: mass_scanner } iconOn: Interface/Actions/actions_ai.rsi/mass_scanner.png keywords: [ "AI", "console", "interface" ] - priority: -7 + priority: -6 event: !type:ToggleIntrinsicUIEvent { key: enum.RadarConsoleUiKey.Key } - type: entity @@ -151,7 +151,7 @@ icon: { sprite: Interface/Actions/actions_ai.rsi, state: crew_monitor } iconOn: Interface/Actions/actions_ai.rsi/crew_monitor.png keywords: [ "AI", "console", "interface" ] - priority: -9 + priority: -8 event: !type:ToggleIntrinsicUIEvent { key: enum.CrewMonitoringUIKey.Key } - type: entity @@ -163,5 +163,5 @@ icon: { sprite: Interface/Actions/actions_ai.rsi, state: station_records } iconOn: Interface/Actions/actions_ai.rsi/station_records.png keywords: [ "AI", "console", "interface" ] - priority: -8 + priority: -7 event: !type:ToggleIntrinsicUIEvent { key: enum.GeneralStationRecordConsoleKey.Key } diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 7391e5709f3..be2b5a44f95 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -33,7 +33,6 @@ - type: ActionGrant actions: - ActionJumpToCore - - ActionShowJobIcons - ActionSurvCameraLights - ActionAIViewLaws - type: UserInterface @@ -72,6 +71,7 @@ color: "#2ed2fd" - type: Speech speechVerb: Robotic + - type: ShowJobIcons - type: entity id: AiHeldIntellicard diff --git a/Resources/Textures/Interface/Actions/actions_ai.rsi/job_view.png b/Resources/Textures/Interface/Actions/actions_ai.rsi/job_view.png deleted file mode 100644 index b407c4755e13c72eaefa36aeab453a72b1903d0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmVNCu5t(CbZ2X@dmYzL(7H%(`0ka$^NmI*#_MkX| z1z;x^a>NNEGbT#`aS z$sJYh-cD3L8?b~s^B2KC^98#*K_wwcAs_~=E|pv%^tV^2YF^C{l1SDz+Oj9RMnPfI Date: Fri, 1 Nov 2024 02:33:34 +0000 Subject: [PATCH 026/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 93619da0016..a55c40f374d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Maintenance closets have more variety in what they can contain. - type: Tweak - id: 7075 - time: '2024-08-10T02:12:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30579 - author: Ko4erga changes: - message: Changed chemistry airlock color. @@ -3949,3 +3942,12 @@ id: 7574 time: '2024-11-01T02:06:46.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/29318 +- author: ScarKy0 + changes: + - message: AI can no longer toggle seeing jobs off. + type: Tweak + - message: Borgs can no longer see mindshield status. + type: Fix + id: 7575 + time: '2024-11-01T02:32:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33069 From c9cd778133852af316db97da107214be33ec7a5d Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 1 Nov 2024 02:34:27 +0000 Subject: [PATCH 027/130] add IsMemberOfAny to faction system (#32975) * add IsMemberOfAny to faction system * pro --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Shared/NPC/Systems/NpcFactionSystem.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Content.Shared/NPC/Systems/NpcFactionSystem.cs b/Content.Shared/NPC/Systems/NpcFactionSystem.cs index 98f14afe2a6..0d684de80b9 100644 --- a/Content.Shared/NPC/Systems/NpcFactionSystem.cs +++ b/Content.Shared/NPC/Systems/NpcFactionSystem.cs @@ -81,6 +81,24 @@ public bool IsMember(Entity ent, string faction) return ent.Comp.Factions.Contains(faction); } + /// + /// Returns whether an entity is a member of any listed faction. + /// If the list is empty this returns false. + /// + public bool IsMemberOfAny(Entity ent, IEnumerable> factions) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + foreach (var faction in factions) + { + if (ent.Comp.Factions.Contains(faction)) + return true; + } + + return false; + } + /// /// Adds this entity to the particular faction. /// From d7a1753c7dcd2606f9345c072456781736b3061f Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 1 Nov 2024 14:18:06 +1100 Subject: [PATCH 028/130] Add CanLoad for biomes (#33050) CPUJob to come later. --- Content.Server/Parallax/BiomeSystem.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Content.Server/Parallax/BiomeSystem.cs b/Content.Server/Parallax/BiomeSystem.cs index 22b531eb7cb..109aa0f6e47 100644 --- a/Content.Server/Parallax/BiomeSystem.cs +++ b/Content.Server/Parallax/BiomeSystem.cs @@ -10,6 +10,7 @@ using Content.Server.Shuttles.Systems; using Content.Shared.Atmos; using Content.Shared.Decals; +using Content.Shared.Ghost; using Content.Shared.Gravity; using Content.Shared.Parallax.Biomes; using Content.Shared.Parallax.Biomes.Layers; @@ -51,6 +52,7 @@ public sealed partial class BiomeSystem : SharedBiomeSystem private EntityQuery _biomeQuery; private EntityQuery _fixturesQuery; + private EntityQuery _ghostQuery; private EntityQuery _xformQuery; private readonly HashSet _handledEntities = new(); @@ -81,6 +83,7 @@ public override void Initialize() Log.Level = LogLevel.Debug; _biomeQuery = GetEntityQuery(); _fixturesQuery = GetEntityQuery(); + _ghostQuery = GetEntityQuery(); _xformQuery = GetEntityQuery(); SubscribeLocalEvent(OnBiomeMapInit); SubscribeLocalEvent(OnFTLStarted); @@ -315,6 +318,11 @@ public void Preload(EntityUid uid, BiomeComponent component, Box2 area) } } + private bool CanLoad(EntityUid uid) + { + return !_ghostQuery.HasComp(uid); + } + public override void Update(float frameTime) { base.Update(frameTime); @@ -332,7 +340,8 @@ public override void Update(float frameTime) if (_xformQuery.TryGetComponent(pSession.AttachedEntity, out var xform) && _handledEntities.Add(pSession.AttachedEntity.Value) && _biomeQuery.TryGetComponent(xform.MapUid, out var biome) && - biome.Enabled) + biome.Enabled && + CanLoad(pSession.AttachedEntity.Value)) { var worldPos = _transform.GetWorldPosition(xform); AddChunksInRange(biome, worldPos); @@ -349,7 +358,8 @@ public override void Update(float frameTime) if (!_handledEntities.Add(viewer) || !_xformQuery.TryGetComponent(viewer, out xform) || !_biomeQuery.TryGetComponent(xform.MapUid, out biome) || - !biome.Enabled) + !biome.Enabled || + !CanLoad(viewer)) { continue; } From b8a98de784029d173c97e43ea27cd3570c8c5f6f Mon Sep 17 00:00:00 2001 From: Minemoder5000 Date: Fri, 1 Nov 2024 00:22:38 -0600 Subject: [PATCH 029/130] Remove CargoPallet component from the cargo pallet (#33022) * Change cargo shuttle pallets to catwalks. * Remove CargoPallet component from the cargo pallet. * Undo cargo shuttle changes. --- .../Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index e95e663a795..518e63edeae 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -20,8 +20,6 @@ density: 15 mask: - MachineMask - - type: CargoPallet - palletType: All - type: StaticPrice price: 100 - type: Sprite From 844a92026f462cbae7cf433ddfc32e7b6911df2c Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 1 Nov 2024 06:23:45 +0000 Subject: [PATCH 030/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a55c40f374d..7bcfcc7e0ae 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ko4erga - changes: - - message: Changed chemistry airlock color. - type: Tweak - id: 7076 - time: '2024-08-10T03:23:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30666 - author: Blackern5000 changes: - message: Bent pipes now deal 8 thrown damage instead of 3. @@ -3951,3 +3944,10 @@ id: 7575 time: '2024-11-01T02:32:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33069 +- author: Minemoder5000 + changes: + - message: The cargo shuttle's cargo pallets can no longer sell or buy. + type: Fix + id: 7576 + time: '2024-11-01T06:22:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33022 From 3382743086304d4dcddc1598caa3895adbaea685 Mon Sep 17 00:00:00 2001 From: UBlueberry <161545003+UBlueberry@users.noreply.github.com> Date: Fri, 1 Nov 2024 20:42:20 -0400 Subject: [PATCH 031/130] Minor antagonist guidebook changes (#32824) * took a two month nap. accidentally pushed too many buttons. let's try this again. added thieves to antagonists.xml * even after that nap, i don't feel well-rested at all. * please don't kill me for using webedit * capitalization, typo * Apply suggestions from code review (more period moving) Thanks Evan, very cool Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * guess you could say im not pro-proper noun * typo * Update Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml * ok Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> --- .../Guidebook/Antagonist/Antagonists.xml | 7 ++-- .../Guidebook/Antagonist/MinorAntagonists.xml | 32 +++++++++---------- .../Antagonist/Nuclear Operatives.xml | 16 +++++----- .../Guidebook/Antagonist/Revolutionaries.xml | 16 +++++----- .../Guidebook/Antagonist/SpaceNinja.xml | 18 +++++------ .../Guidebook/Antagonist/Thieves.xml | 5 ++- 6 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml index 2592c107622..7f47f1e490b 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Antagonists.xml @@ -7,13 +7,12 @@ These bad actors are more often than not employed or backed by the [color=#ff0000]Syndicate[/color], a rival organization to Nanotrasen that wants nothing more than to see it burn. ## Various Antagonists - Antagonist roles come with their own special sets of abilities, tools and risks to the station. - Antagonists can take many forms, like: - [textlink="Nuclear operatives" link="Nuclear Operatives"], with the goal of infiltrating and destroying the station. - [textlink="Traitors" link="Traitors"] amongst the crew who must assassinate, steal and decieve. - - [textlink="Space Ninjas" link="SpaceNinja"], masters of espionage and sabotage with special gear. - [textlink="Revolutionaries" link="Revolutionaries"] who are intent on taking control of the station from the inside. - [textlink="Zombies" link="Zombies"] that crave the flesh of every crew member and creature on board. - - [textlink="Several non-humanoid creatures" link="MinorAntagonists"] that usually just try to kill anything that moves. + - [textlink="Space Ninjas" link="SpaceNinja"], masters of espionage and sabotage with special gear. + - [textlink="Thieves" link="Thieves"] driven by kleptomania, determined to get their fix using their special gloves. + - [textlink="Various non-humanoid creatures" link="MinorAntagonists"] that generally attack anything that moves. diff --git a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml index 6704ed28e0b..97574c40215 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml @@ -9,12 +9,12 @@ - Revenants are ethereal beings made of ectoplasm that haunt the crew and steal [color=cyan]life essence[/color] from them. + Revenants are ethereal beings made of ectoplasm that haunt the crew and steal [color=#8f63e6]life essence[/color] from them. - Your essence is your very own [bold]life force[/bold]. Taking damage reduces your essence. - Essence is also spent to use [bold]abilities[/bold]. - - To gain essence you first [bold]inspect[/bold] various souls for their worth. More worthy souls grant more essence. Then you must [bold]siphon[/bold] it either when the victim is crit, dead or asleep. + - To gain essence you first [bold]inspect[/bold] various souls for their worth. More worthy souls grant more essence. Then you must [bold]siphon[/bold] it either when the victim is crit, dead or asleep. All of this is done with [color=yellow][bold][keybind="Use"][/bold][/color]. - [bold]Stolen essence[/bold] is used to purchase new abilities to incapacitate the crew easier. - - You are [bold]vulnerable[/bold] to attacks when you siphon a soul or use an ability. You can tell when you are vulnerable when you have a [italic]"Corporeal"[/italic] status effect. + - You are [bold]vulnerable[/bold] to attacks when you siphon a soul or use an ability. You can tell when you are vulnerable when you have a [color=#8f63e6][italic]Corporeal[/italic][/color] status effect. # Rat King @@ -26,12 +26,12 @@ - Rat Kings are abnormally large rodents capable of [color=cyan]raising huge rat armies[/color] by eating equally huge amounts of food. - - You have several abilities that come at the cost of your [bold]hunger[/bold]. - - One ability is summoning [color=cyan]Rat Servants[/color] who you can [bold]command[/bold] to stay in place, follow you, attack a target of your choice or attack indiscriminately. - - You can conjure a cloud of [color=#77b58e]ammonia[/color], which is mildly poisonous to humans but heals rats. - - You can also [italic]"Rummage"[/italic] through any disposal unit by using the context menu. Use this to find [bold]scraps of food[/bold] to grow your army. - - Besides your abilities, you are [bold]stronger[/bold] than most other animals. You and your servants are capable of speech and you're both small enough to fit under airlocks and tables. + Rat kings are abnormally large rodents capable of [color=yellow]raising huge rat armies[/color] by eating equally huge amounts of food. + - You have several abilities that come at the cost of your [bold]hunger.[/bold] + - One such ability is [color=yellow][italic]Raise Army[/italic][/color], which summons a [bold]Rat Servant[/bold]. You can [bold]command[/bold] your servants to stay in place, follow you, attack a target of your choice or attack indiscriminately. + - You can conjure a cloud of [color=#77b58e]ammonia[/color] using [color=purple][italic]Rat King's Domain[/italic][/color]. This purple gas is mildly poisonous to humans but heals rats. + - [color=#9daa98][italic]Rummage[/italic][/color] through a disposal unit by using the context menu. Use this to find [bold]scraps of food[/bold] to grow your army. + - Besides your abilities, [bold]you are stronger than most other animals.[/bold] You and your servants are capable of speech and you're both small enough to fit under airlocks and tables. - [bold]Your underlings are still very fragile![/bold] Beware of spacings, explosions and the buisness end of a melee weapon. # Space Dragon @@ -44,11 +44,11 @@ - Space Dragons is are giant extradimensional fish that [color=cyan]create rifts and eat crew.[/color] - - Dragons have powerful jaws to [bold]devour[/bold] infrastructure such as doors, windows, and walls. - - Your [color=orange]dragon's breath[/color] is a flaming projectile which travels a straight flight path, exploding multiple times and igniting things along the way. Be careful, your carps are not immune to this! - - You have the ability to summon [bold]carp rifts[/bold] that periodically spawn [bold]space carp[/bold]. There can be 3 rifts active at any given time. - - Rifts charge up energy over a period of 5 minutes and are [bold]vulnerable[/bold] during this time. After 5 minutes, it becomes invulnerable and will continue summoning carp as long as the dragon lives. + Space dragons are giant extradimensional fish that can [color=red]eat crew[/color] and create [color=#4b7fcc]carp rifts.[/color] + - Dragons have powerful jaws that allow them to [color=red][italic]Devour[/italic][/color] infrastructure such as doors, windows, and walls. + - They can also heal themselves by using [color=red][italic]Devour[/italic][/color] on crew members that have gone unconscious or have died. + - Your [color=orange][italic]Dragon's Breath[/italic][/color] is a [bold]flaming projectile[/bold] which travels a straight flight path, exploding multiple times and igniting things along the way. Try not to hit your carps with this! + - You have the ability to [color=#4b7fcc][italic]Summon a Carp Rift[/italic][/color]. Rifts periodically spawn [bold]space carp[/bold] and charge up energy over a period of 5 minutes, [bold]which is when it's vulnerable.[/bold] After 5 minutes, it becomes invulnerable and will continue summoning carp as long as the dragon lives. - You'll suffer a [bold]temporary debilitating feedback effect[/bold] if one of your rifts are destroyed before it's done charging. - If a period of five minutes passes since your spawn or since the last time a rift was charging, [bold]you'll disappear.[/bold] - Dragons who have the maximum of 3 fully charged rifts will [bold]never disappear[/bold], but they are still mortal. @@ -61,6 +61,6 @@ Slimes and spiders have no remarkable features, but will [color=cyan]infest the station[/color] from time to time regardless. Both will give chase and attack anything they see. - - Slimes may deal extra [bold]cellular or posion damage[/bold], based upon their color. Water hurts them just as it would hurt a slime person. - - Spiders can lay [bold]webs[/bold], which non-spiders have a hard time moving through. They can easily be destroyed with a blade. + - Slimes may [bold]deal extra cellular or poison damage[/bold], based upon their color. Water hurts them just as it would hurt a slime person. + - Spiders have a venomous bite and can [bold]create webs[/bold] that are hard to move though. Webs are easily destroyed with a blade. They can also pry open airlocks. diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml b/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml index ee586633742..11149bab66d 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml @@ -1,6 +1,6 @@ # Nuclear Operatives - + [color=#999999][italic]"OPERATIVES STANDBY. YOUR OBJECTIVES ARE SIMPLE.[/italic][/color] @@ -38,13 +38,13 @@ ## Preparation - Each member in your squad has been given an [color=cyan]uplink[/color] to purchase everything you will need for the mission, similar to [textlink="Traitors." link="Traitors"] + Each member in your squad has been given an [color=cyan]uplink[/color] to purchase everything you will need for the mission, similar to [textlink="traitors." link="Traitors"] - You can purchase the same kinds of gear Traitors can, but you have higher quality gear available to you and more telecrystals to spend. + You can purchase the same kinds of gear traitors can, but you have higher quality gear available to you and more telecrystals to spend. @@ -71,8 +71,8 @@ ## Getting to the Station You've got the plan, you've got the gear. Now, execute. - Grab a [bold]jetpack[/bold] from your armory and go with your other operatives to the [color=cyan]Syndicate Shuttle[/color]. - Among other things you may need, you'll find an [bold]IFF Console[/bold] on the shuttle. It allows you to hide from other ships and mass scanners when [italic]"Show IFF"[/italic] and [italic]"Show Vessel"[/italic] are toggled off. + Grab a [bold]jetpack[/bold] from your armory and go with your other operatives to your [color=cyan]shuttle[/color]. + Among other things you may need, you'll find an [bold]IFF Computer[/bold] on the shuttle. It allows you to hide from other ships and mass scanners when [italic]Show IFF[/italic] and [italic]Show Vessel[/italic] are toggled off. When everyone is ready, FTL to the station and fly to it with a jetpack. Don't forget the code, your pinpointers and the nuke if you're taking it. @@ -82,12 +82,12 @@ ## The Nuke & Arming Procedure - You have a paper with the [color=cyan]nuclear authentication codes[/color] on your shuttle. [bold]Check to see if the nuke ID matches the one on your shuttle.[/bold] If it doesn't, you'll have to use explosive in the station's vault. + You have a paper with the [color=cyan]nuclear authentication codes[/color] on your shuttle. [bold]Check to see if the nuke ID matches the one on your shuttle.[/bold] If it doesn't, you'll be arming the station's nuke instead. - Obtain the [bold]nuclear authentication disk[/bold] and insert it into the nuke. - Type in the [bold]nuclear authentication code[/bold] and press "[bold]E[/bold]" on the keypad to Enter. - - To begin [bold]self-destruct process[/bold], press "[color=red]ARM[/color]". After 300 seconds, the nuke will explode. - - [bold]Defend the nuke[/bold], even if it's at the cost of your lives! The mission requirements do not include your return. + - [bold]To begin the self-destruct sequence, press [color=#EB2D3A]ARM[/color][/bold]. After 300 seconds, the nuke will explode. + - [bold]Defend the nuke[/bold], even if it's at the cost of your lives! The mission requirements do not include your return. - It takes 30 seconds for someone to [bold]disarm[/bold] the nuke. Re-arming it is possible, but the chance of mission success drops if you let it happen. - Should the nuke be re-armed, the timer will start from where it left off. diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml b/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml index 4a1887a392b..9bc0b28068b 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml @@ -1,6 +1,6 @@ # Revolutionaries - + [color=#999999][italic]"Viva la revolución!!"[/italic][/color] @@ -13,20 +13,20 @@ ## Objectives You must cuff, kill, or exile all of the [textlink="Command staff" link="Command"] on station in no particular order. - Your objective is not to destroy the station, but [italic]take it over[/italic], so try to minimize damage where possible. + Your objective is [bold]not to destroy the station[/bold], but [italic]to take it over[/italic], so try to minimize damage where possible. [bold]The revolution will fail[/bold] if all of the [bold][color=#5e9cff]Head Revolutionaries[/color][/bold] die, and all [color=red]Revolutionaries[/color] will de-convert if this happens. ## Headrevs & Conversion [bold][color=#5e9cff]Head Revolutionaries[/color][/bold] are chosen at the start of the shift and begin with a [color=cyan]flash[/color] and a pair of [color=cyan]sunglasses[/color]. - + - + You can convert crew members to your side by taking any [bold]flash[/bold] and attacking someone with it using [color=#ff0000]harm mode[/color]. - However, you can't convert your target if they're wearing [color=cyan]flash protection[/color] such as [bold]sunglasses[/bold] or a [bold]welding mask[/bold]. + However, [bold]you can't convert your target if they're wearing [color=cyan]flash protection[/color][/bold] such as sunglasses or a welding mask. @@ -34,10 +34,10 @@ - Another hurdle in your way are pesky [color=cyan]mindshield implanters[/color]. These will: + Another obstacle in your way are those pesky [color=cyan]mindshield implanters[/color]. These will: - Prevent the implanted person from being converted into a [color=red]Revolutionary[/color] - De-convert Revolutionaries, and will make them no longer loyal to your cause - - Visibly be destroyed upon being implanted into a [bold][color=#5e9cff]Head Revolutionary[/color][/bold], giving away your cover + - [bold]Visibly be destroyed upon being implanted into a [color=#5e9cff]Head Revolutionary[/color][/bold], giving you away - NOT protect against flash disorientation Assume all of [color=#cb0000]Security[/color] and [color=#1b67a5]Command[/color] are implanted with mindshields already. @@ -47,7 +47,7 @@ ## Revolutionary - A [bold][color=red]Revolutionary[/color][/bold] is a crew member that has been converted by a [bold][color=#5e9cff]Head Revolutionary[/color][/bold]. + A [color=red]Revolutionary[/color] is a crew member that has been converted by a [bold][color=#5e9cff]Head Revolutionary[/color][/bold]. [bold][color=red]Revolutionaries[/color] can't convert people themselves,[/bold] but they're more than capable of doing dirty work and carrying out orders. diff --git a/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml b/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml index 9998d4b38a0..c001b979377 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml @@ -7,7 +7,7 @@ You are an elite mercenary that [color=#66FF00]The Spider Clan[/color] has sent to wreak all kinds of havoc on the station. You are equipped to keep it silent-but-deadly. - Whether you decide to mercilessly pick off the station's crew one by one or stay out of trouble, your discipline has taught you that [italic]your objectives must be at least attempted[/italic]. For honor! + Whether you get bloody or stay out of trouble, your discipline has taught you that [italic]your objectives must be at least attempted[/italic]. For honor! ## Standard Equipment You begin implanted with a [color=cyan]death acidifier[/color], so if you are captured or KIA all your precious equipment is kept out of enemy hands. @@ -19,7 +19,7 @@ - ## Ninja Suit & Boots + ## Your Suit @@ -27,12 +27,12 @@ - Your single most important item is [color=#66FF00]your suit[/color], without it none of your abilities would work. + Your single most important item is [color=cyan]your suit[/color], without it none of your abilities would work. Your suit requires power to function, which is supplied by its [bold]internal battery[/bold]. It can be replaced, and [italic]high capacity batteries[/italic] mean a [italic]highly effective ninja[/italic]. - [bold]You can recharge your internal battery directly[/bold] by using [color=#66FF00]your gloves[/color]. You can see the current charge by examining the suit or checking the nifty battery alert on your screen. + [bold]You can recharge your internal battery directly[/bold] by using [color=cyan]your gloves[/color]. You can see the current charge by examining the suit or checking the nifty battery alert on your screen. - Your outfit also includes [color=#66FF00]special boots[/color] that keep you agile, upright and grounded without using energy. You've also got flash protection thanks to your [color=#66FF00]visor[/color]. + Your outfit also includes [color=cyan]special boots[/color] that keep you agile, upright and grounded without using energy. You've also got flash protection thanks to your [color=cyan]visor[/color]. ## Ninja Gloves @@ -58,9 +58,9 @@ [bold]You have sworn yourself to the sword and refuse to use firearms.[/bold] Luckily, you've got a pretty cool sword. - Your [color=#66FF00]energy katana[/color] hurts plenty and can be [bold]recalled at will[/bold] at the cost of suit power. The farther away it is from you, the more energy required to recall it. + Your [color=cyan]energy katana[/color] hurts plenty and can be [bold]recalled at will[/bold] at the cost of suit power. The farther away it is from you, the more energy required to recall it. - While in hand you may also [color=#66FF00]teleport[/color] to anywhere that you can see, [bold]including through windows[/bold]. The charges required to do this regenerate slowly, so keep a charge or two spare in case you need a quick getaway. + While in hand you may also [color=cyan]teleport[/color] to anywhere that you can see, [bold]including through windows[/bold]. The charges required to do this regenerate slowly, so keep a charge or two spare in case you need a quick getaway. ## Spider Clan Charge @@ -68,9 +68,9 @@ - [color=#66FF00]A modified C-4 explosive[/color], which can be found in your pocket. Creates a large explosion but [bold]must be armed in your target area[/bold] as it is one of your [color=#66FF00]objectives[/color]. + This is a [color=cyan]modified C-4 explosive[/color] which can be found in your pocket. Creates a large explosion but [bold]must be armed in your target area[/bold] as it is one of your objectives. - It can't be activated manually, so simply plant it on a wall or a particularly ugly piece of furniture. Can't be unstuck once planted. + It can't be activated manually, so simply plant it on a wall or some furniture that does not spark joy. Choose wisely, it can't be unstuck once planted. ## Objectives diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml index 7ed5aa98392..4c11fc0d991 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Thieves.xml @@ -11,7 +11,7 @@ Thieves are petty yet crafty [color=green]criminals[/color] who can't keep their hands to themselves. You were forcefully given a [bold]pacifism implant[/bold] after your last arrest, but you won't let that stop you from trying to add to your collection. ## Art of the Steal - Unlike other antagonists, [italic]staying out of trouble is almost a requirement for you[/italic] because of your implant. + Unlike other antagonists, [bold]staying out of trouble is almost a requirement for you[/bold] because of your implant. You can only run if [color=#cb0000]Security[/color] picks a fight with you, and because you work alone you don't have any friends to pull you out of danger. But against all odds, you'll sucessfully swipe what you want using determination, sleight of hand, a few tools and your [color=cyan]thieving gloves.[/color] @@ -39,6 +39,9 @@ Your [color=cyan]toolbox[/color] contains... well, whatever you remembered to pack. [bold]You can select two pre-made kits[/bold] to help you complete grander heists. Approve your choices in a safe place, as the toolbox will dissolve and the gear will drop at your feet. + + + From 146ae8a6a6f5d80cedbf76373bb1887e6f5d9218 Mon Sep 17 00:00:00 2001 From: Preston Smith <92108534+thetolbean@users.noreply.github.com> Date: Fri, 1 Nov 2024 19:44:15 -0500 Subject: [PATCH 032/130] Give Nukies a Hand Labeler (#33053) * Add hand-labeler to nukie planet * Rearrange nukie chem table --- Resources/Maps/Nonstations/nukieplanet.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Resources/Maps/Nonstations/nukieplanet.yml b/Resources/Maps/Nonstations/nukieplanet.yml index 665657f7dda..6c0a209deca 100644 --- a/Resources/Maps/Nonstations/nukieplanet.yml +++ b/Resources/Maps/Nonstations/nukieplanet.yml @@ -6576,7 +6576,7 @@ entities: - uid: 2031 components: - type: Transform - pos: 3.6114278,-10.732791 + pos: 4.0109396,-12.223828 parent: 104 - uid: 2095 components: @@ -10993,6 +10993,13 @@ entities: - type: Transform pos: 11.5,-6.5 parent: 104 +- proto: HandLabeler + entities: + - uid: 1826 + components: + - type: Transform + pos: 3.4542694,-10.616036 + parent: 104 - proto: KitchenKnife entities: - uid: 1061 From 26194e2f416b9496d7ae25a4302bedfab22e9574 Mon Sep 17 00:00:00 2001 From: Brandon Li <48413902+aspiringLich@users.noreply.github.com> Date: Fri, 1 Nov 2024 21:33:26 -0400 Subject: [PATCH 033/130] Fix `ItemSlotSystem` popup Logic (#28856) * move popup call out of `CanInsert` into `OnInteractUsing` * im stupid and `reason` is completely unnecessary Signed-off-by: Brandon Li * return early when `itemSlots.Slots.Count == 0` * tweak logic for triggering popups * change popup logic again * Consolidate whitelist check * Get any popup message not just last failed slot * Apply suggestions from code review Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com> * yoink Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> --------- Signed-off-by: Brandon Li Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com> --- .../Containers/ItemSlot/ItemSlotsSystem.cs | 153 +++++++++++++----- 1 file changed, 117 insertions(+), 36 deletions(-) diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index f25273f4039..479690847c3 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -60,6 +60,7 @@ public override void Initialize() } #region ComponentManagement + /// /// Spawn in starting items for any item slots that should have one. /// @@ -70,7 +71,8 @@ private void OnMapInit(EntityUid uid, ItemSlotsComponent itemSlots, MapInitEvent if (slot.HasItem || string.IsNullOrEmpty(slot.StartingItem)) continue; - var item = EntityManager.SpawnEntity(slot.StartingItem, EntityManager.GetComponent(uid).Coordinates); + var item = Spawn(slot.StartingItem, Transform(uid).Coordinates); + if (slot.ContainerSlot != null) _containers.Insert(item, slot.ContainerSlot); } @@ -99,7 +101,8 @@ public void AddItemSlot(EntityUid uid, string id, ItemSlot slot, ItemSlotsCompon if (itemSlots.Slots.TryGetValue(id, out var existing)) { if (existing.Local) - Log.Error($"Duplicate item slot key. Entity: {EntityManager.GetComponent(uid).EntityName} ({uid}), key: {id}"); + Log.Error( + $"Duplicate item slot key. Entity: {EntityManager.GetComponent(uid).EntityName} ({uid}), key: {id}"); else // server state takes priority slot.CopyFrom(existing); @@ -134,7 +137,10 @@ public void RemoveItemSlot(EntityUid uid, ItemSlot slot, ItemSlotsComponent? ite Dirty(uid, itemSlots); } - public bool TryGetSlot(EntityUid uid, string slotId, [NotNullWhen(true)] out ItemSlot? itemSlot, ItemSlotsComponent? component = null) + public bool TryGetSlot(EntityUid uid, + string slotId, + [NotNullWhen(true)] out ItemSlot? itemSlot, + ItemSlotsComponent? component = null) { itemSlot = null; @@ -143,9 +149,11 @@ public bool TryGetSlot(EntityUid uid, string slotId, [NotNullWhen(true)] out Ite return component.Slots.TryGetValue(slotId, out itemSlot); } + #endregion #region Interactions + /// /// Attempt to take an item from a slot, if any are set to EjectOnInteract. /// @@ -201,20 +209,50 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera if (!EntityManager.TryGetComponent(args.User, out HandsComponent? hands)) return; + if (itemSlots.Slots.Count == 0) + return; + + // If any slot can be inserted into don't show popup. + // If any whitelist passes, but slot is locked, then show locked. + // If whitelist fails all, show whitelist fail. + + // valid, insertable slots (if any) var slots = new List(); + + string? whitelistFailPopup = null; + string? lockedFailPopup = null; foreach (var slot in itemSlots.Slots.Values) { if (!slot.InsertOnInteract) continue; - if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap, popup: args.User)) - continue; + if (CanInsert(uid, args.Used, args.User, slot, slot.Swap)) + { + slots.Add(slot); + } + else + { + var allowed = CanInsertWhitelist(args.Used, slot); + if (lockedFailPopup == null && slot.LockedFailPopup != null && allowed && slot.Locked) + lockedFailPopup = slot.LockedFailPopup; - slots.Add(slot); + if (whitelistFailPopup == null && slot.WhitelistFailPopup != null) + whitelistFailPopup = slot.WhitelistFailPopup; + } } if (slots.Count == 0) + { + // it's a bit weird that the popupMessage is stored with the item slots themselves, but in practice + // the popup messages will just all be the same, so it's probably fine. + // + // doing a check to make sure that they're all the same or something is probably frivolous + if (lockedFailPopup != null) + _popupSystem.PopupClient(Loc.GetString(lockedFailPopup), uid, args.User); + else if (whitelistFailPopup != null) + _popupSystem.PopupClient(Loc.GetString(whitelistFailPopup), uid, args.User); return; + } // Drop the held item onto the floor. Return if the user cannot drop. if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands)) @@ -236,23 +274,31 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera return; } } + #endregion #region Insert + /// /// Insert an item into a slot. This does not perform checks, so make sure to also use or just use instead. /// /// If true, will exclude the user when playing sound. Does nothing client-side. /// Useful for predicted interactions - private void Insert(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? user, bool excludeUserAudio = false) + private void Insert(EntityUid uid, + ItemSlot slot, + EntityUid item, + EntityUid? user, + bool excludeUserAudio = false) { bool? inserted = slot.ContainerSlot != null ? _containers.Insert(item, slot.ContainerSlot) : null; // ContainerSlot automatically raises a directed EntInsertedIntoContainerMessage // Logging if (inserted != null && inserted.Value && user != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(user.Value)} inserted {ToPrettyString(item)} into {slot.ContainerSlot?.ID + " slot of "}{ToPrettyString(uid)}"); + _adminLogger.Add(LogType.Action, + LogImpact.Low, + $"{ToPrettyString(user.Value)} inserted {ToPrettyString(item)} into {slot.ContainerSlot?.ID + " slot of "}{ToPrettyString(uid)}"); _audioSystem.PlayPredicted(slot.InsertSound, uid, excludeUserAudio ? user : null); } @@ -261,46 +307,53 @@ private void Insert(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? use /// Check whether a given item can be inserted into a slot. Unless otherwise specified, this will return /// false if the slot is already filled. /// - /// - /// If a popup entity is given, and if the item slot is set to generate a popup message when it fails to - /// pass the whitelist or due to slot being locked, then this will generate an appropriate popup. - /// - public bool CanInsert(EntityUid uid, EntityUid usedUid, EntityUid? user, ItemSlot slot, bool swap = false, EntityUid? popup = null) + public bool CanInsert(EntityUid uid, + EntityUid usedUid, + EntityUid? user, + ItemSlot slot, + bool swap = false) { if (slot.ContainerSlot == null) return false; - if (_whitelistSystem.IsWhitelistFail(slot.Whitelist, usedUid) || _whitelistSystem.IsBlacklistPass(slot.Blacklist, usedUid)) - { - if (popup.HasValue && slot.WhitelistFailPopup.HasValue) - _popupSystem.PopupClient(Loc.GetString(slot.WhitelistFailPopup), uid, popup.Value); + if (slot.HasItem && (!swap || swap && !CanEject(uid, user, slot))) return false; - } - if (slot.Locked) - { - if (popup.HasValue && slot.LockedFailPopup.HasValue) - _popupSystem.PopupClient(Loc.GetString(slot.LockedFailPopup), uid, popup.Value); + if (!CanInsertWhitelist(usedUid, slot)) return false; - } - if (slot.HasItem && (!swap || (swap && !CanEject(uid, user, slot)))) + if (slot.Locked) return false; var ev = new ItemSlotInsertAttemptEvent(uid, usedUid, user, slot); RaiseLocalEvent(uid, ref ev); RaiseLocalEvent(usedUid, ref ev); if (ev.Cancelled) + { return false; + } return _containers.CanInsert(usedUid, slot.ContainerSlot, assumeEmpty: swap); } + private bool CanInsertWhitelist(EntityUid usedUid, ItemSlot slot) + { + if (_whitelistSystem.IsWhitelistFail(slot.Whitelist, usedUid) + || _whitelistSystem.IsBlacklistPass(slot.Blacklist, usedUid)) + return false; + return true; + } + /// /// Tries to insert item into a specific slot. /// /// False if failed to insert item - public bool TryInsert(EntityUid uid, string id, EntityUid item, EntityUid? user, ItemSlotsComponent? itemSlots = null, bool excludeUserAudio = false) + public bool TryInsert(EntityUid uid, + string id, + EntityUid item, + EntityUid? user, + ItemSlotsComponent? itemSlots = null, + bool excludeUserAudio = false) { if (!Resolve(uid, ref itemSlots)) return false; @@ -315,7 +368,11 @@ public bool TryInsert(EntityUid uid, string id, EntityUid item, EntityUid? user, /// Tries to insert item into a specific slot. /// /// False if failed to insert item - public bool TryInsert(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? user, bool excludeUserAudio = false) + public bool TryInsert(EntityUid uid, + ItemSlot slot, + EntityUid item, + EntityUid? user, + bool excludeUserAudio = false) { if (!CanInsert(uid, item, user, slot)) return false; @@ -329,7 +386,11 @@ public bool TryInsert(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? u /// Does not check action blockers. /// /// False if failed to insert item - public bool TryInsertFromHand(EntityUid uid, ItemSlot slot, EntityUid user, HandsComponent? hands = null, bool excludeUserAudio = false) + public bool TryInsertFromHand(EntityUid uid, + ItemSlot slot, + EntityUid user, + HandsComponent? hands = null, + bool excludeUserAudio = false) { if (!Resolve(user, ref hands, false)) return false; @@ -443,6 +504,7 @@ private static int SortEmpty(ItemSlot a, ItemSlot b) return 1; } + #endregion #region Eject @@ -462,7 +524,7 @@ public bool CanEject(EntityUid uid, EntityUid? user, ItemSlot slot, EntityUid? p return false; } - if (slot.ContainerSlot?.ContainedEntity is not {} item) + if (slot.ContainerSlot?.ContainedEntity is not { } item) return false; var ev = new ItemSlotEjectAttemptEvent(uid, item, user, slot); @@ -487,7 +549,9 @@ private void Eject(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? user // Logging if (ejected != null && ejected.Value && user != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(user.Value)} ejected {ToPrettyString(item)} from {slot.ContainerSlot?.ID + " slot of "}{ToPrettyString(uid)}"); + _adminLogger.Add(LogType.Action, + LogImpact.Low, + $"{ToPrettyString(user.Value)} ejected {ToPrettyString(item)} from {slot.ContainerSlot?.ID + " slot of "}{ToPrettyString(uid)}"); _audioSystem.PlayPredicted(slot.EjectSound, uid, excludeUserAudio ? user : null); } @@ -496,7 +560,11 @@ private void Eject(EntityUid uid, ItemSlot slot, EntityUid item, EntityUid? user /// Try to eject an item from a slot. /// /// False if item slot is locked or has no item inserted - public bool TryEject(EntityUid uid, ItemSlot slot, EntityUid? user, [NotNullWhen(true)] out EntityUid? item, bool excludeUserAudio = false) + public bool TryEject(EntityUid uid, + ItemSlot slot, + EntityUid? user, + [NotNullWhen(true)] out EntityUid? item, + bool excludeUserAudio = false) { item = null; @@ -518,8 +586,12 @@ public bool TryEject(EntityUid uid, ItemSlot slot, EntityUid? user, [NotNullWhen /// Try to eject item from a slot. /// /// False if the id is not valid, the item slot is locked, or it has no item inserted - public bool TryEject(EntityUid uid, string id, EntityUid? user, - [NotNullWhen(true)] out EntityUid? item, ItemSlotsComponent? itemSlots = null, bool excludeUserAudio = false) + public bool TryEject(EntityUid uid, + string id, + EntityUid? user, + [NotNullWhen(true)] out EntityUid? item, + ItemSlotsComponent? itemSlots = null, + bool excludeUserAudio = false) { item = null; @@ -550,12 +622,16 @@ public bool TryEjectToHands(EntityUid uid, ItemSlot slot, EntityUid? user, bool return true; } + #endregion #region Verbs - private void AddAlternativeVerbs(EntityUid uid, ItemSlotsComponent itemSlots, GetVerbsEvent args) + + private void AddAlternativeVerbs(EntityUid uid, + ItemSlotsComponent itemSlots, + GetVerbsEvent args) { - if (args.Hands == null || !args.CanAccess ||!args.CanInteract) + if (args.Hands == null || !args.CanAccess || !args.CanInteract) { return; } @@ -649,7 +725,9 @@ private void AddAlternativeVerbs(EntityUid uid, ItemSlotsComponent itemSlots, Ge } } - private void AddInteractionVerbsVerbs(EntityUid uid, ItemSlotsComponent itemSlots, GetVerbsEvent args) + private void AddInteractionVerbsVerbs(EntityUid uid, + ItemSlotsComponent itemSlots, + GetVerbsEvent args) { if (args.Hands == null || !args.CanAccess || !args.CanInteract) return; @@ -708,7 +786,7 @@ private void AddInteractionVerbsVerbs(EntityUid uid, ItemSlotsComponent itemSlot new SpriteSpecifier.Texture( new ResPath("/Textures/Interface/VerbIcons/insert.svg.192dpi.png")); } - else if(slot.EjectOnInteract) + else if (slot.EjectOnInteract) { // Inserting/ejecting is a primary interaction for this entity. Instead of using the insert // category, we will use a single "Place " verb. @@ -727,9 +805,11 @@ private void AddInteractionVerbsVerbs(EntityUid uid, ItemSlotsComponent itemSlot args.Verbs.Add(insertVerb); } } + #endregion #region BUIs + private void HandleButtonPressed(EntityUid uid, ItemSlotsComponent component, ItemSlotButtonPressedEvent args) { if (!component.Slots.TryGetValue(args.SlotId, out var slot)) @@ -740,6 +820,7 @@ private void HandleButtonPressed(EntityUid uid, ItemSlotsComponent component, It else if (args.TryInsert && !slot.HasItem) TryInsertFromHand(uid, slot, args.Actor); } + #endregion /// From 957b8de89b0026d67efadac475763ea910339e2f Mon Sep 17 00:00:00 2001 From: Vasilis Date: Sat, 2 Nov 2024 02:34:23 +0100 Subject: [PATCH 034/130] Add cvars to votekick to customize requirements for the initiator. (#32490) --- Content.Server/Voting/VotingSystem.cs | 9 +++++++-- Content.Shared/CCVar/CCVars.cs | 12 ++++++++++++ Resources/Locale/en-US/voting/ui/vote-call-menu.ftl | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Content.Server/Voting/VotingSystem.cs b/Content.Server/Voting/VotingSystem.cs index 3d3aeb48598..5df1ce7c1f0 100644 --- a/Content.Server/Voting/VotingSystem.cs +++ b/Content.Server/Voting/VotingSystem.cs @@ -13,6 +13,7 @@ using Robust.Shared.Player; using Robust.Shared.Timing; using System.Threading.Tasks; +using Content.Shared.Players.PlayTimeTracking; namespace Content.Server.Voting; @@ -26,6 +27,7 @@ public sealed class VotingSystem : EntitySystem [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly JobSystem _jobs = default!; [Dependency] private readonly GameTicker _gameTicker = default!; + [Dependency] private readonly ISharedPlaytimeManager _playtimeManager = default!; public override void Initialize() { @@ -109,10 +111,13 @@ public async Task CheckVotekickInitEligibility(ICommonSession? initiator) } // Must be whitelisted - if (!await _dbManager.GetWhitelistStatusAsync(initiator.UserId)) + if (!await _dbManager.GetWhitelistStatusAsync(initiator.UserId) && _cfg.GetCVar(CCVars.VotekickInitiatorWhitelistedRequirement)) return false; - return true; + // Must be eligible to vote + var playtime = _playtimeManager.GetPlayTimes(initiator); + return playtime.TryGetValue(PlayTimeTrackingShared.TrackerOverall, out TimeSpan overallTime) && (overallTime >= TimeSpan.FromHours(_cfg.GetCVar(CCVars.VotekickEligibleVoterPlaytime)) + || !_cfg.GetCVar(CCVars.VotekickInitiatorTimeRequirement)); } /// diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index d1dc9d9ade1..81a0668bdb6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1477,6 +1477,18 @@ public static readonly CVarDef public static readonly CVarDef VotekickInitiatorGhostRequirement = CVarDef.Create("votekick.initiator_ghost_requirement", true, CVar.SERVERONLY); + /// + /// Should the initiator be whitelisted to initiate a votekick? + /// + public static readonly CVarDef VotekickInitiatorWhitelistedRequirement = + CVarDef.Create("votekick.initiator_whitelist_requirement", true, CVar.SERVERONLY); + + /// + /// Should the initiator be able to start a votekick if they are bellow the votekick.voter_playtime requirement? + /// + public static readonly CVarDef VotekickInitiatorTimeRequirement = + CVarDef.Create("votekick.initiator_time_requirement", false, CVar.SERVERONLY); + /// /// Whether a votekick voter must be a ghost or not. /// diff --git a/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl b/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl index fbae3598ed6..82e3a5d1f82 100644 --- a/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl +++ b/Resources/Locale/en-US/voting/ui/vote-call-menu.ftl @@ -25,7 +25,7 @@ ui-vote-type-not-available = This vote type has been disabled # Vote option only available for specific users. ui-vote-trusted-users-notice = - This vote option is only available to whitelisted players. + This vote option is only available to players who have enough playtime or are whitelisted. In addition, you must have been a ghost for { $timeReq } seconds. # Warning to not abuse a specific vote option. From 2537bff7ba1134e903a90fa7972286bfd8abb9b9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 01:34:34 +0000 Subject: [PATCH 035/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7bcfcc7e0ae..f4a320dcb55 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Blackern5000 - changes: - - message: Bent pipes now deal 8 thrown damage instead of 3. - type: Tweak - id: 7077 - time: '2024-08-10T03:30:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30634 - author: shampunj changes: - message: Rat king can now wideswing @@ -3951,3 +3944,10 @@ id: 7576 time: '2024-11-01T06:22:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33022 +- author: aspiringLich + changes: + - message: Fixed the logic triggering popups when inserting items into machines. + type: Fix + id: 7577 + time: '2024-11-02T01:33:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28856 From 1c8eed8b4531f081d8a0178f9ea60b108d439bf6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 2 Nov 2024 20:29:16 +1100 Subject: [PATCH 036/130] Add on-call functionality for adminning (#30443) * Add on-call functionality for adminning The first time an ahelp gets SOS it gets relayed to the specified channel with the specified ping. Every time after that it doesn't until it gets a non-SOS response received. * Remove redundant name Pretty sure this already gets chucked on the name of the msg itself I think it just didn't show in screenshot because they were subsequent. * Update Content.Server/Administration/Systems/BwoinkSystem.cs Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> --------- Co-authored-by: Chief-Engineer <119664036+Chief-Engineer@users.noreply.github.com> Co-authored-by: deathride58 --- .../Administration/Systems/BwoinkSystem.cs | 205 +++++++++++++++--- Content.Shared/CCVar/CCVars.cs | 12 + 2 files changed, 181 insertions(+), 36 deletions(-) diff --git a/Content.Server/Administration/Systems/BwoinkSystem.cs b/Content.Server/Administration/Systems/BwoinkSystem.cs index 1efc0a9d562..7a47755db9d 100644 --- a/Content.Server/Administration/Systems/BwoinkSystem.cs +++ b/Content.Server/Administration/Systems/BwoinkSystem.cs @@ -47,20 +47,23 @@ public sealed partial class BwoinkSystem : SharedBwoinkSystem [GeneratedRegex(@"^https://discord\.com/api/webhooks/(\d+)/((?!.*/).*)$")] private static partial Regex DiscordRegex(); - private ISawmill _sawmill = default!; - private readonly HttpClient _httpClient = new(); private string _webhookUrl = string.Empty; private WebhookData? _webhookData; + + private string _onCallUrl = string.Empty; + private WebhookData? _onCallData; + + private ISawmill _sawmill = default!; + private readonly HttpClient _httpClient = new(); + private string _footerIconUrl = string.Empty; private string _avatarUrl = string.Empty; private string _serverName = string.Empty; - private readonly - Dictionary _relayMessages = new(); + private readonly Dictionary _relayMessages = new(); private Dictionary _oldMessageIds = new(); - private readonly Dictionary> _messageQueues = new(); + private readonly Dictionary> _messageQueues = new(); private readonly HashSet _processingChannels = new(); private readonly Dictionary _typingUpdateTimestamps = new(); private string _overrideClientName = string.Empty; @@ -82,12 +85,16 @@ private readonly public override void Initialize() { base.Initialize(); + + Subs.CVar(_config, CCVars.DiscordOnCallWebhook, OnCallChanged, true); + Subs.CVar(_config, CCVars.DiscordAHelpWebhook, OnWebhookChanged, true); Subs.CVar(_config, CCVars.DiscordAHelpFooterIcon, OnFooterIconChanged, true); Subs.CVar(_config, CCVars.DiscordAHelpAvatar, OnAvatarChanged, true); Subs.CVar(_config, CVars.GameHostName, OnServerNameChanged, true); Subs.CVar(_config, CCVars.AdminAhelpOverrideClientName, OnOverrideChanged, true); _sawmill = IoCManager.Resolve().GetSawmill("AHELP"); + var defaultParams = new AHelpMessageParams( string.Empty, string.Empty, @@ -96,7 +103,7 @@ public override void Initialize() _gameTicker.RunLevel, playedSound: false ); - _maxAdditionalChars = GenerateAHelpMessage(defaultParams).Length; + _maxAdditionalChars = GenerateAHelpMessage(defaultParams).Message.Length; _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; SubscribeLocalEvent(OnGameRunLevelChanged); @@ -111,6 +118,33 @@ public override void Initialize() ); } + private async void OnCallChanged(string url) + { + _onCallUrl = url; + + if (url == string.Empty) + return; + + var match = DiscordRegex().Match(url); + + if (!match.Success) + { + Log.Error("On call URL does not appear to be valid."); + return; + } + + if (match.Groups.Count <= 2) + { + Log.Error("Could not get webhook ID or token for on call URL."); + return; + } + + var webhookId = match.Groups[1].Value; + var webhookToken = match.Groups[2].Value; + + _onCallData = await GetWebhookData(webhookId, webhookToken); + } + private void PlayerRateLimitedAction(ICommonSession obj) { RaiseNetworkEvent( @@ -259,13 +293,13 @@ args.New is not (GameRunLevel.PreRoundLobby or GameRunLevel.InRound)) // Store the Discord message IDs of the previous round _oldMessageIds = new Dictionary(); - foreach (var message in _relayMessages) + foreach (var (user, interaction) in _relayMessages) { - var id = message.Value.id; + var id = interaction.Id; if (id == null) return; - _oldMessageIds[message.Key] = id; + _oldMessageIds[user] = id; } _relayMessages.Clear(); @@ -330,10 +364,10 @@ private async void OnWebhookChanged(string url) var webhookToken = match.Groups[2].Value; // Fire and forget - await SetWebhookData(webhookId, webhookToken); + _webhookData = await GetWebhookData(webhookId, webhookToken); } - private async Task SetWebhookData(string id, string token) + private async Task GetWebhookData(string id, string token) { var response = await _httpClient.GetAsync($"https://discord.com/api/v10/webhooks/{id}/{token}"); @@ -342,10 +376,10 @@ private async Task SetWebhookData(string id, string token) { _sawmill.Log(LogLevel.Error, $"Discord returned bad status code when trying to get webhook data (perhaps the webhook URL is invalid?): {response.StatusCode}\nResponse: {content}"); - return; + return null; } - _webhookData = JsonSerializer.Deserialize(content); + return JsonSerializer.Deserialize(content); } private void OnFooterIconChanged(string url) @@ -358,14 +392,14 @@ private void OnAvatarChanged(string url) _avatarUrl = url; } - private async void ProcessQueue(NetUserId userId, Queue messages) + private async void ProcessQueue(NetUserId userId, Queue messages) { // Whether an embed already exists for this player var exists = _relayMessages.TryGetValue(userId, out var existingEmbed); // Whether the message will become too long after adding these new messages - var tooLong = exists && messages.Sum(msg => Math.Min(msg.Length, MessageLengthCap) + "\n".Length) - + existingEmbed.description.Length > DescriptionMax; + var tooLong = exists && messages.Sum(msg => Math.Min(msg.Message.Length, MessageLengthCap) + "\n".Length) + + existingEmbed?.Description.Length > DescriptionMax; // If there is no existing embed, or it is getting too long, we create a new embed if (!exists || tooLong) @@ -385,10 +419,10 @@ private async void ProcessQueue(NetUserId userId, Queue messages) // If we have all the data required, we can link to the embed of the previous round or embed that was too long if (_webhookData is { GuildId: { } guildId, ChannelId: { } channelId }) { - if (tooLong && existingEmbed.id != null) + if (tooLong && existingEmbed?.Id != null) { linkToPrevious = - $"**[Go to previous embed of this round](https://discord.com/channels/{guildId}/{channelId}/{existingEmbed.id})**\n"; + $"**[Go to previous embed of this round](https://discord.com/channels/{guildId}/{channelId}/{existingEmbed.Id})**\n"; } else if (_oldMessageIds.TryGetValue(userId, out var id) && !string.IsNullOrEmpty(id)) { @@ -398,13 +432,22 @@ private async void ProcessQueue(NetUserId userId, Queue messages) } var characterName = _minds.GetCharacterName(userId); - existingEmbed = (null, lookup.Username, linkToPrevious, characterName, _gameTicker.RunLevel); + existingEmbed = new DiscordRelayInteraction() + { + Id = null, + CharacterName = characterName, + Description = linkToPrevious, + Username = lookup.Username, + LastRunLevel = _gameTicker.RunLevel, + }; + + _relayMessages[userId] = existingEmbed; } // Previous message was in another RunLevel, so show that in the embed - if (existingEmbed.lastRunLevel != _gameTicker.RunLevel) + if (existingEmbed!.LastRunLevel != _gameTicker.RunLevel) { - existingEmbed.description += _gameTicker.RunLevel switch + existingEmbed.Description += _gameTicker.RunLevel switch { GameRunLevel.PreRoundLobby => "\n\n:arrow_forward: _**Pre-round lobby started**_\n", GameRunLevel.InRound => "\n\n:arrow_forward: _**Round started**_\n", @@ -413,26 +456,35 @@ private async void ProcessQueue(NetUserId userId, Queue messages) $"{_gameTicker.RunLevel} was not matched."), }; - existingEmbed.lastRunLevel = _gameTicker.RunLevel; + existingEmbed.LastRunLevel = _gameTicker.RunLevel; } + // If last message of the new batch is SOS then relay it to on-call. + // ... as long as it hasn't been relayed already. + var discordMention = messages.Last(); + var onCallRelay = !discordMention.Receivers && !existingEmbed.OnCall; + // Add available messages to the embed description while (messages.TryDequeue(out var message)) { + string text; + // In case someone thinks they're funny - if (message.Length > MessageLengthCap) - message = message[..(MessageLengthCap - TooLongText.Length)] + TooLongText; + if (message.Message.Length > MessageLengthCap) + text = message.Message[..(MessageLengthCap - TooLongText.Length)] + TooLongText; + else + text = message.Message; - existingEmbed.description += $"\n{message}"; + existingEmbed.Description += $"\n{text}"; } - var payload = GeneratePayload(existingEmbed.description, - existingEmbed.username, - existingEmbed.characterName); + var payload = GeneratePayload(existingEmbed.Description, + existingEmbed.Username, + existingEmbed.CharacterName); // If there is no existing embed, create a new one // Otherwise patch (edit) it - if (existingEmbed.id == null) + if (existingEmbed.Id == null) { var request = await _httpClient.PostAsync($"{_webhookUrl}?wait=true", new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json")); @@ -455,11 +507,11 @@ private async void ProcessQueue(NetUserId userId, Queue messages) return; } - existingEmbed.id = id.ToString(); + existingEmbed.Id = id.ToString(); } else { - var request = await _httpClient.PatchAsync($"{_webhookUrl}/messages/{existingEmbed.id}", + var request = await _httpClient.PatchAsync($"{_webhookUrl}/messages/{existingEmbed.Id}", new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json")); if (!request.IsSuccessStatusCode) @@ -474,6 +526,43 @@ private async void ProcessQueue(NetUserId userId, Queue messages) _relayMessages[userId] = existingEmbed; + // Actually do the on call relay last, we just need to grab it before we dequeue every message above. + if (onCallRelay && + _onCallData != null) + { + existingEmbed.OnCall = true; + var roleMention = _config.GetCVar(CCVars.DiscordAhelpMention); + + if (!string.IsNullOrEmpty(roleMention)) + { + var message = new StringBuilder(); + message.AppendLine($"<@&{roleMention}>"); + message.AppendLine("Unanswered SOS"); + + // Need webhook data to get the correct link for that channel rather than on-call data. + if (_webhookData is { GuildId: { } guildId, ChannelId: { } channelId }) + { + message.AppendLine( + $"**[Go to ahelp](https://discord.com/channels/{guildId}/{channelId}/{existingEmbed.Id})**"); + } + + payload = GeneratePayload(message.ToString(), existingEmbed.Username, existingEmbed.CharacterName); + + var request = await _httpClient.PostAsync($"{_onCallUrl}?wait=true", + new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json")); + + var content = await request.Content.ReadAsStringAsync(); + if (!request.IsSuccessStatusCode) + { + _sawmill.Log(LogLevel.Error, $"Discord returned bad status code when posting relay message (perhaps the message is too long?): {request.StatusCode}\nResponse: {content}"); + } + } + } + else + { + existingEmbed.OnCall = false; + } + _processingChannels.Remove(userId); } @@ -652,7 +741,7 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes if (sendsWebhook) { if (!_messageQueues.ContainsKey(msg.UserId)) - _messageQueues[msg.UserId] = new Queue(); + _messageQueues[msg.UserId] = new Queue(); var str = message.Text; var unameLength = senderSession.Name.Length; @@ -701,7 +790,7 @@ private IList GetTargetAdmins() .ToList(); } - private static string GenerateAHelpMessage(AHelpMessageParams parameters) + private static DiscordRelayedData GenerateAHelpMessage(AHelpMessageParams parameters) { var stringbuilder = new StringBuilder(); @@ -718,13 +807,57 @@ private static string GenerateAHelpMessage(AHelpMessageParams parameters) stringbuilder.Append($" **{parameters.RoundTime}**"); if (!parameters.PlayedSound) stringbuilder.Append(" **(S)**"); - if (parameters.Icon == null) stringbuilder.Append($" **{parameters.Username}:** "); else stringbuilder.Append($" **{parameters.Username}** "); stringbuilder.Append(parameters.Message); - return stringbuilder.ToString(); + + return new DiscordRelayedData() + { + Receivers = !parameters.NoReceivers, + Message = stringbuilder.ToString(), + }; + } + + private record struct DiscordRelayedData + { + /// + /// Was anyone online to receive it. + /// + public bool Receivers; + + /// + /// What's the payload to send to discord. + /// + public string Message; + } + + /// + /// Class specifically for holding information regarding existing Discord embeds + /// + private sealed class DiscordRelayInteraction + { + public string? Id; + + public string Username = String.Empty; + + public string? CharacterName; + + /// + /// Contents for the discord message. + /// + public string Description = string.Empty; + + /// + /// Run level of the last interaction. If different we'll link to the last Id. + /// + public GameRunLevel LastRunLevel; + + /// + /// Did we relay this interaction to OnCall previously. + /// + public bool OnCall; } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 81a0668bdb6..83068b5262b 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -461,6 +461,18 @@ public static readonly CVarDef * Discord */ + /// + /// The role that will get mentioned if a new SOS ahelp comes in. + /// + public static readonly CVarDef DiscordAhelpMention = + CVarDef.Create("discord.on_call_ping", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + + /// + /// URL of the discord webhook to relay unanswered ahelp messages. + /// + public static readonly CVarDef DiscordOnCallWebhook = + CVarDef.Create("discord.on_call_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); + /// /// URL of the Discord webhook which will relay all ahelp messages. /// From 51b8101dc214e042e489a0dae89d39944d73560b Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 09:30:23 +0000 Subject: [PATCH 037/130] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 4bb373ca1dd..fabaee2c2c6 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -575,5 +575,13 @@ Entries: id: 71 time: '2024-10-31T14:53:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32601 +- author: metalgearsloth + changes: + - message: Added on-call functionality for discord relay to get notified on unanswered + ahelps. + type: Add + id: 72 + time: '2024-11-02T09:29:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30443 Name: Admin Order: 1 From 05ae40400c134f3e871a8af398b9f1be06dbbe31 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Sat, 2 Nov 2024 21:51:44 +1200 Subject: [PATCH 038/130] Pills are explosion resistant (partially reverts #15851) (#32458) * idk how to revert a pr so I just deleted some lines * pill destructible with explosion resistance * comment for explosion resist * "and" to "but" --------- Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> --- .../Entities/Objects/Specific/chemistry.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index b717255d8f0..527b0ba5e62 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -541,12 +541,8 @@ solutions: food: maxVol: 20 - - type: SolutionSpiker - sourceSolution: food - - type: Extractable - grindableSolutionName: food - - type: StaticPrice - price: 0 + - type: ExplosionResistance + damageCoefficient: 0.025 # survives conventional explosives but not minibombs and nukes - type: Damageable damageContainer: Inorganic - type: Destructible @@ -559,6 +555,12 @@ solution: food - !type:DoActsBehavior acts: [ "Destruction" ] + - type: SolutionSpiker + sourceSolution: food + - type: Extractable + grindableSolutionName: food + - type: StaticPrice + price: 0 - type: Tag tags: - Pill From 7276fff9c10d3a83d8a807aa1f27fe14620e8929 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 09:52:51 +0000 Subject: [PATCH 039/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f4a320dcb55..b0b452a5ecf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: shampunj - changes: - - message: Rat king can now wideswing - type: Tweak - id: 7078 - time: '2024-08-10T12:47:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30808 - author: BackeTako changes: - message: Added a suitskirt for the psychologist @@ -3951,3 +3944,10 @@ id: 7577 time: '2024-11-02T01:33:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28856 +- author: K-Dynamic + changes: + - message: Pills are explosion resistant. + type: Tweak + id: 7578 + time: '2024-11-02T09:51:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32458 From b000a3e3876f27b0e761ef36e06de622d4c790d2 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Sat, 2 Nov 2024 21:53:18 +1200 Subject: [PATCH 040/130] Hasten handcraft gauze recipe & decrease techfab gauze cost (#32744) * med lathe gauze price reduction * gauze craft doafter time * 3 second doafter craft --- .../Prototypes/Recipes/Crafting/Graphs/improvised/gauze.yml | 2 +- Resources/Prototypes/Recipes/Lathes/medical.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/gauze.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/gauze.yml index ea21a564480..bb36f36d697 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/gauze.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/gauze.yml @@ -8,6 +8,6 @@ steps: - material: Cloth amount: 2 - doAfter: 10 + doAfter: 3 - node: gauze entity: Gauze1 diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index c414bfad525..b2c70b41ee9 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -75,7 +75,7 @@ result: Gauze1 completetime: 1 materials: - Cloth: 200 + Cloth: 100 # lathe more efficient than handcrafting - type: latheRecipe id: HandheldHealthAnalyzer From fcbf5152035000e87284be9e1279f8626d0e9c30 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 09:54:25 +0000 Subject: [PATCH 041/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b0b452a5ecf..fb6ea528d5f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: BackeTako - changes: - - message: Added a suitskirt for the psychologist - type: Add - id: 7079 - time: '2024-08-10T12:51:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30709 - author: Unkn0wnGh0st333 changes: - message: ERT Chaplain starting gear was fixed and will no longer give the ERT @@ -3951,3 +3944,12 @@ id: 7578 time: '2024-11-02T09:51:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32458 +- author: K-Dynamic + changes: + - message: Handcrafted gauze now takes 3 seconds instead of 10 seconds of crafting + type: Tweak + - message: Medical techfab gauze recipe now takes 1 cloth instead of 2 + type: Tweak + id: 7579 + time: '2024-11-02T09:53:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32744 From 1c2fd6a11b6de65549a2278468e6ab90859b982f Mon Sep 17 00:00:00 2001 From: Ubaser <134914314+UbaserB@users.noreply.github.com> Date: Sat, 2 Nov 2024 21:07:51 +1100 Subject: [PATCH 042/130] Service workers antagonist fix. (#31359) * add * Revert "add" This reverts commit 25da34b0fead5812fe5800c9bf5dd7b10ef48d7d. * antagonism allowed:tm: --- Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml index e883f4cc669..427d9b8192f 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml @@ -1,4 +1,4 @@ -- type: job +- type: job id: ServiceWorker name: job-name-serviceworker description: job-description-serviceworker @@ -6,7 +6,6 @@ startingGear: ServiceWorkerGear icon: "JobIconServiceWorker" supervisors: job-supervisors-service - canBeAntag: false access: - Service - Maintenance From 2a6314bf90ade6c6e9c5323d1696bf6e62ee431a Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 10:08:58 +0000 Subject: [PATCH 043/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb6ea528d5f..351ab9d62ed 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Unkn0wnGh0st333 - changes: - - message: ERT Chaplain starting gear was fixed and will no longer give the ERT - Engineer gear - type: Fix - id: 7080 - time: '2024-08-10T12:55:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30855 - author: Ubaser changes: - message: Light tube structures now have new sprites. @@ -3953,3 +3945,10 @@ id: 7579 time: '2024-11-02T09:53:19.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32744 +- author: Ubaser + changes: + - message: Service workers can now be antagonists. + type: Fix + id: 7580 + time: '2024-11-02T10:07:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31359 From 4f683155843bff54c03d0e5154f38e0744548c59 Mon Sep 17 00:00:00 2001 From: AftrLite <61218133+AftrLite@users.noreply.github.com> Date: Sun, 3 Nov 2024 02:19:33 +1300 Subject: [PATCH 044/130] Adds a new AME sound effect! (#33097) * Changes the AME sound effect to not be the default MetalThud. * Was told on discord to make a minor change to autorerun the tests due to the Build & Test Debug failing! * Attribution and licensing, as requsted by deathride58 * Fixes the high-pitched squeak audible to some people! * Audio file tweaked by SlamBamActionMan to eliminate a weird squeak they were still able to hear. Thanks! --- .../Ame/Components/AmeControllerComponent.cs | 2 +- Resources/Audio/Machines/ame_fuelinjection.ogg | Bin 0 -> 29727 bytes Resources/Audio/Machines/attributions.yml | 5 +++++ 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Resources/Audio/Machines/ame_fuelinjection.ogg diff --git a/Content.Server/Ame/Components/AmeControllerComponent.cs b/Content.Server/Ame/Components/AmeControllerComponent.cs index fae3d86633d..2c5464dd8e0 100644 --- a/Content.Server/Ame/Components/AmeControllerComponent.cs +++ b/Content.Server/Ame/Components/AmeControllerComponent.cs @@ -55,7 +55,7 @@ public sealed partial class AmeControllerComponent : SharedAmeControllerComponen /// [DataField("injectSound")] [ViewVariables(VVAccess.ReadWrite)] - public SoundSpecifier InjectSound = new SoundCollectionSpecifier("MetalThud"); + public SoundSpecifier InjectSound = new SoundPathSpecifier("/Audio/Machines/ame_fuelinjection.ogg"); /// /// The last time this could have injected fuel into the AME. diff --git a/Resources/Audio/Machines/ame_fuelinjection.ogg b/Resources/Audio/Machines/ame_fuelinjection.ogg new file mode 100644 index 0000000000000000000000000000000000000000..30c9175ee97733b81ce14e9ac55964c67b0dd3c3 GIT binary patch literal 29727 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 Date: Sat, 2 Nov 2024 13:20:40 +0000 Subject: [PATCH 045/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 351ab9d62ed..728cdd9c03b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Light tube structures now have new sprites. - type: Tweak - id: 7081 - time: '2024-08-10T15:00:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29091 - author: lzk228 changes: - message: Standartized some clothing recipes. @@ -3952,3 +3945,10 @@ id: 7580 time: '2024-11-02T10:07:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31359 +- author: AftrLite + changes: + - message: The AME now has a new sound effect for fuel injection! + type: Add + id: 7581 + time: '2024-11-02T13:19:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33097 From 9520e829de3511ebd0e3304fb8d03ab0440db7dd Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Sat, 2 Nov 2024 15:21:10 +0200 Subject: [PATCH 046/130] Allow for the ai's laws to be changed from its core and eye (#32461) * Allow for the ai's laws to be changed from its core and eye * Address reviews --- .../Administration/Systems/AdminVerbSystem.cs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index 2ab27e4388e..0640537f57e 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -35,8 +35,10 @@ using Robust.Shared.Utility; using System.Linq; using Content.Server.Silicons.Laws; +using Content.Shared.Movement.Components; using Content.Shared.Silicons.Laws.Components; using Robust.Server.Player; +using Content.Shared.Silicons.StationAi; using Robust.Shared.Physics.Components; using static Content.Shared.Configurable.ConfigurationComponent; @@ -345,7 +347,30 @@ private void AddAdminVerbs(GetVerbsEvent args) Impact = LogImpact.Low }); - if (TryComp(args.Target, out var lawBoundComponent)) + // This logic is needed to be able to modify the AI's laws through its core and eye. + EntityUid? target = null; + SiliconLawBoundComponent? lawBoundComponent = null; + + if (TryComp(args.Target, out lawBoundComponent)) + { + target = args.Target; + } + // When inspecting the core we can find the entity with its laws by looking at the AiHolderComponent. + else if (TryComp(args.Target, out var holder) && holder.Slot.Item != null + && TryComp(holder.Slot.Item, out lawBoundComponent)) + { + target = holder.Slot.Item.Value; + // For the eye we can find the entity with its laws as the source of the movement relay since the eye + // is just a proxy for it to move around and look around the station. + } + else if (TryComp(args.Target, out var relay) + && TryComp(relay.Source, out lawBoundComponent)) + { + target = relay.Source; + + } + + if (lawBoundComponent != null && target != null) { args.Verbs.Add(new Verb() { @@ -359,7 +384,7 @@ private void AddAdminVerbs(GetVerbsEvent args) return; } _euiManager.OpenEui(ui, session); - ui.UpdateLaws(lawBoundComponent, args.Target); + ui.UpdateLaws(lawBoundComponent, target.Value); }, Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/Interface/Actions/actions_borg.rsi"), "state-laws"), }); From 131e492e6f99ab40f7c4b7c0502c039f93084e66 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 13:22:16 +0000 Subject: [PATCH 047/130] Automatic changelog update --- Resources/Changelog/Admin.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index fabaee2c2c6..56c82c23a43 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -583,5 +583,12 @@ Entries: id: 72 time: '2024-11-02T09:29:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/30443 +- author: nikthechampiongr + changes: + - message: It is now possible to edit the AI's laws through its core and eye. + type: Fix + id: 73 + time: '2024-11-02T13:21:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32461 Name: Admin Order: 1 From 11f0dc420f0a17e721dc29cd993132f13a24537f Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 2 Nov 2024 13:24:08 +0000 Subject: [PATCH 048/130] clean up tools lathe recipes (#31521) * clean up tools lathe recipes * add medical and cooking tools * add result * add result to others * review * engine --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Prototypes/Recipes/Lathes/botany.yml | 38 +++--- .../Prototypes/Recipes/Lathes/cooking.yml | 52 ++++---- .../Prototypes/Recipes/Lathes/medical.yml | 80 ++++-------- Resources/Prototypes/Recipes/Lathes/tools.yml | 118 +++++++----------- 4 files changed, 118 insertions(+), 170 deletions(-) diff --git a/Resources/Prototypes/Recipes/Lathes/botany.yml b/Resources/Prototypes/Recipes/Lathes/botany.yml index 010beb491ac..ae5a444ed8c 100644 --- a/Resources/Prototypes/Recipes/Lathes/botany.yml +++ b/Resources/Prototypes/Recipes/Lathes/botany.yml @@ -1,39 +1,39 @@ +# Base prototypes + - type: latheRecipe - id: MiniHoe - result: HydroponicsToolMiniHoe - completetime: 2 + abstract: true + parent: BaseToolRecipe + id: BaseHydroToolRecipe materials: Steel: 200 Plastic: 100 +# Recipes + +- type: latheRecipe + parent: BaseHydroToolRecipe + id: HydroponicsToolMiniHoe + result: HydroponicsToolMiniHoe + - type: latheRecipe + parent: BaseHydroToolRecipe id: HydroponicsToolScythe result: HydroponicsToolScythe - completetime: 2 materials: Steel: 300 Plastic: 200 - type: latheRecipe + parent: BaseHydroToolRecipe id: HydroponicsToolHatchet result: HydroponicsToolHatchet - completetime: 2 - materials: - Steel: 200 - Plastic: 100 - type: latheRecipe - id: Spade + parent: BaseHydroToolRecipe + id: HydroponicsToolSpade result: HydroponicsToolSpade - completetime: 2 - materials: - Steel: 200 - Plastic: 100 - + - type: latheRecipe - id: Clippers + parent: BaseHydroToolRecipe + id: HydroponicsToolClippers result: HydroponicsToolClippers - completetime: 2 - materials: - Steel: 200 - Plastic: 100 diff --git a/Resources/Prototypes/Recipes/Lathes/cooking.yml b/Resources/Prototypes/Recipes/Lathes/cooking.yml index c28a9370158..333279a8201 100644 --- a/Resources/Prototypes/Recipes/Lathes/cooking.yml +++ b/Resources/Prototypes/Recipes/Lathes/cooking.yml @@ -1,67 +1,65 @@ - type: latheRecipe + parent: BaseToolRecipe id: ButchCleaver result: ButchCleaver - completetime: 2 materials: Steel: 300 Plastic: 50 - type: latheRecipe + parent: BaseToolRecipe id: KitchenKnife result: KitchenKnife - completetime: 2 materials: Steel: 200 Plastic: 50 - type: latheRecipe - id: DrinkMug - result: DrinkMug + abstract: true + id: BaseGlasswareRecipe completetime: 0.8 materials: Glass: 100 - type: latheRecipe + parent: BaseGlasswareRecipe + id: DrinkMug + result: DrinkMug + +- type: latheRecipe + parent: DrinkMug id: DrinkMugMetal result: DrinkMugMetal - completetime: 0.8 materials: Steel: 100 - type: latheRecipe + parent: DrinkMug id: DrinkGlass result: DrinkGlass - completetime: 0.8 - materials: - Glass: 100 - type: latheRecipe + parent: DrinkMug id: DrinkShotGlass result: DrinkShotGlass completetime: 0.4 - materials: - Glass: 100 - type: latheRecipe + parent: DrinkMug id: DrinkGlassCoupeShaped result: DrinkGlassCoupeShaped - completetime: 0.8 - materials: - Glass: 100 -- type: latheRecipe - id: CustomDrinkJug - result: CustomDrinkJug - completetime: 2 - materials: +- type: latheRecipe + id: CustomDrinkJug + result: CustomDrinkJug + completetime: 2 + materials: Plastic: 200 - + - type: latheRecipe + parent: BaseGlasswareRecipe id: FoodPlate result: FoodPlate - completetime: 0.8 - materials: - Glass: 100 - type: latheRecipe id: FoodPlateSmall @@ -71,25 +69,23 @@ Glass: 50 - type: latheRecipe + parent: FoodPlate id: FoodPlatePlastic result: FoodPlatePlastic - completetime: 0.8 materials: Plastic: 100 - type: latheRecipe + parent: FoodPlateSmall id: FoodPlateSmallPlastic result: FoodPlateSmallPlastic - completetime: 0.4 materials: Plastic: 50 - type: latheRecipe + parent: FoodPlate id: FoodBowlBig result: FoodBowlBig - completetime: 0.8 - materials: - Glass: 100 - type: latheRecipe id: FoodPlateTin @@ -99,9 +95,9 @@ Steel: 100 - type: latheRecipe + parent: FoodPlateTin id: FoodPlateMuffinTin result: FoodPlateMuffinTin - completetime: 0.4 materials: Steel: 50 diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index b2c70b41ee9..08250290ec7 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -1,51 +1,46 @@ +# Base prototypes + - type: latheRecipe - id: Scalpel - result: Scalpel - category: Tools - completetime: 2 + abstract: true + parent: BaseToolRecipe + id: BaseSurgicalRecipe materials: Steel: 200 +# Recipes + - type: latheRecipe + parent: BaseSurgicalRecipe + id: Scalpel + result: Scalpel + +- type: latheRecipe + parent: BaseSurgicalRecipe id: Retractor result: Retractor - category: Tools - completetime: 2 - materials: - Steel: 200 - type: latheRecipe + parent: BaseSurgicalRecipe id: Cautery result: Cautery - category: Tools - completetime: 2 - materials: - Steel: 200 - type: latheRecipe + parent: BaseToolRecipe id: Drill result: Drill - category: Tools - completetime: 2 materials: Steel: 200 Plastic: 100 - type: latheRecipe + parent: BaseSurgicalRecipe id: Saw result: Saw - category: Tools - completetime: 2 - materials: - Steel: 200 - type: latheRecipe + parent: BaseSurgicalRecipe id: Hemostat result: Hemostat - category: Tools - completetime: 2 - materials: - Steel: 200 - type: latheRecipe id: BodyBag @@ -140,66 +135,51 @@ Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitBurn result: MedkitBurn name: lathe-recipe-MedkitBurn-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitToxin result: MedkitToxin name: lathe-recipe-MedkitToxin-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitO2 result: MedkitO2 name: lathe-recipe-MedkitO2-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitBrute result: MedkitBrute name: lathe-recipe-MedkitBrute-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitAdvanced result: MedkitAdvanced name: lathe-recipe-MedkitAdvanced-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitRadiation result: MedkitRadiation name: lathe-recipe-MedkitRadiation-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: Medkit id: MedkitCombat result: MedkitCombat name: lathe-recipe-MedkitCombat-name - completetime: 2 - materials: - Plastic: 300 - type: latheRecipe + parent: BaseToolRecipe id: HandLabeler result: HandLabeler - category: Tools - completetime: 2 materials: Plastic: 100 @@ -219,20 +199,14 @@ Plastic: 300 - type: latheRecipe + parent: RollerBedSpawnFolded id: CheapRollerBedSpawnFolded result: CheapRollerBedSpawnFolded - completetime: 1 - materials: - Steel: 600 - Plastic: 300 - type: latheRecipe + parent: RollerBedSpawnFolded id: EmergencyRollerBedSpawnFolded result: EmergencyRollerBedSpawnFolded - completetime: 1 - materials: - Steel: 600 - Plastic: 300 - type: latheRecipe id: WhiteCane diff --git a/Resources/Prototypes/Recipes/Lathes/tools.yml b/Resources/Prototypes/Recipes/Lathes/tools.yml index 3f5003d909b..fc35153317e 100644 --- a/Resources/Prototypes/Recipes/Lathes/tools.yml +++ b/Resources/Prototypes/Recipes/Lathes/tools.yml @@ -1,9 +1,8 @@ +# Base prototypes + - type: latheRecipe - id: Wirecutter - icon: - sprite: Objects/Tools/wirecutters.rsi - state: cutters-map - result: Wirecutter + abstract: true + id: BaseToolRecipe category: Tools completetime: 2 materials: @@ -11,30 +10,42 @@ Plastic: 50 - type: latheRecipe + abstract: true + parent: BaseToolRecipe + id: BaseBigToolRecipe + materials: + Steel: 800 + Glass: 300 + +# Recipes + +- type: latheRecipe + parent: BaseToolRecipe + id: Wirecutter + result: Wirecutter + icon: + sprite: Objects/Tools/wirecutters.rsi + state: cutters-map + +- type: latheRecipe + parent: BaseToolRecipe id: Screwdriver + result: Screwdriver icon: sprite: Objects/Tools/screwdriver.rsi state: screwdriver-map - result: Screwdriver - category: Tools - completetime: 2 - materials: - Steel: 200 - Plastic: 50 - type: latheRecipe + parent: BaseToolRecipe id: Welder result: Welder - category: Tools - completetime: 2 materials: Steel: 400 - type: latheRecipe + parent: BaseToolRecipe id: Wrench result: Wrench - category: Tools - completetime: 2 materials: Steel: 200 @@ -42,155 +53,122 @@ id: CableStack result: CableApcStack1 category: Parts - completetime: 2 + completetime: 0.1 materials: Steel: 30 - type: latheRecipe + parent: CableStack id: CableMVStack result: CableMVStack1 - category: Parts - completetime: 2 - materials: - Steel: 30 - type: latheRecipe + parent: CableStack id: CableHVStack result: CableHVStack1 - category: Parts - completetime: 2 - materials: - Steel: 30 - type: latheRecipe + parent: BaseToolRecipe id: CrowbarGreen result: CrowbarGreen - category: Tools - completetime: 2 materials: Steel: 200 - type: latheRecipe + parent: BaseToolRecipe id: Pickaxe result: Pickaxe - category: Tools completetime: 4 materials: Steel: 1000 Wood: 500 - type: latheRecipe + parent: BaseToolRecipe id: Shovel result: Shovel - category: Tools - completetime: 2 materials: Steel: 200 Wood: 100 - type: latheRecipe + parent: BaseToolRecipe id: Multitool result: Multitool - category: Tools - completetime: 2 materials: Steel: 200 Plastic: 200 - type: latheRecipe + parent: Multitool id: NetworkConfigurator result: NetworkConfigurator - category: Tools - completetime: 2 - materials: - Steel: 200 - Plastic: 200 - type: latheRecipe + parent: BaseToolRecipe id: PowerDrill result: PowerDrill - category: Tools - completetime: 2 materials: Steel: 600 Plastic: 200 - type: latheRecipe + parent: BaseToolRecipe id: RCD result: RCDEmpty - category: Tools completetime: 4 materials: Steel: 1000 Plastic: 300 - type: latheRecipe + parent: BaseToolRecipe id: RCDAmmo result: RCDAmmo - category: Tools - completetime: 2.4 materials: Steel: 500 Plastic: 250 - type: latheRecipe + parent: BaseBigToolRecipe id: HandHeldMassScanner result: HandHeldMassScannerEmpty - category: Tools - completetime: 2 - materials: - Steel: 800 - Glass: 300 - type: latheRecipe + parent: BaseBigToolRecipe id: HandheldGPSBasic result: HandheldGPSBasic - category: Tools - completetime: 2 - materials: - Steel: 800 - Glass: 300 - type: latheRecipe + parent: BaseBigToolRecipe id: TRayScanner result: trayScanner - category: Tools - completetime: 2 - materials: - Steel: 800 - Glass: 300 - type: latheRecipe + parent: BaseBigToolRecipe id: GasAnalyzer result: GasAnalyzer - category: Tools - completetime: 2 - materials: - Steel: 800 - Glass: 300 - type: latheRecipe + parent: BaseToolRecipe id: SprayPainter result: SprayPainter - category: Tools - completetime: 2 materials: Steel: 300 Plastic: 100 - type: latheRecipe + parent: BaseToolRecipe id: UtilityBelt result: ClothingBeltUtility - category: Tools - completetime: 2 materials: Cloth: 100 Steel: 50 - type: latheRecipe + parent: BaseToolRecipe id: HolofanProjector result: HolofanProjectorEmpty - category: Tools completetime: 8 materials: Steel: 300 @@ -198,18 +176,18 @@ Plastic: 50 - type: latheRecipe + parent: BaseToolRecipe id: WelderExperimental result: WelderExperimental - category: Tools completetime: 6 materials: Steel: 800 Plasma: 200 - type: latheRecipe + parent: BaseToolRecipe id: JawsOfLife result: JawsOfLife - category: Tools completetime: 6 materials: Steel: 1000 @@ -218,9 +196,9 @@ Gold: 50 - type: latheRecipe + parent: BaseToolRecipe id: HoloprojectorField result: HoloprojectorFieldEmpty - category: Tools completetime: 3 materials: Steel: 500 @@ -228,9 +206,9 @@ Glass: 100 - type: latheRecipe + parent: BaseToolRecipe id: WeaponParticleDecelerator result: WeaponParticleDecelerator - category: Tools completetime: 6 materials: Steel: 750 From 7614c2fba754e63989bb25564a265e84118170e3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 13:25:14 +0000 Subject: [PATCH 049/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 728cdd9c03b..bbe3437142e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: lzk228 - changes: - - message: Standartized some clothing recipes. - type: Tweak - id: 7082 - time: '2024-08-10T18:16:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29315 - author: TheShuEd changes: - message: You cat cut burger bun into two halfs, and make custom burgers now! @@ -3952,3 +3945,10 @@ id: 7581 time: '2024-11-02T13:19:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33097 +- author: deltanedas + changes: + - message: Printing cables in an autolathe is now 20 times faster. + type: Tweak + id: 7582 + time: '2024-11-02T13:24:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31521 From e7ca4b8f2f603ccabab547d6fa5c771373a7439d Mon Sep 17 00:00:00 2001 From: Centronias Date: Sat, 2 Nov 2024 08:04:22 -0700 Subject: [PATCH 050/130] Intercoms and Radios both pick up proximate speech (#32737) * Deduping of recent messages should consider the channel it's being sent to * rerun actions --- .../Radio/EntitySystems/RadioDeviceSystem.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index c8867744a40..3829fc34d20 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -30,7 +30,7 @@ public sealed class RadioDeviceSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; // Used to prevent a shitter from using a bunch of radios to spam chat. - private HashSet<(string, EntityUid)> _recentlySent = new(); + private HashSet<(string, EntityUid, RadioChannelPrototype)> _recentlySent = new(); public override void Initialize() { @@ -114,7 +114,7 @@ private void OnPowerChanged(EntityUid uid, RadioMicrophoneComponent component, r { if (args.Powered) return; - SetMicrophoneEnabled(uid, null, false, true, component); + SetMicrophoneEnabled(uid, null, false, true, component); } public void SetMicrophoneEnabled(EntityUid uid, EntityUid? user, bool enabled, bool quiet = false, RadioMicrophoneComponent? component = null) @@ -191,8 +191,9 @@ private void OnListen(EntityUid uid, RadioMicrophoneComponent component, ListenE if (HasComp(args.Source)) return; // no feedback loops please. - if (_recentlySent.Add((args.Message, args.Source))) - _radio.SendRadioMessage(args.Source, args.Message, _protoMan.Index(component.BroadcastChannel), uid); + var channel = _protoMan.Index(component.BroadcastChannel)!; + if (_recentlySent.Add((args.Message, args.Source, channel))) + _radio.SendRadioMessage(args.Source, args.Message, channel, uid); } private void OnAttemptListen(EntityUid uid, RadioMicrophoneComponent component, ListenAttemptEvent args) @@ -279,7 +280,7 @@ private void SetIntercomChannel(Entity ent, ProtoId(ent, out var mic)) mic.BroadcastChannel = channel; if (TryComp(ent, out var speaker)) - speaker.Channels = new(){ channel }; + speaker.Channels = new() { channel }; Dirty(ent); } } From db4b2e0a6f0c7c398d7f90d5e462224d2bcd6c79 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 15:05:28 +0000 Subject: [PATCH 051/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bbe3437142e..040c7228181 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: You cat cut burger bun into two halfs, and make custom burgers now! - type: Add - id: 7083 - time: '2024-08-10T19:31:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30755 - author: thetolbean changes: - message: Updated Core's boxing ring beacon label to be correct @@ -3952,3 +3945,11 @@ id: 7582 time: '2024-11-02T13:24:08.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31521 +- author: Centronias + changes: + - message: Fixed a bug where attempting to speak into a handheld radio and an intercom + simultaneously would lead to only one device transmitting the message. + type: Fix + id: 7583 + time: '2024-11-02T15:04:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32737 From 8c1281adf7cb42134635a3aa32cd4db23b03306d Mon Sep 17 00:00:00 2001 From: joshepvodka <86210200+joshepvodka@users.noreply.github.com> Date: Sat, 2 Nov 2024 12:12:25 -0300 Subject: [PATCH 052/130] Adds headphones to loadouts (#33067) added headphones to trinkets --- .../Loadouts/Miscellaneous/trinkets.yml | 45 +++++++++++-------- .../Prototypes/Loadouts/loadout_groups.yml | 1 + 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml index 78b5f0bc9ea..79fee8bf0df 100644 --- a/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml +++ b/Resources/Prototypes/Loadouts/Miscellaneous/trinkets.yml @@ -21,6 +21,13 @@ back: - ClothingHeadHatHairflower +# Headphones +- type: loadout + id: Headphones + storage: + back: + - ClothingNeckHeadphones + # Plushies - type: loadout id: PlushieLizard @@ -165,7 +172,7 @@ !type:OverallPlaytimeRequirement time: 36000 # 10hr storage: - back: + back: - TowelColorWhite - type: loadout @@ -176,9 +183,9 @@ !type:OverallPlaytimeRequirement time: 1800000 # 500hr storage: - back: + back: - TowelColorSilver - + - type: loadout id: TowelColorGold effects: @@ -187,7 +194,7 @@ !type:OverallPlaytimeRequirement time: 3600000 # 1000hr storage: - back: + back: - TowelColorGold - type: loadout @@ -199,7 +206,7 @@ department: Cargo time: 360000 # 100hr storage: - back: + back: - TowelColorLightBrown - type: loadout @@ -211,7 +218,7 @@ department: Civilian time: 360000 # 100hr storage: - back: + back: - TowelColorGreen - type: loadout @@ -223,7 +230,7 @@ department: Command time: 360000 # 100hr storage: - back: + back: - TowelColorDarkBlue - type: loadout @@ -235,9 +242,9 @@ department: Engineering time: 360000 # 100hr storage: - back: + back: - TowelColorOrange - + - type: loadout id: TowelColorLightBlue effects: @@ -247,7 +254,7 @@ department: Medical time: 360000 # 100hr storage: - back: + back: - TowelColorLightBlue - type: loadout @@ -259,7 +266,7 @@ department: Science time: 360000 # 100hr storage: - back: + back: - TowelColorPurple - type: loadout @@ -271,7 +278,7 @@ department: Security time: 360000 # 100hr storage: - back: + back: - TowelColorRed - type: loadout @@ -283,7 +290,7 @@ role: JobPassenger time: 360000 # 100hr storage: - back: + back: - TowelColorGray - type: loadout @@ -295,7 +302,7 @@ role: JobChaplain time: 360000 # 100hr storage: - back: + back: - TowelColorBlack - type: loadout @@ -307,7 +314,7 @@ role: JobLibrarian time: 360000 # 100hr storage: - back: + back: - TowelColorDarkGreen - type: loadout @@ -319,7 +326,7 @@ role: JobLawyer time: 360000 # 100hr storage: - back: + back: - TowelColorMaroon - type: loadout @@ -331,7 +338,7 @@ role: JobClown time: 360000 # 100hr storage: - back: + back: - TowelColorYellow - type: loadout @@ -343,5 +350,5 @@ role: JobMime time: 360000 # 100hr storage: - back: - - TowelColorMime \ No newline at end of file + back: + - TowelColorMime diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 13c675000ed..ce4866dca84 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -7,6 +7,7 @@ loadouts: - FlowerWreath - Hairflower + - Headphones - PlushieLizard - PlushieSpaceLizard - Lighter From a3ce9b0db47aa9d77624e63c424d1884261fcb15 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 2 Nov 2024 15:13:31 +0000 Subject: [PATCH 053/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 040c7228181..d82950a2867 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: thetolbean - changes: - - message: Updated Core's boxing ring beacon label to be correct - type: Tweak - id: 7084 - time: '2024-08-10T19:50:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30800 - author: Flareguy changes: - message: Added vox sprites for most of the remaining common mask items. @@ -3953,3 +3946,10 @@ id: 7583 time: '2024-11-02T15:04:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32737 +- author: joshepvodka + changes: + - message: Headphones are now selectable in loadouts. + type: Add + id: 7584 + time: '2024-11-02T15:12:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33067 From 65462d8ca590c97e24ae27d42b53ea2440519baa Mon Sep 17 00:00:00 2001 From: Scribbles0 <91828755+Scribbles0@users.noreply.github.com> Date: Sat, 2 Nov 2024 09:21:35 -0700 Subject: [PATCH 054/130] Cardboard Box Capacity 4 -> 5 (#32743) * capacity upgrade * comment update --- .../Entities/Structures/Storage/Closets/big_boxes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml index 17ccb5a41fd..a6d5a49f67a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/big_boxes.yml @@ -29,7 +29,7 @@ isCollidableWhenOpen: false openOnMove: false airtight: false - capacity: 4 #4 Entities seems like a nice comfy fit for a cardboard box. + capacity: 5 #5 entity capacity to fit all of your friends (or teammates on your nuclear operation without reinforcements). - type: ContainerContainer containers: entity_storage: !type:Container From 190d965c526c630ba391cb9e33ca9030932a2ded Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sat, 2 Nov 2024 17:49:44 +0100 Subject: [PATCH 055/130] Hotfix add debug info to traitor activation (#33119) * Add debug messages to traitor activation * more debug --- Content.Server/Antag/AntagSelectionSystem.cs | 4 +++ .../GameTicking/Rules/TraitorRuleSystem.cs | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 224629ff2e5..610c0ad182a 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -55,6 +55,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(OnTakeGhostRole); SubscribeLocalEvent(OnObjectivesTextGetInfo); @@ -360,6 +362,8 @@ public void MakeAntag(Entity ent, ICommonSession? sessi _role.MindAddRoles(curMind.Value, def.MindRoles, null, true); ent.Comp.SelectedMinds.Add((curMind.Value, Name(player))); SendBriefing(session, def.Briefing); + + Log.Debug($"Selected {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); } var afterEv = new AfterAntagEntitySelectedEvent(session, player, ent, def); diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 1987613763b..bc6a8e9395f 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -41,6 +41,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(AfterEntitySelected); SubscribeLocalEvent(OnObjectivesTextPrepend); } @@ -53,6 +55,7 @@ protected override void Added(EntityUid uid, TraitorRuleComponent component, Gam private void AfterEntitySelected(Entity ent, ref AfterAntagEntitySelectedEvent args) { + Log.Debug($"AfterAntagEntitySelected {ToPrettyString(ent)}"); MakeTraitor(args.EntityUid, ent); } @@ -78,14 +81,22 @@ public string[] GenerateTraitorCodewords(TraitorRuleComponent component) public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - start"); + //Grab the mind if it wasn't provided if (!_mindSystem.TryGetMind(traitor, out var mindId, out var mind)) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - failed, no Mind found"); return false; + } var briefing = ""; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - added codewords flufftext to briefing"); briefing = Loc.GetString("traitor-role-codewords-short", ("codewords", string.Join(", ", component.Codewords))); + } var issuer = _random.Pick(_prototypeManager.Index(component.ObjectiveIssuers).Values); @@ -94,6 +105,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) if (component.GiveUplink) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink start"); // Calculate the amount of currency on the uplink. var startingBalance = component.StartingBalance; if (_jobs.MindTryGetJob(mindId, out var prototype)) @@ -105,18 +117,27 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } // Choose and generate an Uplink, and return the uplink code if applicable + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request start"); var uplinkParams = RequestUplink(traitor, startingBalance, briefing); code = uplinkParams.Item1; briefing = uplinkParams.Item2; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request completed"); } string[]? codewords = null; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - set codewords from component"); codewords = component.Codewords; + } if (component.GiveBriefing) + { _antag.SendBriefing(traitor, GenerateBriefing(codewords, code, issuer), null, component.GreetSoundNotification); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Sent the Briefing"); + } + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Adding TraitorMind"); component.TraitorMinds.Add(mindId); // Assign briefing @@ -126,9 +147,14 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleSystem.MindHasRole(mindId, out var traitorRole); if (traitorRole is not null) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Add traitor briefing components"); AddComp(traitorRole.Value.Owner); Comp(traitorRole.Value.Owner).Briefing = briefing; } + else + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - did not get traitor briefing"); + } // Send codewords to only the traitor client var color = TraitorCodewordColor; // Fall back to a dark red Syndicate color if a prototype is not found @@ -137,9 +163,11 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleCodewordSystem.SetRoleCodewords(codewordComp, "traitor", component.Codewords.ToList(), color); // Change the faction + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Change faction"); _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Finished"); return true; } @@ -148,10 +176,12 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) var pda = _uplink.FindUplinkTarget(traitor); Note[]? code = null; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink add"); var uplinked = _uplink.AddUplink(traitor, startingBalance, pda, true); if (pda is not null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is PDA"); // Codes are only generated if the uplink is a PDA code = EnsureComp(pda.Value).Code; @@ -163,6 +193,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } else if (pda is null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is implant"); briefing += "\n" + Loc.GetString("traitor-role-uplink-implant-short"); } From 6f1eeba1911dc3c7e96890fa2f0a3b4f07ee2d5d Mon Sep 17 00:00:00 2001 From: Milon Date: Sat, 2 Nov 2024 17:59:38 +0100 Subject: [PATCH 056/130] change ShowHealthBars and ShowHealthIcons to use protoId (#32355) use protoId --- Content.Client/Commands/ShowHealthBarsCommand.cs | 4 +++- Content.Shared/Overlays/ShowHealthBarsComponent.cs | 8 +++++--- Content.Shared/Overlays/ShowHealthIconsComponent.cs | 9 ++++++--- Resources/Prototypes/Entities/Clothing/Eyes/hud.yml | 6 ------ .../Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml | 2 -- 5 files changed, 14 insertions(+), 15 deletions(-) diff --git a/Content.Client/Commands/ShowHealthBarsCommand.cs b/Content.Client/Commands/ShowHealthBarsCommand.cs index 0811f966637..6ea9d06c8c3 100644 --- a/Content.Client/Commands/ShowHealthBarsCommand.cs +++ b/Content.Client/Commands/ShowHealthBarsCommand.cs @@ -1,6 +1,8 @@ +using Content.Shared.Damage.Prototypes; using Content.Shared.Overlays; using Robust.Client.Player; using Robust.Shared.Console; +using Robust.Shared.Prototypes; using System.Linq; namespace Content.Client.Commands; @@ -34,7 +36,7 @@ public override void Execute(IConsoleShell shell, string argStr, string[] args) { var showHealthBarsComponent = new ShowHealthBarsComponent { - DamageContainers = args.ToList(), + DamageContainers = args.Select(arg => new ProtoId(arg)).ToList(), HealthStatusIcon = null, NetSyncEnabled = false }; diff --git a/Content.Shared/Overlays/ShowHealthBarsComponent.cs b/Content.Shared/Overlays/ShowHealthBarsComponent.cs index 4642c5936a7..cb4f0fe7dd4 100644 --- a/Content.Shared/Overlays/ShowHealthBarsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthBarsComponent.cs @@ -2,7 +2,6 @@ using Content.Shared.StatusIcon; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Overlays; @@ -15,8 +14,11 @@ public sealed partial class ShowHealthBarsComponent : Component /// /// Displays health bars of the damage containers. /// - [DataField("damageContainers", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List DamageContainers = new(); + [DataField] + public List> DamageContainers = new() + { + "Biological" + }; [DataField] public ProtoId? HealthStatusIcon = "HealthIconFine"; diff --git a/Content.Shared/Overlays/ShowHealthIconsComponent.cs b/Content.Shared/Overlays/ShowHealthIconsComponent.cs index c2526c2f401..aa12c9887a8 100644 --- a/Content.Shared/Overlays/ShowHealthIconsComponent.cs +++ b/Content.Shared/Overlays/ShowHealthIconsComponent.cs @@ -1,6 +1,6 @@ using Content.Shared.Damage.Prototypes; using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; +using Robust.Shared.Prototypes; namespace Content.Shared.Overlays; @@ -13,6 +13,9 @@ public sealed partial class ShowHealthIconsComponent : Component /// /// Displays health status icons of the damage containers. /// - [DataField("damageContainers", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List DamageContainers = new(); + [DataField] + public List> DamageContainers = new() + { + "Biological" + }; } diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml index 9e881bf9c21..300c938bc90 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/hud.yml @@ -13,11 +13,7 @@ categories: [ HideSpawnMenu ] components: - type: ShowHealthBars - damageContainers: - - Biological - type: ShowHealthIcons - damageContainers: - - Biological - type: entity parent: ClothingEyesBase @@ -223,8 +219,6 @@ sprite: Clothing/Eyes/Hud/syndagent.rsi - type: ShowSyndicateIcons - type: ShowHealthBars - damageContainers: - - Biological - type: entity parent: [ClothingEyesGlassesSunglasses, ShowSecurityIcons] diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml index d1d530ae81b..6a8f1e5abb0 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/borg_chassis.yml @@ -391,8 +391,6 @@ - type: Construction node: syndicatemedical - type: ShowHealthBars - damageContainers: - - Biological - type: InteractionPopup interactSuccessString: petting-success-syndicate-cyborg interactFailureString: petting-failure-syndicate-cyborg From 0ba3350c7eb5c9c16f84dfa2d5fa6c6ba0026041 Mon Sep 17 00:00:00 2001 From: RiceMar1244 <138547931+RiceMar1244@users.noreply.github.com> Date: Sat, 2 Nov 2024 15:55:15 -0400 Subject: [PATCH 057/130] Combat and survival knife storage/inhand sprites (#33111) * Adds storage sprites for combat knife and survival knife. Replaces inhand sprites. * Fixes meta.json copyright --- .../Entities/Objects/Weapons/Melee/knife.yml | 6 +++ .../Melee/combat_knife.rsi/inhand-left.png | Bin 291 -> 352 bytes .../Melee/combat_knife.rsi/inhand-right.png | Bin 275 -> 349 bytes .../Weapons/Melee/combat_knife.rsi/meta.json | 5 +- .../Melee/combat_knife.rsi/storage.png | Bin 0 -> 335 bytes .../Melee/survival_knife.rsi/inhand-left.png | Bin 308 -> 273 bytes .../Melee/survival_knife.rsi/inhand-right.png | Bin 306 -> 272 bytes .../Melee/survival_knife.rsi/meta.json | 49 ++++++++++-------- .../Melee/survival_knife.rsi/storage.png | Bin 0 -> 307 bytes 9 files changed, 36 insertions(+), 24 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/storage.png create mode 100644 Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/storage.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index ae5b22f8e02..711b8c49feb 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -103,6 +103,9 @@ Slash: 10 - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi + storedSprite: + state: storage + sprite: Objects/Weapons/Melee/combat_knife.rsi - type: DisarmMalus malus: 0.225 @@ -117,6 +120,9 @@ state: icon - type: Item sprite: Objects/Weapons/Melee/survival_knife.rsi + storedSprite: + state: storage + sprite: Objects/Weapons/Melee/survival_knife.rsi - type: entity name: kukri knife diff --git a/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/inhand-left.png index a7ea753940826be08aaafd478d1f94b930ed18e6..e014cf5110fd9502d664134f7008fff5ed1ed201 100644 GIT binary patch delta 326 zcmV-M0lEI80^kCWBYy!WNkl82kTV2Q2DiycW{bs;a@?7B;==z|J713<&7)EP00000K+4Dan~Ql}EKeyGS?0-^ zs`0wkRE=8ZDOm{O0W9<6$|B!2rY!PgAv{Y?J`TMri(HwiQGd0yna`No+U&BfPN{Fn zt^E>v0>+_tTI*eh-_+J-zOT$-b=}$B?qoP)OwtcykiVPlx^vLRxAAS;x`z$ni1Pse z00000001B)b=$j_XgRv474{W7P_Y2+X@z~nuFpjRxTh7~BW8UbJ%Er_*vHl!mqo6| zp$`rrdH|naKR@c_^eS@r%@%^zT55?fp{=m5%euN$YaPBG1 diff --git a/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/inhand-right.png b/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/inhand-right.png index 368c73da32797153fc605523aebb86ef07599351..20efe6dd87654762cd77570c3805cb3f8d0748d3 100644 GIT binary patch delta 323 zcmV-J0lfZ`0^I_TBYy!TNklPw?-vp3b8);TZnt#M{JnUB=LYl;)Ss}T# zQQvv*3%G<}j9GmMkCq>F>N;0dyVV7ts(xnvyS%qc15;I3mZcNSU;)h%KW0001t_X}=D VUchc<8SMZ7002ovPDHLkV1hV0mMQ=M delta 248 zcmcc1G?{6Fay9tphzg^gV%pqMg%5x0jCK|R6Grjx!;a> zn|sumqs#E!y>#wbkx|z}C%sqPGd+Hq>g~rH=6qMI3Ep?2@XRF(AHDyaj}26ft*773 z{^@)5Ph8tWRdtZ5Aka|1^&R)RUBNf*vj17VrTzca&~mO&yO>nbxrIl&{(W(eo_fEe uetAGDfBc2NbDdrn#7^6<9WwneNT;)YBU7SwXM}?g$RJNwKbLh*2~7aZy=cS$ diff --git a/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/meta.json index 08894a12a7b..56602b6ea13 100644 --- a/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken/modified from desertrose at https://github.com/DesertRose2/desertrose/pull/378/commits/9e081bd2a0d7614be5a9dabbca34886ce204105d", + "copyright": "Taken/modified from desertrose at https://github.com/DesertRose2/desertrose/pull/378/commits/9e081bd2a0d7614be5a9dabbca34886ce204105d, storage & inhand sprites by RiceMar1244", "size": { "x": 32, "y": 32 @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "storage" + }, { "name": "inhand-left", "directions": 4 diff --git a/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/storage.png b/Resources/Textures/Objects/Weapons/Melee/combat_knife.rsi/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..6b88c9a3aa2885541458d1a5461aba93888ca350 GIT binary patch literal 335 zcmV-V0kHmwP)bY*_4N)F#w<}x910#FIURDfiMjH0nC>xRoAsYfZo8LGH~fq zTFj;l{9HzMS2zQxwuK~_9DVt+Y}0CHYXf(;H`vqR*ZSkrGqP->l4QbdA)KPM<~WYo z7{kUG22R`Q93V|o)>`}fl2uiOAPDen;OqcV6oH74=ehHq_XavKAUTL4fTn3Abs2!Q hRuK`1NDT46^94PVfvFJX;jRDx002ovPDHLkV1mvVjzs_f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/inhand-left.png index b2f253c30b7a7bb447137fd5ce3b2a96983cd340..c352ccfab67d1bc0c97ebe9e383a1557cbb96dee 100644 GIT binary patch delta 257 zcmdnOG?8h7L_G%^0|UdV%))y>>V~I_V@SoEw>LNPwixiVK76sw!l7fDkRgL|3PY6F z5rz;S2k)aCJgr6@>mRweH?Xk2{GZi+Lu}=|AfRR-kelMFdU;QW?^_f7AhD^TYq{m` zi!bri^S!N^9JabDIqd3|xn7h1Y*ek7thUqVv(jIKc~Vu&B)uB>pRZBS3B&! z?T5_?)gN+o!f%9Pjy-bUvhHaf)7zuLzO0ruK%F1>?8T2|eJFA;%?Fv|>FVdQ&MBb@ E0N6NcqW}N^ delta 293 zcmbQpw1sJcL_HHT0|Uc#_L;swiYLG)#1%-_)zvLovc$;9=zQMwZ$Lg{NswPKgTu2M zX+Ta^RY*jMOKNd)QD#9&W_}(6L&conu!5q}?_YuoK7M_o<*loA?#%h%4WR}XjUPPH zIq#!+lA)-lcZY>>knv?>FNHaeCLNg+q7bZUt#7PbAKKY%th#xH#1bIAR>RO-^oZG$ zps<3k#f;M24Ca1P(pz#&0)f^hc)B=-So9_*NU-wo=ex;R0hkwL&%iMv6FeKB(rzZV~mkB4X5Rz?>kRY_xm nm3_DQ99o8wcvoJ7JPGYxSx^dMVpk)l6u6{1-oD!M>bj?kV@SoEw>S54Hakch`=}iKqwz*m7qdkZGl+_? zY+O54`A$Gl^PZI~o=yhshUL%xYqLJAou@6o6sVnn;lTabX}Yd)r`Er>2%0$E={i;>d z6u9-7=Ho-0002j2boO(000b7OjJex|Nnk|e&65UGBPqz(&=mf0004W zQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ> zRWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DLXGSEq_&si!&v&s2HS)i!-e# zF*g;&Hsn%PaP@Nm8w&t8P8u7uY&1~-003S|L_t(IjbmUK;lKfz!ve$s$O0ljJOx=G z0*F2iag7W}EfVTmwH9QFB0jvr}!QcfB43MM&1B@U6RwMz|1|Y%dfDjM^5ll!) p=?0jbgWC>R0vtI&o)ZTO001>G2t9uSyI%kR002ovPDHLkV1hA4Xqf;2 diff --git a/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/meta.json b/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/meta.json index 455734e0447..56602b6ea13 100644 --- a/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/meta.json @@ -1,26 +1,29 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/6cdc0503d32e249125151e369edf951e93bccd1a", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken/modified from desertrose at https://github.com/DesertRose2/desertrose/pull/378/commits/9e081bd2a0d7614be5a9dabbca34886ce204105d, storage & inhand sprites by RiceMar1244", + "size": { + "x": 32, + "y": 32 }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - }, - { - "name": "equipped-BELT", - "directions": 4 - } - ] + "states": [ + { + "name": "icon" + }, + { + "name": "storage" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/storage.png b/Resources/Textures/Objects/Weapons/Melee/survival_knife.rsi/storage.png new file mode 100644 index 0000000000000000000000000000000000000000..173f66035b357a4e97dd17ea50420238b05ec7c2 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJU!E?GArY-_r`dBiIY=CnSIy;i zeluLWaY5~0qr-%00qxlx(-clsvvR(R?En6;{QU2# z@&*yd%|DxhZ9}{^=JuZyP-#$8;d#&#voB8fq~@P|rnSr&v9dpP)tO6NxK}Sysh3gM zrqFZFE1MxIoITm@r@|!N2|y^owxUZYG%#uZ?MZq|ZV4JaD?b0(ZXNr>MxY6nE&rdmEcB32MhK%BVS>L3CB7EY=1gV zN}cJ`FvUSR-)XgdE_;KoM8mXyO$JulS Date: Sat, 2 Nov 2024 17:23:40 -0500 Subject: [PATCH 058/130] Delete conveyor_old.rsi (#33102) --- .../conveyor_old.rsi/conveyor_loose.png | Bin 286 -> 0 bytes .../conveyor_old.rsi/conveyor_started_ccw.png | Bin 4389 -> 0 bytes .../conveyor_started_ccw_r.png | Bin 4440 -> 0 bytes .../conveyor_old.rsi/conveyor_started_cw.png | Bin 4434 -> 0 bytes .../conveyor_started_cw_r.png | Bin 4464 -> 0 bytes .../conveyor_old.rsi/conveyor_stopped_ccw.png | Bin 1687 -> 0 bytes .../conveyor_old.rsi/conveyor_stopped_cw.png | Bin 1689 -> 0 bytes .../Structures/conveyor_old.rsi/meta.json | 238 ------------------ 8 files changed, 238 deletions(-) delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_loose.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw_r.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_cw.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_cw_r.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_stopped_ccw.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/conveyor_stopped_cw.png delete mode 100644 Resources/Textures/Structures/conveyor_old.rsi/meta.json diff --git a/Resources/Textures/Structures/conveyor_old.rsi/conveyor_loose.png b/Resources/Textures/Structures/conveyor_old.rsi/conveyor_loose.png deleted file mode 100644 index 97b955cc6e000436a475b44e3c3da2374f5a1f3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)V#pRVNX9Kd%6Q$LnTv6#%sDVbBB0s>XJ|b0)f+&g^?%oYv5KU3V-L4b~2Qd?VzG z*OOQTWr~0?ux^^kM5&fBaPRxc3{Wk01#CqY0?kRa6f-uN2@b1)&`KX;n-IGTVvDy#8)62U=5^h$CTWT*&|u%cI-WprDmRoQYlOk k{!;a!-H^tMUrxpO0MJTUObOT2v;Y7A07*qoM6N<$f_a&A`~Uy| diff --git a/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw.png b/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw.png deleted file mode 100644 index 7ad5f8fc70dac364e96c4a47c75cdb6ef9c99d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4389 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 diff --git a/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw_r.png b/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_ccw_r.png deleted file mode 100644 index 8bd276e82e4218a07a4be1d234c43800ccd5ffa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4440 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 ejOiOj5B?A7jtB_(7S8kl0000 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�D9*pynpwaHwUOqb}_W##%oj3=Paw0C=EG8MLMbJ2P6F9r~m$W$j003 zby8{C`v1SSoOgek;t4T5%(Bc!<;9DqmqLiX5UWxuWMGbT;+yJgYUlJzU>sB`%_#k1 z4`9&(TEvI1FNwJfFN11tBy+=eBoTFhn(Tl^tAkz2I=uNmU8D7#ZF276r$(qjCO&-839a>=?Q!AZ z$3|#D+5(T(cecfaWzf_h;^0xG*zcS)E&VvIdkAk`i~Zi4#@RO6?a*<2_V2#947YED zxay~WPnRvF(&Y4i{N)4OyZJfXzVQbk diff --git a/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_cw_r.png b/Resources/Textures/Structures/conveyor_old.rsi/conveyor_started_cw_r.png deleted file mode 100644 index d2e18ca0caa0896cbe64be7665dd7a650c64b7a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4464 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 diff --git a/Resources/Textures/Structures/conveyor_old.rsi/conveyor_stopped_cw.png b/Resources/Textures/Structures/conveyor_old.rsi/conveyor_stopped_cw.png deleted file mode 100644 index 116b3aed504581c21d31a005133b94bc23a5e74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1689 zcmV;K24?w*P)+T-Chru7kP~C_IkIR*v3AWc-KCawcG3A^Yt}$dp%a!O&}Yeude|(1ke{b;ImcA z{^iBlf1kMVsR`G{T1J4R{q3E-JVpax^#T6})HP>rB}r-aV)Ab_Wt4(Onc5(yrS>^7 z`GXNq(qXA1nx-->B1k}K2UvBOG`s|8jPLgc{Z>vbT>)~z+Xs|}Rt2yKlLXu)YzQcf z4FL>r`W4EXG!Y9Kw%X2Wf-_{Ejwfjm;4@gl`P1=)J-U$?9dXJ?Zh~BgmvX-E|8)ba z57-~{i#xyWyBJ7ZKc|efT#U2S*Kn?7f6(8If;iwhAJ_~-i(^ATVQlsT3S+Y$P#By2 zfWp}92SnsajmVh%Cg%Y;D*(w-ny{G9SoTBtO%jk3kDojRun}h6Sz*>{7^=;@3!kl0 z_DPua^2MXockf^Qvii;UCz(De0=WADmLh=K<~JXI;N^=)`0dy4c>CcVfG@S}zEt|8 zKET(Zm0T6&*#7$MQ|H0`hs(u$hS%?a*Y5z}%j!2@9?A5@_3;)^@_aQ+7JNfPWDnGi%Y~> z5Rh|oCdC$qh_xU9$g|YJwUI)Ec>+poO-l4Pu|$|B0LZ)0r`cKiu+^qO?gd#XH^xqr z?Y8^d!E?e^olj`0ks8on!RXl`tfEp-m1>Z5ryLHKwE2BEzIGi+i(@ zOX1vRwh5*PkQ`EKXiGJsz!U+1oy{K?no(ee0FHVY$kSm;MgfVq%n$&i%|LUl6LF(} zHslWuk8pZ&y!t*k5p%WesRlXuLuI;qvR2M0$K>%j9{{>B`gkpEybnI7YS#GJ^8qeW z{84p2$r!t(_3?zui?h{@Y3Xu&$aVid=K}_WS*{q0w3#lXCwWz2RPOt)3V63l>*Ial zOzpc?txq{0z)3^!si(W8_3ZKured%<486KK z2cY-|*kV4r(d^LUgMptUoSqyf zH%*dFnl@CnBmqAW*dgjUsQ*Xo4FFZ$I3_`&a*dzWMkAz-{8B(v(25J|AeW jgbV5OLnx`+&xL;ggbzO0e^hp<00000NkvXXu0mjfD^Ns3 diff --git a/Resources/Textures/Structures/conveyor_old.rsi/meta.json b/Resources/Textures/Structures/conveyor_old.rsi/meta.json deleted file mode 100644 index 71aefcdba1d..00000000000 --- a/Resources/Textures/Structures/conveyor_old.rsi/meta.json +++ /dev/null @@ -1,238 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/discordia-space/CEV-Eris/blob/a846799c53f8ee9dcec4b075d7645f591f3ec19d/icons/obj/machines/conveyor.dmi", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "conveyor_loose" - }, - { - "name": "conveyor_started_ccw", - "directions": 8, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "conveyor_started_ccw_r", - "directions": 8, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "conveyor_started_cw", - "directions": 8, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "conveyor_started_cw_r", - "directions": 8, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "conveyor_stopped_ccw", - "directions": 8 - }, - { - "name": "conveyor_stopped_cw", - "directions": 8 - } - ] -} From d993582d00f1550c4ae4ee982de3f24b10dc4ae9 Mon Sep 17 00:00:00 2001 From: Flareguy <78941145+Flareguy@users.noreply.github.com> Date: Sat, 2 Nov 2024 18:16:18 -0500 Subject: [PATCH 059/130] Fix broken computer white shadows (#33103) fix broken computer white shadows --- .../Machines/computers.rsi/broken.png | Bin 3576 -> 3542 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Structures/Machines/computers.rsi/broken.png b/Resources/Textures/Structures/Machines/computers.rsi/broken.png index 38d2fd88a37fe5f960b2e68434c01099e83fafd3..5adb4f73f2eb804a8e96da7845c7b321399e64e8 100644 GIT binary patch delta 3541 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 P00000NkvXXu0mjf;wYdQ delta 3575 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 From d2a487dc9e5d7ab5b9f8a4d66d72234b8039a549 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 02:21:44 +0100 Subject: [PATCH 060/130] Update Credits (#33125) Co-authored-by: PJBot --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index ac39b6b7f55..8c2ad5f5b0f 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, achookh, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, Afrokada, Agoichi, Ahion, aiden, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, avghdev, Awlod, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, bellwetherlogic, benev0, benjamin-burges, BGare, bhenrich, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, Magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, onoira, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, RiceMar1244, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, Sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, SpaceLizardSky, SpaceManiac, SpaceyLady, Spanky, spanky-spanky, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGODiamond, TGRCdev, tgrkzus, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, theOperand, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, TyAshley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, wtcwr68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zonespace27, Zylofan, Zymem, zzylex +0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, achookh, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, Afrokada, AftrLite, Agoichi, Ahion, aiden, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, avghdev, Awlod, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, bellwetherlogic, benev0, benjamin-burges, BGare, bhenrich, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, Magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, onoira, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, RiceMar1244, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, Sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceyLady, Spanky, spanky-spanky, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGODiamond, TGRCdev, tgrkzus, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, theOperand, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, TyAshley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, wtcwr68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zonespace27, Zylofan, Zymem, zzylex From 912ac2c06980710bd5d96e7fb851922e2ff70c68 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Sun, 3 Nov 2024 03:25:30 -0800 Subject: [PATCH 061/130] Bugfix: Wielding now uses identity system. (#33134) Make wielding system use identity --- Content.Shared/Wieldable/WieldableSystem.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index d76876c0cff..0a193576bfd 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.IdentityManagement; using Content.Shared.Interaction.Events; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Item; @@ -125,7 +126,7 @@ private void OnExamineRequires(Entity entity, ref Exa private void OnExamine(EntityUid uid, GunWieldBonusComponent component, ref ExaminedEvent args) { - if (HasComp(uid)) + if (HasComp(uid)) return; if (component.WieldBonusExamineMessage != null) @@ -253,7 +254,7 @@ public bool TryWield(EntityUid used, WieldableComponent component, EntityUid use return false; var selfMessage = Loc.GetString("wieldable-component-successful-wield", ("item", used)); - var othersMessage = Loc.GetString("wieldable-component-successful-wield-other", ("user", user), ("item", used)); + var othersMessage = Loc.GetString("wieldable-component-successful-wield-other", ("user", Identity.Entity(user, EntityManager)), ("item", used)); _popupSystem.PopupPredicted(selfMessage, othersMessage, user, user); var targEv = new ItemWieldedEvent(); @@ -298,7 +299,7 @@ private void OnItemUnwielded(EntityUid uid, WieldableComponent component, ItemUn _audioSystem.PlayPredicted(component.UnwieldSound, uid, args.User); var selfMessage = Loc.GetString("wieldable-component-failed-wield", ("item", uid)); - var othersMessage = Loc.GetString("wieldable-component-failed-wield-other", ("user", args.User.Value), ("item", uid)); + var othersMessage = Loc.GetString("wieldable-component-failed-wield-other", ("user", Identity.Entity(args.User.Value, EntityManager)), ("item", uid)); _popupSystem.PopupPredicted(selfMessage, othersMessage, args.User.Value, args.User.Value); } From a0ef431255f122c360e4f1734e26e092ddce9705 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 3 Nov 2024 11:26:38 +0000 Subject: [PATCH 062/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d82950a2867..b20b6726bfc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Flareguy - changes: - - message: Added vox sprites for most of the remaining common mask items. - type: Add - id: 7085 - time: '2024-08-10T21:06:50.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30838 - author: Scribbles0, Plykiya, nikthechampiongr changes: - message: You can now execute incapacitated/cuffed entities or yourself with certain @@ -3953,3 +3946,11 @@ id: 7584 time: '2024-11-02T15:12:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33067 +- author: Plykiya + changes: + - message: Wielding weapons no longer displays your character's real identity when + your identity is hidden. + type: Fix + id: 7585 + time: '2024-11-03T11:25:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33134 From cc3a19c212e96eda25236060c7809a66a69d7bdd Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Mon, 4 Nov 2024 03:49:42 +0300 Subject: [PATCH 063/130] Collapsible ghost roles menu (#32717) * Make ghost roles collapsible * Save `BodyVisible` state of each `Collapsible` box * Make ghost role collapsible only when group has more than 1 role * Make it a little prettier * Make only ghost role buttons collapsible * Apply requested changes * Typo * Small cleanup * Store in list, instead of iterating * Make unique ids more unique * Move it out of the cycle * Make _collapsibleBoxes into dictionary and use key instead of Collapsible boxes names Added TODO. So after the problem will be fixed in `GhostRolesEui`, it should be mirrored and fixed here too. * Put TODO in GhostRolesEui. I guess Issue must be made for this * Use HashSet instead of Dictionary as suggested. Invert the HashSet, so being present means it uncollapsed I decided to invert HashSet to _uncollapsedStates, because players surely will have more collapsed buttons than opened, so we optimise memory usage a little bit. * Remove extra space from ghost roles window * Add buttons stretching. Size 3:1 --- .../Controls/Roles/GhostRoleButtonsBox.xaml | 9 +++ ...ry.xaml.cs => GhostRoleButtonsBox.xaml.cs} | 7 +- .../Controls/Roles/GhostRoleEntryButtons.xaml | 10 +-- .../Controls/Roles/GhostRoleInfoBox.xaml | 8 ++ .../Controls/Roles/GhostRoleInfoBox.xaml.cs | 18 +++++ .../Ghost/Controls/Roles/GhostRolesEntry.xaml | 16 ---- .../Ghost/Controls/Roles/GhostRolesEui.cs | 30 +++++--- .../Controls/Roles/GhostRolesWindow.xaml.cs | 77 ++++++++++++++++++- Resources/Locale/en-US/ghost/ghost-gui.ftl | 1 + 9 files changed, 136 insertions(+), 40 deletions(-) create mode 100644 Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml rename Content.Client/UserInterface/Systems/Ghost/Controls/Roles/{GhostRolesEntry.xaml.cs => GhostRoleButtonsBox.xaml.cs} (86%) create mode 100644 Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml create mode 100644 Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleInfoBox.xaml.cs delete mode 100644 Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml new file mode 100644 index 00000000000..32d611e7717 --- /dev/null +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs similarity index 86% rename from Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs rename to Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs index fc53cc72ae6..7df02434160 100644 --- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEntry.xaml.cs +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleButtonsBox.xaml.cs @@ -10,20 +10,17 @@ namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles { [GenerateTypedNameReferences] - public sealed partial class GhostRolesEntry : BoxContainer + public sealed partial class GhostRoleButtonsBox : BoxContainer { private SpriteSystem _spriteSystem; public event Action? OnRoleSelected; public event Action? OnRoleFollow; - public GhostRolesEntry(string name, string description, bool hasAccess, FormattedMessage? reason, IEnumerable roles, SpriteSystem spriteSystem) + public GhostRoleButtonsBox(bool hasAccess, FormattedMessage? reason, IEnumerable roles, SpriteSystem spriteSystem) { RobustXamlLoader.Load(this); _spriteSystem = spriteSystem; - Title.Text = name; - Description.SetMessage(description); - foreach (var role in roles) { var button = new GhostRoleEntryButtons(role); diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml index ffde5d69f76..05c52deef16 100644 --- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRoleEntryButtons.xaml @@ -1,15 +1,15 @@  + Orientation="Horizontal" + HorizontalAlignment="Stretch"> public void AttemptShoot(EntityUid gunUid, GunComponent gun) { - var coordinates = new EntityCoordinates(gunUid, new Vector2(0, -1)); + var coordinates = new EntityCoordinates(gunUid, gun.DefaultDirection); gun.ShootCoordinates = coordinates; AttemptShoot(gunUid, gunUid, gun); gun.ShotCounter = 0; @@ -258,6 +258,9 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) var fireRate = TimeSpan.FromSeconds(1f / gun.FireRateModified); + if (gun.SelectedMode == SelectiveFire.Burst || gun.BurstActivated) + fireRate = TimeSpan.FromSeconds(1f / gun.BurstFireRate); + // First shot // Previously we checked shotcounter but in some cases all the bullets got dumped at once // curTime - fireRate is insufficient because if you time it just right you can get a 3rd shot out slightly quicker. @@ -278,18 +281,24 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) // Get how many shots we're actually allowed to make, due to clip size or otherwise. // Don't do this in the loop so we still reset NextFire. - switch (gun.SelectedMode) + if (!gun.BurstActivated) + { + switch (gun.SelectedMode) + { + case SelectiveFire.SemiAuto: + shots = Math.Min(shots, 1 - gun.ShotCounter); + break; + case SelectiveFire.Burst: + shots = Math.Min(shots, gun.ShotsPerBurstModified - gun.ShotCounter); + break; + case SelectiveFire.FullAuto: + break; + default: + throw new ArgumentOutOfRangeException($"No implemented shooting behavior for {gun.SelectedMode}!"); + } + } else { - case SelectiveFire.SemiAuto: - shots = Math.Min(shots, 1 - gun.ShotCounter); - break; - case SelectiveFire.Burst: - shots = Math.Min(shots, gun.ShotsPerBurstModified - gun.ShotCounter); - break; - case SelectiveFire.FullAuto: - break; - default: - throw new ArgumentOutOfRangeException($"No implemented shooting behavior for {gun.SelectedMode}!"); + shots = Math.Min(shots, gun.ShotsPerBurstModified - gun.ShotCounter); } var attemptEv = new AttemptShootEvent(user, null); @@ -301,7 +310,8 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) { PopupSystem.PopupClient(attemptEv.Message, gunUid, user); } - + gun.BurstActivated = false; + gun.BurstShotsCount = 0; gun.NextFire = TimeSpan.FromSeconds(Math.Max(lastFire.TotalSeconds + SafetyNextFire, gun.NextFire.TotalSeconds)); return; } @@ -328,6 +338,10 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) var emptyGunShotEvent = new OnEmptyGunShotEvent(); RaiseLocalEvent(gunUid, ref emptyGunShotEvent); + gun.BurstActivated = false; + gun.BurstShotsCount = 0; + gun.NextFire += TimeSpan.FromSeconds(gun.BurstCooldown); + // Play empty gun sounds if relevant // If they're firing an existing clip then don't play anything. if (shots > 0) @@ -347,6 +361,22 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) return; } + // Handle burstfire + if (gun.SelectedMode == SelectiveFire.Burst) + { + gun.BurstActivated = true; + } + if (gun.BurstActivated) + { + gun.BurstShotsCount += shots; + if (gun.BurstShotsCount >= gun.ShotsPerBurstModified) + { + gun.NextFire += TimeSpan.FromSeconds(gun.BurstCooldown); + gun.BurstActivated = false; + gun.BurstShotsCount = 0; + } + } + // Shoot confirmed - sounds also played here in case it's invalid (e.g. cartridge already spent). Shoot(gunUid, gun, ev.Ammo, fromCoordinates, toCoordinates.Value, out var userImpulse, user, throwItems: attemptEv.ThrowItems); var shotEv = new GunShotEvent(user, ev.Ammo); diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index a22be1da042..5140a358e10 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -19,6 +19,7 @@ minAngle: 2 maxAngle: 16 fireRate: 8 + burstFireRate: 8 angleIncrease: 3 angleDecay: 16 selectedMode: FullAuto @@ -27,6 +28,7 @@ - FullAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/smg.ogg + defaultDirection: 1, 0 - type: ChamberMagazineAmmoProvider soundRack: path: /Audio/Weapons/Guns/Cock/smg_cock.ogg @@ -140,12 +142,15 @@ - type: Gun minAngle: 21 maxAngle: 32 - fireRate: 6 - selectedMode: FullAuto + fireRate: 12 + burstFireRate: 12 + selectedMode: Burst soundGunshot: path: /Audio/Weapons/Guns/Gunshots/atreides.ogg availableModes: - - FullAuto + - Burst + shotsPerBurst: 3 + burstCooldown: 0.25 - type: ItemSlots slots: gun_magazine: @@ -250,6 +255,8 @@ angleDecay: 6 selectedMode: FullAuto shotsPerBurst: 5 + burstCooldown: 0.2 + burstFireRate: 7 availableModes: - SemiAuto - Burst From 5b0761dab265d80c7ed1dd5934b6e8f97bf642ef Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 6 Nov 2024 14:40:22 +0000 Subject: [PATCH 091/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7e34cd84454..25dd61eb683 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: DieselMohawk - changes: - - message: Resprited Security vest and helmet - type: Tweak - id: 7097 - time: '2024-08-12T06:20:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30291 - author: Ubaser changes: - message: Mantles are now available in loadouts, requiring 20 hours of that head @@ -3951,3 +3944,12 @@ id: 7596 time: '2024-11-06T14:27:11.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32829 +- author: SlamBamActionman + changes: + - message: WT550 and C20-r's "burst" firemodes are now actual bursts. + type: Tweak + - message: Drozd is now a burst-only weapon (DPS remains unchanged!). + type: Tweak + id: 7597 + time: '2024-11-06T14:39:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31292 From 379fb4cb6aa35d0f2567a6c874e56a2b7b76ea87 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Thu, 7 Nov 2024 11:25:16 +0100 Subject: [PATCH 092/130] AI can now speak once more. (#33196) Yippee --- Resources/Prototypes/Entities/Mobs/Player/silicon.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index be2b5a44f95..39750b470f5 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -69,8 +69,6 @@ canShuttle: false title: comms-console-announcement-title-station-ai color: "#2ed2fd" - - type: Speech - speechVerb: Robotic - type: ShowJobIcons - type: entity @@ -395,6 +393,9 @@ drawFov: false - type: Examiner - type: InputMover + - type: Speech + speechVerb: Robotic + speechSounds: Borg - type: Tag tags: - HideContextMenu From fc0d85b4878a17baea8c31ebef5d6d446db35fa1 Mon Sep 17 00:00:00 2001 From: Spessmann <156740760+Spessmann@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:01:35 -0800 Subject: [PATCH 093/130] Cog update (fixes) (#33202) fixed cog again --- Resources/Maps/cog.yml | 1487 ++++++++++++---------------------------- 1 file changed, 454 insertions(+), 1033 deletions(-) diff --git a/Resources/Maps/cog.yml b/Resources/Maps/cog.yml index 888b4e7e5ec..58310e561c0 100644 --- a/Resources/Maps/cog.yml +++ b/Resources/Maps/cog.yml @@ -145,15 +145,15 @@ entities: version: 6 -4,-3: ind: -4,-3 - tiles: AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAABIAAAAAADIAAAAAACIAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAA + tiles: AAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAABIAAAAAADIAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAADIAAAAAACIAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAAAIAAAAAAAIAAAAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIAAAAAABIAAAAAADIAAAAAACIAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAA version: 6 -4,-4: ind: -4,-4 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAgAAAAAAAIQAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgAAAAAAADwAAAAAAgAAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAACgQAAAAAADwAAAAAAHwAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAYAAAAAACYAAAAAACgQAAAAAAgQAAAAAAIQAAAAAADwAAAAAAgAAAAAAADwAAAAAADwAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAYAAAAAAAgQAAAAAAYAAAAAAAHwAAAAAADwAAAAAAAAAAAAAADwAAAAAADwAAAAAAgAAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAHwAAAAAAgQAAAAAAYAAAAAABHwAAAAAAHwAAAAACgAAAAAAAgAAAAAAAgAAAAAAAIQAAAAAAgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAHwAAAAAAHwAAAAAAHwAAAAAKgQAAAAAADwAAAAAAAAAAAAAADwAAAAAADwAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAHwAAAAAADwAAAAAAIQAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAADwAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAHwAAAAAADwAAAAAAgAAAAAAADwAAAAAAHwAAAAAAgAAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAADwAAAAAADwAAAAAADwAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAgAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAgQAAAAAAgQAAAAAAAAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAIQAAAAAADwAAAAAADwAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAA version: 6 -3,-4: ind: -3,-4 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAABAAAAAAAgQAAAAAABAAAAAAABAAAAAAAIgAAAAAAgQAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAABAAAAAAABAAAAAAAgQAAAAAAIgAAAAAAYAAAAAADgQAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAABAAAAAAABAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADYAAAAAAAgQAAAAAAgQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAIgAAAAAAIgAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAAAAgQAAAAAABAAAAAAAgQAAAAAABAAAAAAABAAAAAAAIgAAAAAAgQAAAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAAgQAAAAAAgQAAAAAABAAAAAAABAAAAAAAgQAAAAAAIgAAAAAAYAAAAAADgQAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAADwAAAAAAgQAAAAAABAAAAAAABAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADYAAAAAADDwAAAAAADwAAAAAADwAAAAAADwAAAAAAAAAAAAAAAAAAAAAADwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAgQAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAUgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADYAAAAAAAgQAAAAAAgQAAAAAA version: 6 -2,-4: ind: -2,-4 @@ -455,10 +455,6 @@ entities: ind: -5,-2 tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAABYAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAADgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - -5,-4: - ind: -5,-4 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 -3,-5: ind: -3,-5 tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAAgAAAAAAA @@ -1906,8 +1902,6 @@ entities: 8675: -48,-44 8676: -51,-51 8677: -43,-54 - 8681: -61,-55 - 8682: -63,-56 8850: 62,-4 8851: 62,-1 8913: 48,-6 @@ -2844,14 +2838,6 @@ entities: 8671: -51,-44 8672: -48,-46 8673: -48,-46 - 8683: -62,-56 - 8684: -63,-55 - 8685: -62,-55 - 8686: -61,-56 - 8687: -61,-55 - 8688: -62,-54 - 8689: -63,-53 - 8690: -62,-53 8818: 39,-36 8819: 41,-36 8820: 43,-36 @@ -4151,19 +4137,6 @@ entities: 8612: 57,63 8613: 55,64 8645: -57,-34 - 8691: -63,-56 - 8692: -62,-56 - 8693: -61,-56 - 8694: -62,-55 - 8695: -62,-55 - 8696: -63,-54 - 8697: -63,-54 - 8698: -63,-53 - 8699: -63,-53 - 8700: -61,-54 - 8701: -61,-58 - 8702: -61,-59 - 8703: -61,-57 - node: cleanable: True zIndex: 1 @@ -9775,21 +9748,20 @@ entities: -14,-9: 0: 58620 -16,-12: - 2: 19524 + 2: 19660 -16,-13: - 1: 16592 - 2: 1024 + 1: 17026 -16,-11: 2: 3140 -15,-12: - 2: 61422 + 2: 61438 -15,-11: 2: 3918 + -15,-13: + 1: 4612 + 2: 60608 -15,-10: 0: 24584 - -15,-13: - 2: 59968 - 1: 5284 -14,-11: 2: 257 0: 17612 @@ -9802,48 +9774,36 @@ entities: 2: 273 -13,-13: 0: 61160 - -16,-15: - 1: 16 - 2: 12 - 0: 34944 - -17,-15: - 1: 2048 - 2: 17408 -16,-14: - 0: 28398 - -17,-14: - 0: 128 - 1: 32768 - 2: 68 - -15,-15: - 2: 42689 1: 2048 + -15,-15: + 2: 61440 -15,-14: - 1: 548 - 2: 57472 + 1: 40960 + 2: 2286 -14,-15: - 2: 57360 - 1: 256 + 2: 12288 -14,-14: - 0: 290 - 1: 4096 - 2: 10820 - -13,-15: - 2: 61440 + 2: 12288 + 1: 18432 -13,-14: - 2: 10180 - -12,-15: - 2: 61440 + 1: 640 + -13,-15: + 2: 24576 -12,-14: 0: 65024 - -11,-15: - 2: 61440 + 1: 8 + -12,-15: + 1: 4096 -11,-14: 0: 64256 -11,-16: 2: 58030 -11,-17: 2: 41646 + -11,-15: + 2: 2 + 1: 33920 -10,-16: 2: 58111 -10,-14: @@ -9853,7 +9813,7 @@ entities: -10,-15: 0: 61152 -9,-16: - 2: 2047 + 2: 767 -9,-14: 0: 4084 -9,-17: @@ -11671,8 +11631,6 @@ entities: -6,-17: 2: 1041 0: 14 - -17,-13: - 1: 4 -11,-18: 2: 41696 -10,-18: @@ -14021,11 +13979,6 @@ entities: - type: Transform pos: -17.5,-60.5 parent: 12 - - uid: 31026 - components: - - type: Transform - pos: -60.5,-53.5 - parent: 12 - proto: Airlock entities: - uid: 2309 @@ -16010,29 +15963,6 @@ entities: - type: Transform pos: -21.5,55.5 parent: 12 - - uid: 31049 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -60.5,-56.5 - parent: 12 - - type: DeviceLinkSink - invokeCounter: 1 - - type: DeviceLinkSource - linkedPorts: - 32119: - - DoorStatus: DoorBolt - - uid: 32119 - components: - - type: Transform - pos: -60.5,-58.5 - parent: 12 - - type: DeviceLinkSink - invokeCounter: 1 - - type: DeviceLinkSource - linkedPorts: - 31049: - - DoorStatus: DoorBolt - proto: AirlockHeadOfPersonnelLocked entities: - uid: 18846 @@ -16367,6 +16297,11 @@ entities: rot: -1.5707963267948966 rad pos: 38.5,-20.5 parent: 12 + - uid: 1613 + components: + - type: Transform + pos: -44.5,68.5 + parent: 12 - uid: 2358 components: - type: Transform @@ -16740,18 +16675,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,8.5 parent: 12 - - uid: 29024 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -44.5,68.5 - parent: 12 - - type: Door - secondsUntilStateChange: -5937.642 - state: Opening - - type: DeviceLinkSource - lastSignals: - DoorStatus: True - uid: 29076 components: - type: Transform @@ -19607,12 +19530,6 @@ entities: rot: 1.5707963267948966 rad pos: 34.5,-12.5 parent: 12 - - uid: 32163 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -63.5,-53.5 - parent: 12 - proto: APCElectronics entities: - uid: 10892 @@ -19737,196 +19654,189 @@ entities: parent: 12 - proto: AsteroidRock entities: - - uid: 10821 + - uid: 4769 components: - type: Transform - pos: -62.5,-49.5 + pos: -58.5,-51.5 parent: 12 - - uid: 31015 - components: - - type: Transform - pos: -57.5,-54.5 - parent: 12 - - uid: 31024 + - uid: 4976 components: - type: Transform - pos: -62.5,-50.5 + pos: -52.5,-52.5 parent: 12 - - uid: 31025 + - uid: 7157 components: - type: Transform - pos: -56.5,-51.5 + pos: -59.5,-53.5 parent: 12 - - uid: 31027 + - uid: 10819 components: - type: Transform - pos: -59.5,-53.5 + pos: -61.5,-49.5 parent: 12 - - uid: 31031 + - uid: 10823 components: - type: Transform - pos: -59.5,-50.5 + pos: -61.5,-50.5 parent: 12 - - uid: 31032 + - uid: 17288 components: - type: Transform - pos: -60.5,-49.5 + pos: -48.5,-55.5 parent: 12 - - uid: 31033 + - uid: 25452 components: - type: Transform - pos: -62.5,-51.5 + pos: -60.5,-52.5 parent: 12 - - uid: 31035 + - uid: 25568 components: - type: Transform - pos: -56.5,-55.5 + pos: -56.5,-51.5 parent: 12 - - uid: 31036 + - uid: 25682 components: - type: Transform - pos: -55.5,-54.5 + pos: -59.5,-49.5 parent: 12 - - uid: 31037 + - uid: 25738 components: - type: Transform - pos: -57.5,-56.5 + pos: -58.5,-53.5 parent: 12 - - uid: 31039 + - uid: 26291 components: - type: Transform - pos: -53.5,-53.5 + pos: -59.5,-51.5 parent: 12 - - uid: 31043 + - uid: 26305 components: - type: Transform - pos: -58.5,-55.5 + pos: -41.5,-55.5 parent: 12 - - uid: 31047 + - uid: 26413 components: - type: Transform - pos: -64.5,-55.5 + pos: -41.5,-56.5 parent: 12 - - uid: 31055 + - uid: 29024 components: - type: Transform - pos: -63.5,-52.5 + pos: -60.5,-51.5 parent: 12 - - uid: 31065 + - uid: 29978 components: - type: Transform - pos: -55.5,-56.5 + pos: -59.5,-47.5 parent: 12 - - uid: 31159 + - uid: 30180 components: - type: Transform - pos: -63.5,-51.5 + pos: -60.5,-48.5 parent: 12 - - uid: 31160 + - uid: 30184 components: - type: Transform - pos: -61.5,-51.5 + pos: -62.5,-50.5 parent: 12 - - uid: 32122 + - uid: 30271 components: - type: Transform - pos: -65.5,-53.5 + pos: -51.5,-53.5 parent: 12 - - uid: 32123 + - uid: 30305 components: - type: Transform - pos: -65.5,-52.5 + pos: -50.5,-54.5 parent: 12 - - uid: 32124 + - uid: 30426 components: - type: Transform - pos: -64.5,-51.5 + pos: -51.5,-54.5 parent: 12 - - uid: 32126 + - uid: 30533 components: - type: Transform - pos: -63.5,-49.5 + pos: -46.5,-55.5 parent: 12 - - uid: 32137 + - uid: 30536 components: - type: Transform - pos: -63.5,-57.5 + pos: -49.5,-54.5 parent: 12 - - uid: 32139 + - uid: 30537 components: - type: Transform - pos: -62.5,-58.5 + pos: -49.5,-53.5 parent: 12 - - uid: 32140 + - uid: 30538 components: - type: Transform - pos: -63.5,-56.5 + pos: -47.5,-55.5 parent: 12 - - uid: 32141 + - uid: 31026 components: - type: Transform - pos: -64.5,-56.5 + pos: -50.5,-52.5 parent: 12 - - uid: 32168 + - uid: 31034 components: - type: Transform - pos: -59.5,-49.5 + pos: -57.5,-52.5 parent: 12 - - uid: 32171 + - uid: 31036 components: - type: Transform - pos: -58.5,-58.5 + pos: -61.5,-51.5 parent: 12 - - uid: 32185 + - uid: 31042 components: - type: Transform - pos: -60.5,-48.5 + pos: -60.5,-49.5 parent: 12 - proto: AsteroidRockCoal entities: - - uid: 31041 + - uid: 11027 components: - type: Transform - pos: -55.5,-55.5 + pos: -59.5,-52.5 parent: 12 - - uid: 31042 + - uid: 30341 components: - type: Transform - pos: -53.5,-52.5 + pos: -40.5,-57.5 parent: 12 - - uid: 32138 + - uid: 30457 components: - type: Transform - pos: -62.5,-57.5 + pos: -49.5,-55.5 parent: 12 -- proto: AsteroidRockQuartz - entities: - - uid: 31111 + - uid: 31038 components: - type: Transform - pos: -60.5,-52.5 + pos: -58.5,-50.5 parent: 12 - proto: AsteroidRockTin entities: - - uid: 31022 + - uid: 10822 components: - type: Transform - pos: -56.5,-53.5 + pos: -51.5,-52.5 parent: 12 - - uid: 31107 + - uid: 25823 components: - type: Transform - pos: -64.5,-53.5 + pos: -59.5,-50.5 parent: 12 - - uid: 32125 + - uid: 30342 components: - type: Transform - pos: -64.5,-50.5 + pos: -57.5,-53.5 parent: 12 - - uid: 32182 + - uid: 31030 components: - type: Transform - pos: -59.5,-51.5 + pos: -45.5,-55.5 parent: 12 - proto: AtmosDeviceFanDirectional entities: @@ -20560,6 +20470,11 @@ entities: - type: Transform pos: 85.5,-30.5 parent: 12 + - uid: 17289 + components: + - type: Transform + pos: -50.5,-53.5 + parent: 12 - uid: 26206 components: - type: Transform @@ -20570,120 +20485,115 @@ entities: - type: Transform pos: 55.5,19.5 parent: 12 - - uid: 28746 - components: - - type: Transform - pos: 9.5,6.5 - parent: 12 - - uid: 28747 + - uid: 26304 components: - type: Transform - pos: 10.5,6.5 + pos: -48.5,-54.5 parent: 12 - - uid: 28748 + - uid: 26306 components: - type: Transform - pos: 11.5,6.5 + pos: -52.5,-53.5 parent: 12 - - uid: 28749 + - uid: 26307 components: - type: Transform - pos: 12.5,6.5 + pos: -53.5,-52.5 parent: 12 - - uid: 32194 + - uid: 26610 components: - type: Transform - pos: -65.5,-51.5 + pos: -44.5,-55.5 parent: 12 - - uid: 32195 + - uid: 26758 components: - type: Transform - pos: -61.5,-48.5 + pos: -40.5,-56.5 parent: 12 - - uid: 32196 + - uid: 26866 components: - type: Transform - pos: -63.5,-50.5 + pos: -58.5,-52.5 parent: 12 - - uid: 32197 + - uid: 27910 components: - type: Transform - pos: -64.5,-52.5 + pos: -60.5,-53.5 parent: 12 - - uid: 32198 + - uid: 28746 components: - type: Transform - pos: -60.5,-50.5 + pos: 9.5,6.5 parent: 12 - - uid: 32199 + - uid: 28747 components: - type: Transform - pos: -61.5,-50.5 + pos: 10.5,6.5 parent: 12 - - uid: 32200 + - uid: 28748 components: - type: Transform - pos: -59.5,-48.5 + pos: 11.5,6.5 parent: 12 - - uid: 32201 + - uid: 28749 components: - type: Transform - pos: -58.5,-50.5 + pos: 12.5,6.5 parent: 12 - - uid: 32202 + - uid: 29082 components: - type: Transform - pos: -57.5,-49.5 + pos: -62.5,-49.5 parent: 12 - - uid: 32203 + - uid: 30185 components: - type: Transform - pos: -57.5,-51.5 + pos: -56.5,-52.5 parent: 12 - - uid: 32204 + - uid: 30196 components: - type: Transform - pos: -56.5,-50.5 + pos: -60.5,-50.5 parent: 12 - - uid: 32205 + - uid: 30198 components: - type: Transform - pos: -58.5,-53.5 + pos: -57.5,-51.5 parent: 12 - - uid: 32206 + - uid: 30272 components: - type: Transform - pos: -58.5,-54.5 + pos: -61.5,-48.5 parent: 12 - - uid: 32207 + - uid: 30279 components: - type: Transform - pos: -57.5,-55.5 + pos: -59.5,-48.5 parent: 12 - - uid: 32208 + - uid: 30298 components: - type: Transform - pos: -56.5,-57.5 + pos: -62.5,-51.5 parent: 12 - - uid: 32209 + - uid: 30343 components: - type: Transform - pos: -55.5,-57.5 + pos: -40.5,-58.5 parent: 12 - - uid: 32210 + - uid: 30454 components: - type: Transform - pos: -55.5,-52.5 + pos: -47.5,-56.5 parent: 12 - - uid: 32211 + - uid: 30489 components: - type: Transform - pos: -63.5,-58.5 + pos: -58.5,-49.5 parent: 12 - - uid: 32212 + - uid: 30490 components: - type: Transform - pos: -64.5,-57.5 + pos: -41.5,-57.5 parent: 12 - proto: AtmosFixFreezerMarker entities: @@ -20999,11 +20909,6 @@ entities: - type: Transform pos: 2.5,70.5 parent: 12 - - uid: 10819 - components: - - type: Transform - pos: -61.5,-57.5 - parent: 12 - uid: 23721 components: - type: Transform @@ -21030,11 +20935,6 @@ entities: - type: Transform pos: 41.5,-19.5 parent: 12 - - uid: 32187 - components: - - type: Transform - pos: -63.5,-54.5 - parent: 12 - proto: BarSignOfficerBeersky entities: - uid: 14512 @@ -21590,18 +21490,6 @@ entities: - type: Transform pos: -20.5,47.5 parent: 12 -- proto: Bible - entities: - - uid: 13308 - components: - - type: Transform - pos: 56.419914,38.685394 - parent: 12 - - uid: 13322 - components: - - type: Transform - pos: 43.41042,29.810503 - parent: 12 - proto: Biogenerator entities: - uid: 107 @@ -40881,46 +40769,11 @@ entities: - type: Transform pos: 35.5,-32.5 parent: 12 - - uid: 25568 - components: - - type: Transform - pos: -60.5,-55.5 - parent: 12 - - uid: 25581 - components: - - type: Transform - pos: -60.5,-56.5 - parent: 12 - - uid: 25598 - components: - - type: Transform - pos: -60.5,-57.5 - parent: 12 - uid: 25610 components: - type: Transform pos: 50.5,-0.5 parent: 12 - - uid: 25682 - components: - - type: Transform - pos: -60.5,-58.5 - parent: 12 - - uid: 25738 - components: - - type: Transform - pos: -60.5,-59.5 - parent: 12 - - uid: 25822 - components: - - type: Transform - pos: -61.5,-59.5 - parent: 12 - - uid: 25823 - components: - - type: Transform - pos: -59.5,-59.5 - parent: 12 - uid: 26097 components: - type: Transform @@ -41761,6 +41614,11 @@ entities: - type: Transform pos: -28.5,-0.5 parent: 12 + - uid: 27665 + components: + - type: Transform + pos: -50.5,-46.5 + parent: 12 - uid: 27712 components: - type: Transform @@ -44691,31 +44549,6 @@ entities: - type: Transform pos: 49.5,54.5 parent: 12 - - uid: 32128 - components: - - type: Transform - pos: -62.5,-53.5 - parent: 12 - - uid: 32129 - components: - - type: Transform - pos: -61.5,-53.5 - parent: 12 - - uid: 32130 - components: - - type: Transform - pos: -61.5,-54.5 - parent: 12 - - uid: 32131 - components: - - type: Transform - pos: -61.5,-55.5 - parent: 12 - - uid: 32213 - components: - - type: Transform - pos: -63.5,-53.5 - parent: 12 - uid: 32230 components: - type: Transform @@ -44771,12 +44604,6 @@ entities: - type: Transform pos: 43.47266,63.509254 parent: 12 - - uid: 31067 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -50.484467,-46.507282 - parent: 12 - uid: 31288 components: - type: Transform @@ -45185,6 +45012,11 @@ entities: - type: Transform pos: -43.5,-13.5 parent: 12 + - uid: 1764 + components: + - type: Transform + pos: -56.5,-53.5 + parent: 12 - uid: 1835 components: - type: Transform @@ -46070,11 +45902,6 @@ entities: - type: Transform pos: 42.5,-0.5 parent: 12 - - uid: 4976 - components: - - type: Transform - pos: -57.5,-57.5 - parent: 12 - uid: 4994 components: - type: Transform @@ -47670,6 +47497,11 @@ entities: - type: Transform pos: 51.5,-6.5 parent: 12 + - uid: 9631 + components: + - type: Transform + pos: -57.5,-54.5 + parent: 12 - uid: 9636 components: - type: Transform @@ -52575,6 +52407,11 @@ entities: - type: Transform pos: 30.5,14.5 parent: 12 + - uid: 25598 + components: + - type: Transform + pos: -56.5,-54.5 + parent: 12 - uid: 25613 components: - type: Transform @@ -56220,26 +56057,11 @@ entities: - type: Transform pos: -54.5,-50.5 parent: 12 - - uid: 31013 - components: - - type: Transform - pos: -58.5,-52.5 - parent: 12 - uid: 31054 components: - type: Transform pos: 30.5,11.5 parent: 12 - - uid: 31056 - components: - - type: Transform - pos: -57.5,-52.5 - parent: 12 - - uid: 31057 - components: - - type: Transform - pos: -56.5,-54.5 - parent: 12 - uid: 31058 components: - type: Transform @@ -56275,16 +56097,6 @@ entities: - type: Transform pos: -58.5,-43.5 parent: 12 - - uid: 31730 - components: - - type: Transform - pos: -56.5,-56.5 - parent: 12 - - uid: 31731 - components: - - type: Transform - pos: -58.5,-56.5 - parent: 12 - uid: 31775 components: - type: Transform @@ -56410,96 +56222,6 @@ entities: - type: Transform pos: 40.5,-10.5 parent: 12 - - uid: 32152 - components: - - type: Transform - pos: -65.5,-57.5 - parent: 12 - - uid: 32153 - components: - - type: Transform - pos: -65.5,-56.5 - parent: 12 - - uid: 32154 - components: - - type: Transform - pos: -65.5,-55.5 - parent: 12 - - uid: 32155 - components: - - type: Transform - pos: -65.5,-54.5 - parent: 12 - - uid: 32156 - components: - - type: Transform - pos: -64.5,-54.5 - parent: 12 - - uid: 32157 - components: - - type: Transform - pos: -63.5,-54.5 - parent: 12 - - uid: 32158 - components: - - type: Transform - pos: -62.5,-54.5 - parent: 12 - - uid: 32159 - components: - - type: Transform - pos: -62.5,-55.5 - parent: 12 - - uid: 32169 - components: - - type: Transform - pos: -58.5,-56.5 - parent: 12 - - uid: 32170 - components: - - type: Transform - pos: -58.5,-57.5 - parent: 12 - - uid: 32172 - components: - - type: Transform - pos: -57.5,-58.5 - parent: 12 - - uid: 32175 - components: - - type: Transform - pos: -56.5,-58.5 - parent: 12 - - uid: 32176 - components: - - type: Transform - pos: -59.5,-57.5 - parent: 12 - - uid: 32177 - components: - - type: Transform - pos: -60.5,-57.5 - parent: 12 - - uid: 32178 - components: - - type: Transform - pos: -60.5,-56.5 - parent: 12 - - uid: 32179 - components: - - type: Transform - pos: -60.5,-55.5 - parent: 12 - - uid: 32180 - components: - - type: Transform - pos: -61.5,-55.5 - parent: 12 - - uid: 32181 - components: - - type: Transform - pos: -55.5,-58.5 - parent: 12 - proto: CableHVStack entities: - uid: 353 @@ -66935,11 +66657,6 @@ entities: - type: Transform pos: -33.5,-57.5 parent: 12 - - uid: 31023 - components: - - type: Transform - pos: -61.5,-53.5 - parent: 12 - uid: 31295 components: - type: Transform @@ -67120,31 +66837,6 @@ entities: - type: Transform pos: 49.5,54.5 parent: 12 - - uid: 32160 - components: - - type: Transform - pos: -62.5,-55.5 - parent: 12 - - uid: 32161 - components: - - type: Transform - pos: -61.5,-55.5 - parent: 12 - - uid: 32162 - components: - - type: Transform - pos: -61.5,-54.5 - parent: 12 - - uid: 32165 - components: - - type: Transform - pos: -62.5,-53.5 - parent: 12 - - uid: 32166 - components: - - type: Transform - pos: -63.5,-53.5 - parent: 12 - proto: CableMVStack entities: - uid: 5999 @@ -67274,7 +66966,7 @@ entities: - uid: 13090 components: - type: Transform - pos: 56.215126,38.011414 + pos: 56.275406,37.942432 parent: 12 - uid: 13095 components: @@ -67294,7 +66986,7 @@ entities: - uid: 13252 components: - type: Transform - pos: 56.166515,36.49058 + pos: 56.26499,37.33827 parent: 12 - uid: 13254 components: @@ -71868,6 +71560,11 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,31.5 parent: 12 + - uid: 10820 + components: + - type: Transform + pos: -57.5,-47.5 + parent: 12 - uid: 10835 components: - type: Transform @@ -74072,12 +73769,22 @@ entities: - type: Transform pos: -26.5,23.5 parent: 12 + - uid: 25822 + components: + - type: Transform + pos: -55.5,-50.5 + parent: 12 - uid: 26236 components: - type: Transform rot: 3.141592653589793 rad pos: -20.5,59.5 parent: 12 + - uid: 26379 + components: + - type: Transform + pos: -50.5,-46.5 + parent: 12 - uid: 26414 components: - type: Transform @@ -74255,11 +73962,6 @@ entities: - type: Transform pos: -40.5,-52.5 parent: 12 - - uid: 27665 - components: - - type: Transform - pos: -41.5,-52.5 - parent: 12 - uid: 27666 components: - type: Transform @@ -75130,12 +74832,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-66.5 parent: 12 - - uid: 29082 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -34.5,-62.5 - parent: 12 - uid: 29085 components: - type: Transform @@ -75618,6 +75314,11 @@ entities: - type: Transform pos: -43.5,68.5 parent: 12 + - uid: 30301 + components: + - type: Transform + pos: -57.5,-48.5 + parent: 12 - uid: 30473 components: - type: Transform @@ -75928,6 +75629,36 @@ entities: - type: Transform pos: 3.5,-50.5 parent: 12 + - uid: 31024 + components: + - type: Transform + pos: -57.5,-45.5 + parent: 12 + - uid: 31031 + components: + - type: Transform + pos: -57.5,-54.5 + parent: 12 + - uid: 31032 + components: + - type: Transform + pos: -55.5,-49.5 + parent: 12 + - uid: 31035 + components: + - type: Transform + pos: -57.5,-44.5 + parent: 12 + - uid: 31039 + components: + - type: Transform + pos: -55.5,-51.5 + parent: 12 + - uid: 31041 + components: + - type: Transform + pos: -57.5,-43.5 + parent: 12 - uid: 31270 components: - type: Transform @@ -75964,31 +75695,6 @@ entities: rot: 1.5707963267948966 rad pos: 35.5,-15.5 parent: 12 - - uid: 32133 - components: - - type: Transform - pos: -61.5,-55.5 - parent: 12 - - uid: 32134 - components: - - type: Transform - pos: -61.5,-59.5 - parent: 12 - - uid: 32135 - components: - - type: Transform - pos: -60.5,-59.5 - parent: 12 - - uid: 32136 - components: - - type: Transform - pos: -59.5,-59.5 - parent: 12 - - uid: 32174 - components: - - type: Transform - pos: -62.5,-55.5 - parent: 12 - proto: Cautery entities: - uid: 9752 @@ -80052,13 +79758,6 @@ entities: - type: Transform pos: -21.667349,-7.343448 parent: 12 -- proto: ClothingHeadHelmetEVA - entities: - - uid: 32167 - components: - - type: Transform - pos: -61.5426,-52.550335 - parent: 12 - proto: ClothingHeadHelmetRiot entities: - uid: 20866 @@ -80244,7 +79943,8 @@ entities: - uid: 32127 components: - type: Transform - pos: -63.43215,-50.381607 + rot: -6.283185307179586 rad + pos: -60.515457,-50.51032 parent: 12 - proto: ClothingNeckCloakTrans entities: @@ -80479,13 +80179,6 @@ entities: - type: Transform pos: -11.945792,60.527626 parent: 12 -- proto: ClothingOuterHardsuitEVA - entities: - - uid: 32142 - components: - - type: Transform - pos: -62.521767,-52.550335 - parent: 12 - proto: ClothingOuterHoodieBlack entities: - uid: 25982 @@ -95648,13 +95341,6 @@ entities: - type: Transform pos: -33.231888,44.587296 parent: 12 -- proto: DrinkCogChampBase - entities: - - uid: 31114 - components: - - type: Transform - pos: -57.4781,-55.502342 - parent: 12 - proto: DrinkColaCan entities: - uid: 13334 @@ -96047,7 +95733,12 @@ entities: - uid: 13325 components: - type: Transform - pos: 44.5166,29.691267 + pos: 44.358738,29.577848 + parent: 12 + - uid: 26293 + components: + - type: Transform + pos: 44.139988,29.75493 parent: 12 - proto: DrinkTeaGlass entities: @@ -97173,10 +96864,10 @@ entities: parent: 12 - proto: EpinephrineChemistryBottle entities: - - uid: 17614 + - uid: 30546 components: - type: Transform - pos: -52.83247,28.80966 + pos: -52.860172,28.779083 parent: 12 - proto: ExosuitFabricator entities: @@ -102844,11 +102535,6 @@ entities: - type: Transform pos: -34.115353,-56.58399 parent: 12 - - uid: 32189 - components: - - type: Transform - pos: -60.632877,-54.815796 - parent: 12 - proto: FoodFrozenSnowcone entities: - uid: 22491 @@ -102970,6 +102656,13 @@ entities: - type: Transform pos: -30.5,-58.5 parent: 12 +- proto: FoodPizzaUraniumSlice + entities: + - uid: 30340 + components: + - type: Transform + pos: -40.483036,-56.420677 + parent: 12 - proto: FoodPlate entities: - uid: 15048 @@ -103108,11 +102801,6 @@ entities: - type: Transform pos: -29.443712,-54.018364 parent: 12 - - uid: 32191 - components: - - type: Transform - pos: -61.584267,-54.808846 - parent: 12 - proto: FoodPotato entities: - uid: 31464 @@ -103233,11 +102921,6 @@ entities: - type: Transform pos: -28.587122,-59.26843 parent: 12 - - uid: 32192 - components: - - type: Transform - pos: -61.132877,-54.03053 - parent: 12 - proto: Football entities: - uid: 22487 @@ -103311,6 +102994,8 @@ entities: rot: -1.5707963267948966 rad pos: -12.5,-56.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 18269 components: - type: Transform @@ -103858,6 +103543,8 @@ entities: rot: 3.141592653589793 rad pos: -13.5,-56.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 2812 components: - type: Transform @@ -106644,6 +106331,8 @@ entities: - type: Transform pos: -11.5,-55.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 3505 components: - type: Transform @@ -108426,6 +108115,8 @@ entities: rot: -1.5707963267948966 rad pos: -12.5,-55.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 2814 components: - type: Transform @@ -129868,12 +129559,16 @@ entities: rot: 1.5707963267948966 rad pos: -13.5,-55.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 2810 components: - type: Transform rot: 3.141592653589793 rad pos: -11.5,-56.5 parent: 12 + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 2811 components: - type: Transform @@ -133174,7 +132869,7 @@ entities: pos: -10.5,-55.5 parent: 12 - type: AtmosPipeColor - color: '#0055CCFF' + color: '#03FCD3FF' - uid: 4092 components: - type: MetaData @@ -133297,6 +132992,8 @@ entities: targetTemperature: 100 - type: ApcPowerReceiver powerDisabled: False + - type: AtmosPipeColor + color: '#03FCD3FF' - uid: 2960 components: - type: Transform @@ -137325,12 +137022,6 @@ entities: - type: Transform pos: -33.5,-55.5 parent: 12 - - uid: 31113 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -64.5,-54.5 - parent: 12 - uid: 31439 components: - type: Transform @@ -138275,18 +137966,6 @@ entities: - type: Transform pos: 11.5,3.5 parent: 12 - - uid: 1613 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,63.5 - parent: 12 - - uid: 1764 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -38.5,62.5 - parent: 12 - uid: 1885 components: - type: Transform @@ -141765,6 +141444,11 @@ entities: - type: Transform pos: -54.5,75.5 parent: 12 + - uid: 13322 + components: + - type: Transform + pos: -57.5,-56.5 + parent: 12 - uid: 13991 components: - type: Transform @@ -143096,6 +142780,11 @@ entities: - type: Transform pos: -59.5,35.5 parent: 12 + - uid: 17614 + components: + - type: Transform + pos: -55.5,-56.5 + parent: 12 - uid: 17811 components: - type: Transform @@ -143125,11 +142814,6 @@ entities: rot: 1.5707963267948966 rad pos: -44.5,48.5 parent: 12 - - uid: 18315 - components: - - type: Transform - pos: -61.5,-57.5 - parent: 12 - uid: 18561 components: - type: Transform @@ -143744,12 +143428,6 @@ entities: - type: Transform pos: -26.5,74.5 parent: 12 - - uid: 25452 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,62.5 - parent: 12 - uid: 25489 components: - type: Transform @@ -144105,76 +143783,16 @@ entities: - type: Transform pos: -22.5,3.5 parent: 12 - - uid: 26291 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -35.5,70.5 - parent: 12 - - uid: 26293 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -33.5,70.5 - parent: 12 - - uid: 26298 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -36.5,70.5 - parent: 12 - uid: 26303 components: - type: Transform pos: -25.5,62.5 parent: 12 - - uid: 26304 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -32.5,70.5 - parent: 12 - - uid: 26305 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -31.5,70.5 - parent: 12 - - uid: 26306 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -37.5,70.5 - parent: 12 - - uid: 26307 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,69.5 - parent: 12 - uid: 26322 components: - type: Transform pos: -0.5,-31.5 parent: 12 - - uid: 26377 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,65.5 - parent: 12 - - uid: 26378 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,66.5 - parent: 12 - - uid: 26379 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,68.5 - parent: 12 - uid: 26396 components: - type: Transform @@ -144195,12 +143813,6 @@ entities: - type: Transform pos: 24.5,90.5 parent: 12 - - uid: 26413 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,67.5 - parent: 12 - uid: 26420 components: - type: Transform @@ -144258,12 +143870,6 @@ entities: - type: Transform pos: 14.5,-13.5 parent: 12 - - uid: 26610 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,70.5 - parent: 12 - uid: 26620 components: - type: Transform @@ -144321,18 +143927,6 @@ entities: - type: Transform pos: 29.5,-29.5 parent: 12 - - uid: 26758 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -38.5,70.5 - parent: 12 - - uid: 26866 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -39.5,64.5 - parent: 12 - uid: 26945 components: - type: Transform @@ -144538,12 +144132,6 @@ entities: rot: 1.5707963267948966 rad pos: -37.5,-70.5 parent: 12 - - uid: 27910 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -34.5,70.5 - parent: 12 - uid: 27915 components: - type: Transform @@ -145100,11 +144688,6 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,-40.5 parent: 12 - - uid: 29978 - components: - - type: Transform - pos: -59.5,-57.5 - parent: 12 - uid: 29998 components: - type: Transform @@ -145720,6 +145303,11 @@ entities: rot: 3.141592653589793 rad pos: -2.5,76.5 parent: 12 + - uid: 30491 + components: + - type: Transform + pos: -49.5,-56.5 + parent: 12 - uid: 30509 components: - type: Transform @@ -145760,6 +145348,16 @@ entities: - type: Transform pos: -28.5,-60.5 parent: 12 + - uid: 30547 + components: + - type: Transform + pos: -39.5,66.5 + parent: 12 + - uid: 30549 + components: + - type: Transform + pos: -38.5,70.5 + parent: 12 - uid: 30555 components: - type: Transform @@ -145790,17 +145388,62 @@ entities: - type: Transform pos: -29.5,-52.5 parent: 12 + - uid: 30572 + components: + - type: Transform + pos: -39.5,67.5 + parent: 12 - uid: 30580 components: - type: Transform rot: 3.141592653589793 rad pos: -27.5,-56.5 parent: 12 + - uid: 30582 + components: + - type: Transform + pos: -35.5,70.5 + parent: 12 - uid: 30584 components: - type: Transform pos: -29.5,-60.5 parent: 12 + - uid: 30834 + components: + - type: Transform + pos: -37.5,70.5 + parent: 12 + - uid: 30875 + components: + - type: Transform + pos: -34.5,70.5 + parent: 12 + - uid: 30965 + components: + - type: Transform + pos: -39.5,70.5 + parent: 12 + - uid: 30966 + components: + - type: Transform + pos: -38.5,62.5 + parent: 12 + - uid: 30967 + components: + - type: Transform + pos: -33.5,70.5 + parent: 12 + - uid: 30968 + components: + - type: Transform + pos: -39.5,69.5 + parent: 12 + - uid: 30969 + components: + - type: Transform + pos: -39.5,65.5 + parent: 12 - uid: 30971 components: - type: Transform @@ -145831,76 +145474,50 @@ entities: - type: Transform pos: -54.5,-46.5 parent: 12 - - uid: 31029 - components: - - type: Transform - pos: -26.5,-58.5 - parent: 12 - - uid: 31076 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -40.5,-56.5 - parent: 12 - - uid: 31077 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -41.5,-56.5 - parent: 12 - - uid: 31078 + - uid: 31000 components: - type: Transform - rot: 3.141592653589793 rad - pos: -42.5,-56.5 + pos: -39.5,64.5 parent: 12 - - uid: 31079 + - uid: 31001 components: - type: Transform - rot: 3.141592653589793 rad - pos: -43.5,-56.5 + pos: -39.5,62.5 parent: 12 - - uid: 31080 + - uid: 31002 components: - type: Transform - rot: 3.141592653589793 rad - pos: -44.5,-56.5 + pos: -39.5,63.5 parent: 12 - - uid: 31081 + - uid: 31008 components: - type: Transform - rot: 3.141592653589793 rad - pos: -45.5,-56.5 + pos: -31.5,70.5 parent: 12 - - uid: 31082 + - uid: 31013 components: - type: Transform - rot: 3.141592653589793 rad - pos: -46.5,-56.5 + pos: -32.5,70.5 parent: 12 - - uid: 31083 + - uid: 31015 components: - type: Transform - rot: 3.141592653589793 rad - pos: -50.5,-56.5 + pos: -39.5,68.5 parent: 12 - - uid: 31084 + - uid: 31016 components: - type: Transform - rot: 3.141592653589793 rad - pos: -51.5,-53.5 + pos: -36.5,70.5 parent: 12 - - uid: 31085 + - uid: 31021 components: - type: Transform - rot: 3.141592653589793 rad pos: -61.5,-46.5 parent: 12 - - uid: 31086 + - uid: 31029 components: - type: Transform - rot: 3.141592653589793 rad - pos: -61.5,-45.5 + pos: -26.5,-58.5 parent: 12 - uid: 31087 components: @@ -145956,16 +145573,6 @@ entities: rot: 3.141592653589793 rad pos: -56.5,-41.5 parent: 12 - - uid: 31101 - components: - - type: Transform - pos: -53.5,-56.5 - parent: 12 - - uid: 31102 - components: - - type: Transform - pos: -49.5,-56.5 - parent: 12 - uid: 31163 components: - type: Transform @@ -146086,11 +145693,6 @@ entities: - type: Transform pos: 41.5,-18.5 parent: 12 - - uid: 32121 - components: - - type: Transform - pos: -63.5,-54.5 - parent: 12 - proto: GrilleBroken entities: - uid: 3719 @@ -146113,6 +145715,11 @@ entities: - type: Transform pos: -1.5,15.5 parent: 12 + - uid: 11397 + components: + - type: Transform + pos: -54.5,-56.5 + parent: 12 - uid: 12027 components: - type: Transform @@ -146123,11 +145730,26 @@ entities: - type: Transform pos: 48.5,-2.5 parent: 12 + - uid: 18315 + components: + - type: Transform + pos: -42.5,-59.5 + parent: 12 + - uid: 23167 + components: + - type: Transform + pos: -56.5,-56.5 + parent: 12 - uid: 28921 components: - type: Transform pos: 32.5,10.5 parent: 12 + - uid: 29064 + components: + - type: Transform + pos: -58.5,-56.5 + parent: 12 - uid: 30492 components: - type: Transform @@ -146153,51 +145775,25 @@ entities: - type: Transform pos: -29.5,-55.5 parent: 12 - - uid: 31096 + - uid: 31022 components: - type: Transform - rot: 3.141592653589793 rad pos: -61.5,-47.5 parent: 12 - - uid: 31097 - components: - - type: Transform - pos: -61.5,-49.5 - parent: 12 - - uid: 31098 - components: - - type: Transform - pos: -54.5,-56.5 - parent: 12 - - uid: 31099 - components: - - type: Transform - pos: -53.5,-55.5 - parent: 12 - - uid: 31100 - components: - - type: Transform - pos: -52.5,-56.5 - parent: 12 - - uid: 31103 - components: - - type: Transform - pos: -47.5,-56.5 - parent: 12 - - uid: 31104 + - uid: 31023 components: - type: Transform - pos: -51.5,-56.5 + pos: -59.5,-56.5 parent: 12 - - uid: 31105 + - uid: 31028 components: - type: Transform - pos: -48.5,-56.5 + pos: -50.5,-56.5 parent: 12 - - uid: 31106 + - uid: 31033 components: - type: Transform - pos: -52.5,-53.5 + pos: -61.5,-45.5 parent: 12 - proto: GrilleDiagonal entities: @@ -149144,11 +148740,6 @@ entities: - type: Transform pos: 53.5,25.5 parent: 12 - - uid: 29064 - components: - - type: Transform - pos: -62.5,-54.5 - parent: 12 - proto: MagazinePistolSubMachineGunTopMounted entities: - uid: 27841 @@ -149752,11 +149343,6 @@ entities: parent: 12 - proto: Mattress entities: - - uid: 29008 - components: - - type: Transform - pos: -61.5,-52.5 - parent: 12 - uid: 29146 components: - type: Transform @@ -150011,7 +149597,7 @@ entities: - uid: 32188 components: - type: Transform - pos: -63.506554,-50.71072 + pos: -50.514328,-53.502277 parent: 12 - proto: Mirror entities: @@ -151530,7 +151116,7 @@ entities: - uid: 13335 components: - type: Transform - pos: 56.52551,36.441574 + pos: 56.98374,36.64035 parent: 12 - uid: 13622 components: @@ -152095,14 +151681,6 @@ entities: rot: -12.566370614359172 rad pos: -11.731569,-12.627775 parent: 12 -- proto: PlushieRatvar - entities: - - uid: 11397 - components: - - type: Transform - rot: -62.83185307179591 rad - pos: -64.51839,-52.561867 - parent: 12 - proto: PlushieSharkBlue entities: - uid: 4060 @@ -152213,14 +151791,6 @@ entities: - type: Transform pos: 3.5,-47.5 parent: 12 - - uid: 32132 - components: - - type: Transform - anchored: True - pos: -61.5,-55.5 - parent: 12 - - type: Physics - bodyType: Static - proto: PortableGeneratorJrPacmanMachineCircuitboard entities: - uid: 5347 @@ -152372,18 +151942,6 @@ entities: - type: Transform pos: -3.5,-64.5 parent: 12 - - uid: 32145 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -59.5,-55.5 - parent: 12 - - uid: 32146 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -59.5,-58.5 - parent: 12 - proto: PosterContrabandAtmosiaDeclarationIndependence entities: - uid: 23 @@ -155084,18 +154642,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,65.5 parent: 12 - - uid: 17288 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,20.5 - parent: 12 - - uid: 17289 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -53.5,20.5 - parent: 12 - uid: 17333 components: - type: Transform @@ -155454,6 +155000,23 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,49.5 parent: 12 + - uid: 26298 + components: + - type: Transform + pos: 45.5,-44.5 + parent: 12 + - uid: 26377 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -55.5,-49.5 + parent: 12 + - uid: 26378 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -23.5,-66.5 + parent: 12 - uid: 26408 components: - type: Transform @@ -155547,6 +155110,18 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,-7.5 parent: 12 + - uid: 28825 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -56.5,47.5 + parent: 12 + - uid: 29008 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 32.5,69.5 + parent: 12 - uid: 29077 components: - type: Transform @@ -155579,6 +155154,11 @@ entities: rot: 3.141592653589793 rad pos: 56.5,60.5 parent: 12 + - uid: 31027 + components: + - type: Transform + pos: -50.5,22.5 + parent: 12 - uid: 31472 components: - type: Transform @@ -156707,6 +156287,12 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,15.5 parent: 12 + - uid: 31025 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -52.5,17.5 + parent: 12 - uid: 31126 components: - type: Transform @@ -156765,12 +156351,6 @@ entities: powerLoad: 60 - type: DamageOnInteract isDamageActive: False - - uid: 32147 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -61.5,-55.5 - parent: 12 - proto: Protolathe entities: - uid: 2321 @@ -157546,6 +157126,11 @@ entities: - type: Transform pos: -17.5,-61.5 parent: 12 + - uid: 31017 + components: + - type: Transform + pos: -53.5,-47.5 + parent: 12 - uid: 31261 components: - type: Transform @@ -157567,11 +157152,6 @@ entities: rot: 1.5707963267948966 rad pos: 55.5,64.5 parent: 12 - - uid: 32173 - components: - - type: Transform - pos: -62.5,-52.5 - parent: 12 - proto: RadioHandheld entities: - uid: 9805 @@ -159761,11 +159341,6 @@ entities: - type: Transform pos: 45.5,62.5 parent: 12 - - uid: 32193 - components: - - type: Transform - pos: -60.5,-57.5 - parent: 12 - proto: RandomVending entities: - uid: 9099 @@ -160024,20 +159599,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,14.5 parent: 12 -- proto: ReinforcedGirder - entities: - - uid: 4769 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -54.5,-52.5 - parent: 12 - - uid: 31161 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -55.5,-49.5 - parent: 12 - proto: ReinforcedPlasmaWindow entities: - uid: 501 @@ -165614,16 +165175,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-13.5 parent: 12 - - uid: 32117 - components: - - type: Transform - pos: -59.5,-57.5 - parent: 12 - - uid: 32186 - components: - - type: Transform - pos: -63.5,-54.5 - parent: 12 - proto: ReinforcedWindowDiagonal entities: - uid: 19673 @@ -166130,7 +165681,7 @@ entities: - uid: 13323 components: - type: Transform - pos: 44.037434,29.555851 + pos: 43.473324,29.66118 parent: 12 - uid: 23679 components: @@ -166280,6 +165831,11 @@ entities: rot: -43.98229715025713 rad pos: 57.301918,-5.261206 parent: 12 + - uid: 31043 + components: + - type: Transform + pos: 59.707104,12.565823 + parent: 12 - proto: SheetPlastic entities: - uid: 1947 @@ -168709,13 +168265,6 @@ entities: rot: 1.5707963267948966 rad pos: 29.5,49.5 parent: 12 -- proto: SolarAssembly - entities: - - uid: 31075 - components: - - type: Transform - pos: -54.5,-53.5 - parent: 12 - proto: SolarControlComputerCircuitboard entities: - uid: 8834 @@ -169349,12 +168898,6 @@ entities: rot: 1.5707963267948966 rad pos: -28.5,-68.5 parent: 12 - - uid: 10823 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -55.5,-58.5 - parent: 12 - uid: 10953 components: - type: Transform @@ -169959,6 +169502,12 @@ entities: rot: 1.5707963267948966 rad pos: -39.5,-62.5 parent: 12 + - uid: 25581 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -56.5,-52.5 + parent: 12 - uid: 27495 components: - type: Transform @@ -170127,6 +169676,12 @@ entities: rot: 1.5707963267948966 rad pos: -40.5,-62.5 parent: 12 + - uid: 30181 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -56.5,-54.5 + parent: 12 - uid: 31009 components: - type: Transform @@ -170157,32 +169712,11 @@ entities: rot: -1.5707963267948966 rad pos: -58.5,-43.5 parent: 12 - - uid: 31016 + - uid: 31040 components: - type: Transform rot: -1.5707963267948966 rad - pos: -58.5,-52.5 - parent: 12 - - uid: 32148 - components: - - type: Transform - pos: -65.5,-57.5 - parent: 12 - - uid: 32150 - components: - - type: Transform - pos: -65.5,-54.5 - parent: 12 - - uid: 32151 - components: - - type: Transform - pos: -65.5,-56.5 - parent: 12 - - uid: 32183 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -57.5,-58.5 + pos: -56.5,-43.5 parent: 12 - proto: SolarPanelBroken entities: @@ -170191,6 +169725,12 @@ entities: - type: Transform pos: -38.5,-66.5 parent: 12 + - uid: 10821 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -56.5,-53.5 + parent: 12 - uid: 24256 components: - type: Transform @@ -170216,29 +169756,17 @@ entities: - type: Transform pos: -30.5,-68.5 parent: 12 - - uid: 30875 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -58.5,-56.5 - parent: 12 - - uid: 31000 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -56.5,-54.5 - parent: 12 - - uid: 31001 + - uid: 30306 components: - type: Transform rot: -1.5707963267948966 rad - pos: -58.5,-53.5 + pos: -58.5,-44.5 parent: 12 - - uid: 31002 + - uid: 30437 components: - type: Transform rot: -1.5707963267948966 rad - pos: -56.5,-56.5 + pos: -58.5,-54.5 parent: 12 - uid: 31003 components: @@ -170270,22 +169798,11 @@ entities: rot: -1.5707963267948966 rad pos: -58.5,-46.5 parent: 12 - - uid: 31008 + - uid: 31037 components: - type: Transform rot: -1.5707963267948966 rad - pos: -56.5,-43.5 - parent: 12 - - uid: 32149 - components: - - type: Transform - pos: -65.5,-55.5 - parent: 12 - - uid: 32184 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -56.5,-58.5 + pos: -58.5,-52.5 parent: 12 - proto: SolarTracker entities: @@ -170309,10 +169826,12 @@ entities: - type: Transform pos: -25.5,-69.5 parent: 12 - - uid: 31017 +- proto: SolarTrackerElectronics + entities: + - uid: 13308 components: - type: Transform - pos: -61.5,-50.5 + pos: -53.441116,-47.48533 parent: 12 - proto: SolidSecretDoor entities: @@ -171368,11 +170887,6 @@ entities: rot: -12.566370614359172 rad pos: -8.433574,-66.54101 parent: 12 - - uid: 32143 - components: - - type: Transform - pos: -62.424545,-53.537132 - parent: 12 - proto: Spoon entities: - uid: 23545 @@ -172741,11 +172255,6 @@ entities: - type: Transform pos: -36.5,-50.5 parent: 12 - - uid: 32116 - components: - - type: Transform - pos: -62.5,-55.5 - parent: 12 - proto: SuitStorageCaptain entities: - uid: 18757 @@ -173168,17 +172677,6 @@ entities: - SurveillanceCameraEngineering nameSet: True id: Atmos lockers/engi hallway - - uid: 7157 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,17.5 - parent: 12 - - type: SurveillanceCamera - setupAvailableNetworks: - - SurveillanceCameraEngineering - nameSet: True - id: TEG West - uid: 9821 components: - type: Transform @@ -173447,17 +172945,6 @@ entities: - SurveillanceCameraEngineering nameSet: True id: Southeast solars 2 - - uid: 28825 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -52.5,-47.5 - parent: 12 - - type: SurveillanceCamera - setupAvailableNetworks: - - SurveillanceCameraEngineering - nameSet: True - id: Southwest solars - uid: 31882 components: - type: Transform @@ -179075,7 +178562,7 @@ entities: - uid: 12618 components: - type: Transform - pos: 57.698708,36.671814 + pos: 57.535824,36.64035 parent: 12 - uid: 23411 components: @@ -179351,11 +178838,6 @@ entities: - type: Transform pos: -29.544153,-55.516808 parent: 12 - - uid: 32190 - components: - - type: Transform - pos: -60.494305,-59.53066 - parent: 12 - proto: TrashBananaPeel entities: - uid: 9367 @@ -193563,11 +193045,6 @@ entities: rot: -1.5707963267948966 rad pos: 36.5,22.5 parent: 12 - - uid: 10822 - components: - - type: Transform - pos: -59.5,-58.5 - parent: 12 - uid: 10887 components: - type: Transform @@ -197492,11 +196969,6 @@ entities: - type: Transform pos: -3.5,-48.5 parent: 12 - - uid: 23167 - components: - - type: Transform - pos: -59.5,-55.5 - parent: 12 - uid: 23174 components: - type: Transform @@ -198799,21 +198271,6 @@ entities: rot: 3.141592653589793 rad pos: -27.5,-55.5 parent: 12 - - uid: 31028 - components: - - type: Transform - pos: -63.5,-55.5 - parent: 12 - - uid: 31030 - components: - - type: Transform - pos: -61.5,-56.5 - parent: 12 - - uid: 31050 - components: - - type: Transform - pos: -63.5,-53.5 - parent: 12 - uid: 31180 components: - type: Transform @@ -199070,11 +198527,6 @@ entities: rot: 3.141592653589793 rad pos: -45.5,69.5 parent: 12 - - uid: 9631 - components: - - type: Transform - pos: -60.5,-51.5 - parent: 12 - uid: 9671 components: - type: Transform @@ -199086,16 +198538,6 @@ entities: - type: Transform pos: 46.5,-37.5 parent: 12 - - uid: 10820 - components: - - type: Transform - pos: -59.5,-52.5 - parent: 12 - - uid: 11027 - components: - - type: Transform - pos: -59.5,-56.5 - parent: 12 - uid: 11332 components: - type: Transform @@ -200229,11 +199671,6 @@ entities: - type: Transform pos: -27.5,-58.5 parent: 12 - - uid: 31021 - components: - - type: Transform - pos: -62.5,-56.5 - parent: 12 - uid: 31044 components: - type: Transform @@ -200296,17 +199733,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-62.5 parent: 12 - - uid: 32120 - components: - - type: Transform - pos: -61.5,-58.5 - parent: 12 - - uid: 32164 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -59.5,-54.5 - parent: 12 - proto: WallWood entities: - uid: 11826 @@ -202765,11 +202191,6 @@ entities: - type: Transform pos: 41.5,-18.5 parent: 12 - - uid: 32118 - components: - - type: Transform - pos: -61.5,-57.5 - parent: 12 - proto: WindowDirectional entities: - uid: 7837 From 8257dc87decd462575a2dccec240aa1bf5c96512 Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Fri, 8 Nov 2024 10:01:57 +1200 Subject: [PATCH 094/130] Meta map: remove arrivals chair, changed maints shotgun to beanbag rounds (#32981) remove chair + changed maints db to rubber --- Resources/Maps/meta.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index 1f210e438ad..93a6bc31c42 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -10880,7 +10880,7 @@ entities: pos: -42.5,29.5 parent: 5350 - type: Door - secondsUntilStateChange: -5745.716 + secondsUntilStateChange: -5834.8745 state: Opening - type: DeviceLinkSink invokeCounter: 2 @@ -56106,11 +56106,6 @@ entities: rot: -1.5707963267948966 rad pos: -73.5,7.5 parent: 5350 - - uid: 6164 - components: - - type: Transform - pos: -71.5,-8.5 - parent: 5350 - uid: 6165 components: - type: Transform From d13765fa5cbfc6cf226f936b2407729b6126a6e2 Mon Sep 17 00:00:00 2001 From: PopGamer46 Date: Thu, 7 Nov 2024 23:02:24 +0100 Subject: [PATCH 095/130] Fixes Lambordeere bolt buttons not being connected (#33065) * fix * oops, used savemap instead of savegrid --- Resources/Maps/Shuttles/ShuttleEvent/lambordeere.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Maps/Shuttles/ShuttleEvent/lambordeere.yml b/Resources/Maps/Shuttles/ShuttleEvent/lambordeere.yml index 56624fcd3b8..fcb40acdf45 100644 --- a/Resources/Maps/Shuttles/ShuttleEvent/lambordeere.yml +++ b/Resources/Maps/Shuttles/ShuttleEvent/lambordeere.yml @@ -1206,6 +1206,10 @@ entities: rot: 1.5707963267948966 rad pos: 0.5,5.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 50: + - Pressed: DoorBolt - uid: 199 components: - type: MetaData @@ -1214,6 +1218,10 @@ entities: rot: 1.5707963267948966 rad pos: 0.5,2.5 parent: 1 + - type: DeviceLinkSource + linkedPorts: + 82: + - Pressed: DoorBolt - proto: SMESBasic entities: - uid: 65 From 03723afee68483b59bf88d4362bc76cc8c8147c6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 7 Nov 2024 22:03:35 +0000 Subject: [PATCH 096/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 25dd61eb683..34a2d143584 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Mantles are now available in loadouts, requiring 20 hours of that head - of department's time. - type: Add - - message: Mantles are no longer spawned in dressers or able to be printed at uniform - lathes. - type: Remove - id: 7098 - time: '2024-08-12T07:14:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30929 - author: LeoSantich changes: - message: Updated 'narsie' and 'ratvar' to 'Nar'Sie' and 'Ratvar' in randomly generated @@ -3953,3 +3942,10 @@ id: 7597 time: '2024-11-06T14:39:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31292 +- author: PopGamer46 + changes: + - message: Fixed Lambordeere (botany shuttle) bolt buttons not being connected + type: Fix + id: 7598 + time: '2024-11-07T22:02:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33065 From 9ee47b927b59d709dd905dbf27bd056861854e9a Mon Sep 17 00:00:00 2001 From: scrivoy <179060466+scrivoy@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:18:12 +0100 Subject: [PATCH 097/130] Core Station: Telecoms air alarm connection to atmos devices (#33214) link air alarm in coms room --- Resources/Maps/core.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Resources/Maps/core.yml b/Resources/Maps/core.yml index 2198854499e..119279ba2d0 100644 --- a/Resources/Maps/core.yml +++ b/Resources/Maps/core.yml @@ -12942,6 +12942,10 @@ entities: rot: -1.5707963267948966 rad pos: 30.5,-42.5 parent: 2 + - type: DeviceList + devices: + - 20006 + - 20005 - uid: 8436 components: - type: Transform @@ -95461,6 +95465,11 @@ entities: rot: 1.5707963267948966 rad pos: 26.5,-42.5 parent: 2 + - type: DeviceNetwork + configurators: + - invalid + deviceLists: + - 8434 - type: AtmosPipeColor color: '#0335FCFF' - uid: 20037 @@ -96662,6 +96671,11 @@ entities: rot: 1.5707963267948966 rad pos: 26.5,-45.5 parent: 2 + - type: DeviceNetwork + configurators: + - invalid + deviceLists: + - 8434 - type: AtmosPipeColor color: '#FF1212FF' - uid: 20038 From 6a1d631b14b62f44c4492725bc1a695f6914bb01 Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:23:28 -0700 Subject: [PATCH 098/130] fix invalids core (#33215) fix invalids --- Resources/Maps/core.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Maps/core.yml b/Resources/Maps/core.yml index 119279ba2d0..755badd7574 100644 --- a/Resources/Maps/core.yml +++ b/Resources/Maps/core.yml @@ -95466,8 +95466,6 @@ entities: pos: 26.5,-42.5 parent: 2 - type: DeviceNetwork - configurators: - - invalid deviceLists: - 8434 - type: AtmosPipeColor @@ -96672,8 +96670,6 @@ entities: pos: 26.5,-45.5 parent: 2 - type: DeviceNetwork - configurators: - - invalid deviceLists: - 8434 - type: AtmosPipeColor From 261c18f764b9ad750f2ef0227360cbf9f1d83846 Mon Sep 17 00:00:00 2001 From: SolStar <44028047+ewokswagger@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:29:03 -0500 Subject: [PATCH 099/130] Fix research disk crash (#33205) * Fix reserach disk crash * remove extra whitespace * removed args.handled where args are not handled --- Content.Server/Research/Disk/ResearchDiskSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/Research/Disk/ResearchDiskSystem.cs b/Content.Server/Research/Disk/ResearchDiskSystem.cs index d32c49ce6fe..4d65c19f6e2 100644 --- a/Content.Server/Research/Disk/ResearchDiskSystem.cs +++ b/Content.Server/Research/Disk/ResearchDiskSystem.cs @@ -31,6 +31,7 @@ private void OnAfterInteract(EntityUid uid, ResearchDiskComponent component, Aft _research.ModifyServerPoints(args.Target.Value, component.Points, server); _popupSystem.PopupEntity(Loc.GetString("research-disk-inserted", ("points", component.Points)), args.Target.Value, args.User); EntityManager.QueueDeleteEntity(uid); + args.Handled = true; } private void OnMapInit(EntityUid uid, ResearchDiskComponent component, MapInitEvent args) From 012855475e38d1a05df6263f356e0d0805aa7237 Mon Sep 17 00:00:00 2001 From: FN <37689533+FireNameFN@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:59:05 +0700 Subject: [PATCH 100/130] Fix cursed mask bug (#33014) * One line fix * Removed redundant using * Allocation improvement --- Content.Server/Clothing/Systems/CursedMaskSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Clothing/Systems/CursedMaskSystem.cs b/Content.Server/Clothing/Systems/CursedMaskSystem.cs index 825e85e2c60..86d4e801a8b 100644 --- a/Content.Server/Clothing/Systems/CursedMaskSystem.cs +++ b/Content.Server/Clothing/Systems/CursedMaskSystem.cs @@ -51,7 +51,8 @@ protected override void TryTakeover(Entity ent, EntityUid w } var npcFaction = EnsureComp(wearer); - ent.Comp.OldFactions = npcFaction.Factions; + ent.Comp.OldFactions.Clear(); + ent.Comp.OldFactions.UnionWith(npcFaction.Factions); _npcFaction.ClearFactions((wearer, npcFaction), false); _npcFaction.AddFaction((wearer, npcFaction), ent.Comp.CursedMaskFaction); From 667daa168f9ae9e6c63dfed4714baa89f24a3bfd Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:38:41 +0000 Subject: [PATCH 101/130] pass Actor to cartridge messages (#33210) * pass Actor to cartridge messages * NonSerialized gaming --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs | 1 + Content.Shared/CartridgeLoader/CartridgeUiMessage.cs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs index 7caec6150ed..98df7e2c503 100644 --- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs @@ -428,6 +428,7 @@ private void OnUiMessage(EntityUid uid, CartridgeLoaderComponent component, Cart { var cartridgeEvent = args.MessageEvent; cartridgeEvent.LoaderUid = GetNetEntity(uid); + cartridgeEvent.Actor = args.Actor; RelayEvent(component, cartridgeEvent, true); } diff --git a/Content.Shared/CartridgeLoader/CartridgeUiMessage.cs b/Content.Shared/CartridgeLoader/CartridgeUiMessage.cs index 1155030f938..31ac8bd2d06 100644 --- a/Content.Shared/CartridgeLoader/CartridgeUiMessage.cs +++ b/Content.Shared/CartridgeLoader/CartridgeUiMessage.cs @@ -17,4 +17,7 @@ public CartridgeUiMessage(CartridgeMessageEvent messageEvent) public abstract class CartridgeMessageEvent : EntityEventArgs { public NetEntity LoaderUid; + + [NonSerialized] + public EntityUid Actor; } From 80e148c265dc8602f50e3941dbd94bb396a1f5b5 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:15:41 +0000 Subject: [PATCH 102/130] cham projector fixes/rewrite (#27111) * cant disguise to thing in a container * copy cigarette visualiser * prevent aghost throwing an error * make disguises die in space * fuck it rewrite it to not use polymorph * fix action troll * oop * add vebr * add access to the components * 2/3 * fix * relay damage from disguise to user * fix integrity * :trollface: * :trollface: * m * kill integrity * fix a bug * review * remove them from component * relay flash effect to the disguise * fix icon being weird * change method since multiple systems cant handle same network event * :trollface: * actually network Disguise real --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Effects/ColorFlashEffectSystem.cs | 10 + .../Systems/ChameleonProjectorSystem.cs | 30 +++ .../Systems/ChameleonProjectorSystem.cs | 96 +------- .../Components/ChameleonDisguiseComponent.cs | 16 +- .../Components/ChameleonDisguisedComponent.cs | 25 ++ .../Components/ChameleonProjectorComponent.cs | 19 +- .../Systems/SharedChameleonProjectorSystem.cs | 227 ++++++++++++++++-- .../chameleon-projector.ftl | 2 + .../Objects/Devices/chameleon_projector.yml | 24 +- 9 files changed, 310 insertions(+), 139 deletions(-) create mode 100644 Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs diff --git a/Content.Client/Effects/ColorFlashEffectSystem.cs b/Content.Client/Effects/ColorFlashEffectSystem.cs index 956c9465244..b584aa9ad1b 100644 --- a/Content.Client/Effects/ColorFlashEffectSystem.cs +++ b/Content.Client/Effects/ColorFlashEffectSystem.cs @@ -124,6 +124,10 @@ private void OnColorFlashEffect(ColorFlashEffectEvent ev) continue; } + var targetEv = new GetFlashEffectTargetEvent(ent); + RaiseLocalEvent(ent, ref targetEv); + ent = targetEv.Target; + EnsureComp(ent, out comp); comp.NetSyncEnabled = false; comp.Color = sprite.Color; @@ -132,3 +136,9 @@ private void OnColorFlashEffect(ColorFlashEffectEvent ev) } } } + +/// +/// Raised on an entity to change the target for a color flash effect. +/// +[ByRefEvent] +public record struct GetFlashEffectTargetEvent(EntityUid Target); diff --git a/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs b/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs index 5ba4878c6d4..8ba09c66170 100644 --- a/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs +++ b/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs @@ -1,7 +1,10 @@ +using Content.Client.Effects; +using Content.Client.Smoking; using Content.Shared.Chemistry.Components; using Content.Shared.Polymorph.Components; using Content.Shared.Polymorph.Systems; using Robust.Client.GameObjects; +using Robust.Shared.Player; namespace Content.Client.Polymorph.Systems; @@ -10,14 +13,20 @@ public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; private EntityQuery _appearanceQuery; + private EntityQuery _spriteQuery; public override void Initialize() { base.Initialize(); _appearanceQuery = GetEntityQuery(); + _spriteQuery = GetEntityQuery(); SubscribeLocalEvent(OnHandleState); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnGetFlashEffectTargetEvent); } private void OnHandleState(Entity ent, ref AfterAutoHandleStateEvent args) @@ -25,9 +34,30 @@ private void OnHandleState(Entity ent, ref AfterAuto CopyComp(ent); CopyComp(ent); CopyComp(ent); + CopyComp(ent); // reload appearance to hopefully prevent any invisible layers if (_appearanceQuery.TryComp(ent, out var appearance)) _appearance.QueueUpdate(ent, appearance); } + + private void OnStartup(Entity ent, ref ComponentStartup args) + { + if (!_spriteQuery.TryComp(ent, out var sprite)) + return; + + ent.Comp.WasVisible = sprite.Visible; + sprite.Visible = false; + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (_spriteQuery.TryComp(ent, out var sprite)) + sprite.Visible = ent.Comp.WasVisible; + } + + private void OnGetFlashEffectTargetEvent(Entity ent, ref GetFlashEffectTargetEvent args) + { + args.Target = ent.Comp.Disguise; + } } diff --git a/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs index 1586973a21e..ab12f2764cf 100644 --- a/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs +++ b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs @@ -1,99 +1,5 @@ -using Content.Server.Polymorph.Components; -using Content.Shared.Actions; -using Content.Shared.Construction.Components; -using Content.Shared.Hands; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Polymorph; -using Content.Shared.Polymorph.Components; using Content.Shared.Polymorph.Systems; -using Content.Shared.StatusIcon.Components; -using Robust.Shared.Physics.Components; namespace Content.Server.Polymorph.Systems; -public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem -{ - [Dependency] private readonly MetaDataSystem _meta = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; - [Dependency] private readonly PolymorphSystem _polymorph = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedTransformSystem _xform = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnEquippedHand); - SubscribeLocalEvent(OnToggleNoRot); - SubscribeLocalEvent(OnToggleAnchored); - } - - private void OnEquippedHand(Entity ent, ref GotEquippedHandEvent args) - { - if (!TryComp(ent, out var poly)) - return; - - _polymorph.Revert((ent, poly)); - args.Handled = true; - } - - public override void Disguise(ChameleonProjectorComponent proj, EntityUid user, EntityUid entity) - { - if (_polymorph.PolymorphEntity(user, proj.Polymorph) is not {} disguise) - return; - - // make disguise look real (for simple things at least) - var meta = MetaData(entity); - _meta.SetEntityName(disguise, meta.EntityName); - _meta.SetEntityDescription(disguise, meta.EntityDescription); - - var comp = EnsureComp(disguise); - comp.SourceEntity = entity; - comp.SourceProto = Prototype(entity)?.ID; - Dirty(disguise, comp); - - // no sechud trolling - RemComp(disguise); - - _appearance.CopyData(entity, disguise); - - var mass = CompOrNull(entity)?.Mass ?? 0f; - - // let the disguise die when its taken enough damage, which then transfers to the player - // health is proportional to mass, and capped to not be insane - if (TryComp(disguise, out var thresholds)) - { - // if the player is of flesh and blood, cap max health to theirs - // so that when reverting damage scales 1:1 and not round removing - var playerMax = _mobThreshold.GetThresholdForState(user, MobState.Dead).Float(); - var max = playerMax == 0f ? proj.MaxHealth : Math.Max(proj.MaxHealth, playerMax); - - var health = Math.Clamp(mass, proj.MinHealth, proj.MaxHealth); - _mobThreshold.SetMobStateThreshold(disguise, health, MobState.Critical, thresholds); - _mobThreshold.SetMobStateThreshold(disguise, max, MobState.Dead, thresholds); - } - - // add actions for controlling transform aspects - _actions.AddAction(disguise, proj.NoRotAction); - _actions.AddAction(disguise, proj.AnchorAction); - } - - private void OnToggleNoRot(Entity ent, ref DisguiseToggleNoRotEvent args) - { - var xform = Transform(ent); - xform.NoLocalRotation = !xform.NoLocalRotation; - } - - private void OnToggleAnchored(Entity ent, ref DisguiseToggleAnchoredEvent args) - { - var uid = ent.Owner; - var xform = Transform(uid); - if (xform.Anchored) - _xform.Unanchor(uid, xform); - else - _xform.AnchorEntity((uid, xform)); - } -} +public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem; diff --git a/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs index 2b9fba7b391..282106b8f6f 100644 --- a/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs +++ b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Polymorph.Systems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -7,9 +8,22 @@ namespace Content.Shared.Polymorph.Components; /// Component added to disguise entities. /// Used by client to copy over appearance from the disguise's source entity. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedChameleonProjectorSystem))] +[AutoGenerateComponentState(true)] public sealed partial class ChameleonDisguiseComponent : Component { + /// + /// The user of this disguise. + /// + [DataField] + public EntityUid User; + + /// + /// The projector that created this disguise. + /// + [DataField] + public EntityUid Projector; + /// /// The disguise source entity for copying the sprite. /// diff --git a/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs b/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs new file mode 100644 index 00000000000..cd2e26c420a --- /dev/null +++ b/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs @@ -0,0 +1,25 @@ +using Content.Shared.Polymorph.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Polymorph.Components; + +/// +/// Added to a player when they use a chameleon projector. +/// Handles making them invisible and revealing when damaged enough or switching hands. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedChameleonProjectorSystem))] +[AutoGenerateComponentState] +public sealed partial class ChameleonDisguisedComponent : Component +{ + /// + /// The disguise entity parented to the player. + /// + [DataField, AutoNetworkedField] + public EntityUid Disguise; + + /// + /// For client, whether the user's sprite was previously visible or not. + /// + [DataField] + public bool WasVisible; +} diff --git a/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs index 239b5236f27..1b289c54fc7 100644 --- a/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs +++ b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Polymorph; using Content.Shared.Polymorph.Systems; using Content.Shared.Whitelist; using Robust.Shared.Prototypes; @@ -25,22 +24,26 @@ public sealed partial class ChameleonProjectorComponent : Component public EntityWhitelist? Blacklist; /// - /// Polymorph configuration for the disguise entity. + /// Disguise entity to spawn and use. /// [DataField(required: true)] - public PolymorphConfiguration Polymorph = new(); + public EntProtoId DisguiseProto = string.Empty; /// /// Action for disabling your disguise's rotation. /// [DataField] public EntProtoId NoRotAction = "ActionDisguiseNoRot"; + [DataField] + public EntityUid? NoRotActionEntity; /// /// Action for anchoring your disguise in place. /// [DataField] public EntProtoId AnchorAction = "ActionDisguiseAnchor"; + [DataField] + public EntityUid? AnchorActionEntity; /// /// Minimum health to give the disguise. @@ -55,14 +58,8 @@ public sealed partial class ChameleonProjectorComponent : Component public float MaxHealth = 100f; /// - /// Popup shown to the user when they try to disguise as an invalid entity. - /// - [DataField] - public LocId InvalidPopup = "chameleon-projector-invalid"; - - /// - /// Popup shown to the user when they disguise as a valid entity. + /// User currently disguised by this projector, if any /// [DataField] - public LocId SuccessPopup = "chameleon-projector-success"; + public EntityUid? Disguised; } diff --git a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs index 00096b7d409..99737996b08 100644 --- a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs +++ b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs @@ -1,67 +1,264 @@ using Content.Shared.Actions; +using Content.Shared.Coordinates; +using Content.Shared.Damage; +using Content.Shared.Hands; using Content.Shared.Interaction; -using Content.Shared.Polymorph; +using Content.Shared.Item; using Content.Shared.Polymorph.Components; using Content.Shared.Popups; -using Robust.Shared.Serialization.Manager; +using Content.Shared.Storage.Components; +using Content.Shared.Verbs; +using Content.Shared.Whitelist; +using Robust.Shared.Containers; +using Robust.Shared.Network; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; using System.Diagnostics.CodeAnalysis; -using Content.Shared.Whitelist; namespace Content.Shared.Polymorph.Systems; /// -/// Handles whitelist/blacklist checking. -/// Actual polymorphing and deactivation is done serverside. +/// Handles disguise validation, disguising and revealing. +/// Most appearance copying is done clientside. /// public abstract class SharedChameleonProjectorSystem : EntitySystem { + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ISerializationManager _serMan = default!; + [Dependency] private readonly MetaDataSystem _meta = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnDisguiseInteractHand, before: [typeof(SharedItemSystem)]); + SubscribeLocalEvent(OnDisguiseDamaged); + SubscribeLocalEvent(OnDisguiseInsertAttempt); + SubscribeLocalEvent(OnDisguiseShutdown); + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent>(OnGetVerbs); + SubscribeLocalEvent(OnToggleNoRot); + SubscribeLocalEvent(OnToggleAnchored); + SubscribeLocalEvent(OnDeselected); + SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnProjectorShutdown); + } + + #region Disguise entity + + private void OnDisguiseInteractHand(Entity ent, ref InteractHandEvent args) + { + TryReveal(ent.Comp.User); + args.Handled = true; } + private void OnDisguiseDamaged(Entity ent, ref DamageChangedEvent args) + { + // this mirrors damage 1:1 + if (args.DamageDelta is {} damage) + _damageable.TryChangeDamage(ent.Comp.User, damage); + } + + private void OnDisguiseInsertAttempt(Entity ent, ref InsertIntoEntityStorageAttemptEvent args) + { + // stay parented to the user, not the storage + args.Cancelled = true; + } + + private void OnDisguiseShutdown(Entity ent, ref ComponentShutdown args) + { + _actions.RemoveProvidedActions(ent.Comp.User, ent.Comp.Projector); + } + + #endregion + + #region Projector + private void OnInteract(Entity ent, ref AfterInteractEvent args) { - if (!args.CanReach || args.Target is not {} target) + if (args.Handled || !args.CanReach || args.Target is not {} target) return; - var user = args.User; args.Handled = true; + TryDisguise(ent, args.User, target); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess) + return; + + var user = args.User; + var target = args.Target; + args.Verbs.Add(new UtilityVerb() + { + Act = () => + { + TryDisguise(ent, user, target); + }, + Text = Loc.GetString("chameleon-projector-set-disguise") + }); + } + + public bool TryDisguise(Entity ent, EntityUid user, EntityUid target) + { + if (_container.IsEntityInContainer(target)) + { + _popup.PopupClient(Loc.GetString("chameleon-projector-inside-container"), target, user); + return false; + } if (IsInvalid(ent.Comp, target)) { - _popup.PopupClient(Loc.GetString(ent.Comp.InvalidPopup), target, user); - return; + _popup.PopupClient(Loc.GetString("chameleon-projector-invalid"), target, user); + return false; } - _popup.PopupClient(Loc.GetString(ent.Comp.SuccessPopup), target, user); - Disguise(ent.Comp, user, target); + _popup.PopupClient(Loc.GetString("chameleon-projector-success"), target, user); + Disguise(ent, user, target); + return true; } + private void OnToggleNoRot(Entity ent, ref DisguiseToggleNoRotEvent args) + { + if (ent.Comp.Disguised is not {} uid) + return; + + var xform = Transform(uid); + _xform.SetLocalRotationNoLerp(uid, 0, xform); + xform.NoLocalRotation = !xform.NoLocalRotation; + args.Handled = true; + } + + private void OnToggleAnchored(Entity ent, ref DisguiseToggleAnchoredEvent args) + { + if (ent.Comp.Disguised is not {} uid) + return; + + var xform = Transform(uid); + if (xform.Anchored) + _xform.Unanchor(uid, xform); + else + _xform.AnchorEntity((uid, xform)); + + args.Handled = true; + } + + private void OnDeselected(Entity ent, ref HandDeselectedEvent args) + { + RevealProjector(ent); + } + + private void OnUnequipped(Entity ent, ref GotUnequippedHandEvent args) + { + RevealProjector(ent); + } + + private void OnProjectorShutdown(Entity ent, ref ComponentShutdown args) + { + RevealProjector(ent); + } + + #endregion + + #region API + /// /// Returns true if an entity cannot be used as a disguise. /// public bool IsInvalid(ChameleonProjectorComponent comp, EntityUid target) { - return _whitelistSystem.IsWhitelistFail(comp.Whitelist, target) - || _whitelistSystem.IsBlacklistPass(comp.Blacklist, target); + return _whitelist.IsWhitelistFail(comp.Whitelist, target) + || _whitelist.IsBlacklistPass(comp.Blacklist, target); } /// /// On server, polymorphs the user into an entity and sets up the disguise. /// - public virtual void Disguise(ChameleonProjectorComponent comp, EntityUid user, EntityUid entity) + public void Disguise(Entity ent, EntityUid user, EntityUid entity) + { + var proj = ent.Comp; + + // no spawning prediction sorry + if (_net.IsClient) + return; + + // reveal first to allow quick switching + TryReveal(user); + + // add actions for controlling transform aspects + _actions.AddAction(user, ref proj.NoRotActionEntity, proj.NoRotAction, container: ent); + _actions.AddAction(user, ref proj.AnchorActionEntity, proj.AnchorAction, container: ent); + + proj.Disguised = user; + + var disguise = SpawnAttachedTo(proj.DisguiseProto, user.ToCoordinates()); + + var disguised = AddComp(user); + disguised.Disguise = disguise; + Dirty(user, disguised); + + // make disguise look real (for simple things at least) + var meta = MetaData(entity); + _meta.SetEntityName(disguise, meta.EntityName); + _meta.SetEntityDescription(disguise, meta.EntityDescription); + + var comp = EnsureComp(disguise); + comp.User = user; + comp.Projector = ent; + comp.SourceEntity = entity; + comp.SourceProto = Prototype(entity)?.ID; + Dirty(disguise, comp); + + // item disguises can be picked up to be revealed, also makes sure their examine size is correct + CopyComp((disguise, comp)); + + _appearance.CopyData(entity, disguise); + } + + /// + /// Removes the disguise, if the user is disguised. + /// + public bool TryReveal(Entity ent) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + if (TryComp(ent.Comp.Disguise, out var disguise) + && TryComp(disguise.Projector, out var proj)) + { + proj.Disguised = null; + } + + var xform = Transform(ent); + xform.NoLocalRotation = false; + _xform.Unanchor(ent, xform); + + Del(ent.Comp.Disguise); + RemComp(ent); + return true; + } + + /// + /// Reveal a projector's user, if any. + /// + public void RevealProjector(Entity ent) { + if (ent.Comp.Disguised is {} user) + TryReveal(user); } + #endregion + /// /// Copy a component from the source entity/prototype to the disguise entity. /// diff --git a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl index 8a79516077d..b525c9da1a3 100644 --- a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl +++ b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl @@ -1,2 +1,4 @@ +chameleon-projector-inside-container = There's no room to scan that! chameleon-projector-invalid = You can't disguise as that! chameleon-projector-success = Projected new disguise. +chameleon-projector-set-disguise = Set Disguise diff --git a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml index f07ae635696..b6819a18b96 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml @@ -17,15 +17,12 @@ blacklist: components: - ChameleonDisguise # no becoming kleiner - - InsideEntityStorage # no clark kent going in phone booth and becoming superman - MindContainer # no - Pda # PDAs currently make you invisible /!\ - polymorph: - entity: ChameleonDisguise + disguiseProto: ChameleonDisguise - type: entity categories: [ HideSpawnMenu ] - parent: BaseMob id: ChameleonDisguise name: Urist McKleiner components: @@ -33,20 +30,11 @@ - type: Sprite sprite: /Textures/Mobs/Species/Human/parts.rsi state: full - # so people can attempt to pick it up - - type: Item - # so it can take damage - # projector system sets health to be proportional to mass + - type: Transform + noRot: true # players rotation and anchor is used instead + - type: InteractionOutline + - type: Clickable - type: Damageable - - type: MobState - - type: MobThresholds - thresholds: - 0: Alive - 1: Critical - 200: Dead - - type: MovementSpeedModifier - baseWalkSpeed: 1 # precise movement for the perfect spot - baseSprintSpeed: 5 # the jig is up - type: ChameleonDisguise # actions @@ -57,6 +45,7 @@ components: - type: InstantAction icon: Interface/VerbIcons/refresh.svg.192dpi.png + itemIconStyle: BigAction event: !type:DisguiseToggleNoRotEvent - type: entity @@ -68,4 +57,5 @@ icon: sprite: Objects/Tools/wrench.rsi state: icon + itemIconStyle: BigAction event: !type:DisguiseToggleAnchoredEvent From 84338686a3aeeb6b4e12a11c3b3e5b1420ed2f25 Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Fri, 8 Nov 2024 03:46:22 -0800 Subject: [PATCH 103/130] Stable Merge (#33218) --- Content.Server/Antag/AntagSelectionSystem.cs | 4 +++ .../GameTicking/Rules/TraitorRuleSystem.cs | 31 +++++++++++++++++++ .../Thief/Systems/ThiefBeaconSystem.cs | 1 - Resources/Prototypes/GameRules/roundstart.yml | 8 +++-- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 224629ff2e5..610c0ad182a 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -55,6 +55,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(OnTakeGhostRole); SubscribeLocalEvent(OnObjectivesTextGetInfo); @@ -360,6 +362,8 @@ public void MakeAntag(Entity ent, ICommonSession? sessi _role.MindAddRoles(curMind.Value, def.MindRoles, null, true); ent.Comp.SelectedMinds.Add((curMind.Value, Name(player))); SendBriefing(session, def.Briefing); + + Log.Debug($"Selected {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); } var afterEv = new AfterAntagEntitySelectedEvent(session, player, ent, def); diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 8df6ed1098a..950795fc05e 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -41,6 +41,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(AfterEntitySelected); SubscribeLocalEvent(OnObjectivesTextPrepend); } @@ -53,6 +55,7 @@ protected override void Added(EntityUid uid, TraitorRuleComponent component, Gam private void AfterEntitySelected(Entity ent, ref AfterAntagEntitySelectedEvent args) { + Log.Debug($"AfterAntagEntitySelected {ToPrettyString(ent)}"); MakeTraitor(args.EntityUid, ent); } @@ -78,14 +81,22 @@ public string[] GenerateTraitorCodewords(TraitorRuleComponent component) public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - start"); + //Grab the mind if it wasn't provided if (!_mindSystem.TryGetMind(traitor, out var mindId, out var mind)) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - failed, no Mind found"); return false; + } var briefing = ""; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - added codewords flufftext to briefing"); briefing = Loc.GetString("traitor-role-codewords-short", ("codewords", string.Join(", ", component.Codewords))); + } var issuer = _random.Pick(_prototypeManager.Index(component.ObjectiveIssuers).Values); @@ -94,6 +105,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) if (component.GiveUplink) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink start"); // Calculate the amount of currency on the uplink. var startingBalance = component.StartingBalance; if (_jobs.MindTryGetJob(mindId, out var prototype)) @@ -105,18 +117,27 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } // Choose and generate an Uplink, and return the uplink code if applicable + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request start"); var uplinkParams = RequestUplink(traitor, startingBalance, briefing); code = uplinkParams.Item1; briefing = uplinkParams.Item2; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request completed"); } string[]? codewords = null; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - set codewords from component"); codewords = component.Codewords; + } if (component.GiveBriefing) + { _antag.SendBriefing(traitor, GenerateBriefing(codewords, code, issuer), null, component.GreetSoundNotification); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Sent the Briefing"); + } + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Adding TraitorMind"); component.TraitorMinds.Add(mindId); // Assign briefing @@ -126,9 +147,14 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleSystem.MindHasRole(mindId, out var traitorRole); if (traitorRole is not null) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Add traitor briefing components"); AddComp(traitorRole.Value.Owner); Comp(traitorRole.Value.Owner).Briefing = briefing; } + else + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - did not get traitor briefing"); + } // Send codewords to only the traitor client var color = TraitorCodewordColor; // Fall back to a dark red Syndicate color if a prototype is not found @@ -137,9 +163,11 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleCodewordSystem.SetRoleCodewords(codewordComp, "traitor", component.Codewords.ToList(), color); // Change the faction + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Change faction"); _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Finished"); return true; } @@ -148,10 +176,12 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) var pda = _uplink.FindUplinkTarget(traitor); Note[]? code = null; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink add"); var uplinked = _uplink.AddUplink(traitor, startingBalance, pda, true); if (pda is not null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is PDA"); // Codes are only generated if the uplink is a PDA code = EnsureComp(pda.Value).Code; @@ -163,6 +193,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } else if (pda is null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is implant"); briefing += "\n" + Loc.GetString("traitor-role-uplink-implant-short"); } diff --git a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs index de1c3d2e6d1..4c65ba5c449 100644 --- a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs +++ b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs @@ -20,7 +20,6 @@ public sealed class ThiefBeaconSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - public override void Initialize() { base.Initialize(); diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index cec5c9ee093..6ca322d0d5f 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -191,12 +191,17 @@ - type: entity id: TraitorReinforcement - parent: Traitor + parent: BaseTraitorRule components: - type: TraitorRule giveUplink: false giveCodewords: false # It would actually give them a different set of codewords than the regular traitors, anyway giveBriefing: false + - type: AntagSelection + definitions: + - prefRoles: [ Traitor ] + mindRoles: + - MindRoleTraitor - type: entity id: Revolutionary @@ -280,7 +285,6 @@ tableId: CalmPestEventsTable - !type:NestedSelector tableId: SpicyPestEventsTable - - type: entityTable id: SpaceTrafficControlTable From fea5769cc5064e6ad5d51afbcdcdbe0d6575a221 Mon Sep 17 00:00:00 2001 From: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:50:14 +0100 Subject: [PATCH 104/130] dark green jumpsuit recolor, casual green jumpsuits added (#31710) * green * fix material arbitrage * lighter --- .../Catalog/Cargo/cargo_vending.yml | 2 +- .../Inventories/clothesmate.yml | 2 ++ .../Clothing/Uniforms/color_jumpskirts.yml | 8 ++--- .../Clothing/Uniforms/color_jumpsuits.yml | 8 ++--- .../Entities/Clothing/Uniforms/jumpskirts.yml | 30 +++++++++++++++++++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 30 +++++++++++++++++++ 6 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 5dae53f8ede..86da8fb940e 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 2400 + cost: 2440 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 54a6ae2a194..a069833759d 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -53,6 +53,8 @@ ClothingUniformJumpskirtCasualPurple: 2 ClothingUniformJumpsuitCasualRed: 2 ClothingUniformJumpskirtCasualRed: 2 + ClothingUniformJumpsuitCasualGreen: 2 + ClothingUniformJumpskirtCasualGreen: 2 # DO NOT ADD MORE, USE UNIFORM DYING ClothingShoesColorBlack: 8 ClothingShoesColorBrown: 4 diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml index a2bf6b687a9..3f48b0260fc 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml @@ -222,24 +222,24 @@ sprite: Clothing/Uniforms/Jumpskirt/color.rsi layers: - state: icon - color: "#79CC26" + color: "#007923" - state: trinkets-icon - type: Item inhandVisuals: left: - state: inhand-left - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-left right: - state: inhand-right - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-right - type: Clothing sprite: Clothing/Uniforms/Jumpskirt/color.rsi clothingVisuals: jumpsuit: - state: equipped-INNERCLOTHING - color: "#79CC26" + color: "#007923" - state: trinkets-equipped-INNERCLOTHING # Orange Jumpskirt diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml index f56afabeac1..7a44409079b 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml @@ -222,24 +222,24 @@ sprite: Clothing/Uniforms/Jumpsuit/color.rsi layers: - state: icon - color: "#79CC26" + color: "#007923" - state: trinkets-icon - type: Item inhandVisuals: left: - state: inhand-left - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-left right: - state: inhand-right - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-right - type: Clothing sprite: Clothing/Uniforms/Jumpsuit/color.rsi clothingVisuals: jumpsuit: - state: equipped-INNERCLOTHING - color: "#79CC26" + color: "#007923" - state: trinkets-equipped-INNERCLOTHING # Orange Jumpsuit diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index 9a91f927157..c4850954cd7 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -822,6 +822,36 @@ - state: equipped-INNERCLOTHING-shirt color: "#b30000" +- type: entity + parent: ClothingUniformSkirtBase + id: ClothingUniformJumpskirtCasualGreen + name: casual green jumpskirt + description: A loose worn green shirt with a grey skirt, perfect for someone looking to relax. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + layers: + - state: icon-jumpskirt + - state: icon-shirt + color: "#00661D" + - type: Item + inhandVisuals: + left: + - state: inhand-left-jumpskirt + - state: inhand-left-shirt + color: "#00661D" + right: + - state: inhand-right-jumpskirt + - state: inhand-right-shirt + color: "#00661D" + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING-jumpskirt + - state: equipped-INNERCLOTHING-shirt + color: "#00661D" + - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtOldDress diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index 42a0b7069d1..ef5c1164cfd 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -1347,6 +1347,36 @@ - state: equipped-INNERCLOTHING-shirt color: "#b30000" +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitCasualGreen + name: casual green jumpsuit + description: A loose worn green shirt with a grey pants, perfect for someone looking to relax. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + layers: + - state: icon-jumpsuit + - state: icon-shirt + color: "#00661D" + - type: Item + inhandVisuals: + left: + - state: inhand-left-jumpsuit + - state: inhand-left-shirt + color: "#00661D" + right: + - state: inhand-right-jumpsuit + - state: inhand-right-shirt + color: "#00661D" + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING-jumpsuit + - state: equipped-INNERCLOTHING-shirt + color: "#00661D" + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitFamilyGuy From 6ed2ab9e85bd0321dc22ea92725d32f9b1b951d5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 8 Nov 2024 14:51:26 +0000 Subject: [PATCH 105/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 34a2d143584..485cad8e96d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: LeoSantich - changes: - - message: Updated 'narsie' and 'ratvar' to 'Nar'Sie' and 'Ratvar' in randomly generated - storybook content. - type: Tweak - id: 7099 - time: '2024-08-12T23:20:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30954 - author: pigeonpeas changes: - message: Added non command mantle into the winterdrobe @@ -3949,3 +3941,10 @@ id: 7598 time: '2024-11-07T22:02:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33065 +- author: Boaz1111 + changes: + - message: Added casual green jumpsuits and skirts to the clothesmate. + type: Add + id: 7599 + time: '2024-11-08T14:50:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31710 From 41b84fc29dbca40704627cbe6eb44a1d8791d30b Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:59:27 +0100 Subject: [PATCH 106/130] Label workflow - stable (#33220) --- .github/workflows/labeler-stable.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/labeler-stable.yml diff --git a/.github/workflows/labeler-stable.yml b/.github/workflows/labeler-stable.yml new file mode 100644 index 00000000000..491d6a76fad --- /dev/null +++ b/.github/workflows/labeler-stable.yml @@ -0,0 +1,16 @@ +name: "Labels: Branch stable" + +on: + pull_request_target: + types: + - opened + branches: + - 'stable' + +jobs: + add_label: + runs-on: ubuntu-latest + steps: + - uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Branch: stable" From b9685850faaa1a14f8340cb44e7c48a7d8d13fb6 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:59:38 +0100 Subject: [PATCH 107/130] Label workflow - staging (#33221) --- .github/workflows/labeler-staging.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/labeler-staging.yml diff --git a/.github/workflows/labeler-staging.yml b/.github/workflows/labeler-staging.yml new file mode 100644 index 00000000000..e31a5a482f2 --- /dev/null +++ b/.github/workflows/labeler-staging.yml @@ -0,0 +1,16 @@ +name: "Labels: Branch staging" + +on: + pull_request_target: + types: + - opened + branches: + - 'staging' + +jobs: + add_label: + runs-on: ubuntu-latest + steps: + - uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Branch: staging" From 1e368ae30076606501332f34ab786c14e25c477a Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:28:24 +0100 Subject: [PATCH 108/130] Add a Walking alert (#32954) * Initial commit * Review feedback changes * ProtoId * TempCommit * First attempt to have client alerts * Review changes --- Content.Client/Alerts/ClientAlertsSystem.cs | 15 ++++++++++----- .../Physics/Controllers/MoverController.cs | 16 ++++++++++++++++ Content.Server/Alert/ServerAlertsSystem.cs | 12 ++++++++++++ Content.Shared/Alert/AlertsComponent.cs | 16 ++++++++++++++-- .../Systems/SharedMoverController.Input.cs | 6 +++++- Resources/Locale/en-US/alerts/alerts.ftl | 3 +++ Resources/Prototypes/Alerts/alerts.yml | 9 +++++++++ .../Interface/Alerts/walking.rsi/meta.json | 14 ++++++++++++++ .../Interface/Alerts/walking.rsi/walking.png | Bin 0 -> 15838 bytes 9 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 Resources/Textures/Interface/Alerts/walking.rsi/meta.json create mode 100644 Resources/Textures/Interface/Alerts/walking.rsi/walking.png diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 525ef1f018f..c5ec254c0cc 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Alert; using JetBrains.Annotations; using Robust.Client.Player; +using Robust.Shared.GameStates; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -24,8 +25,7 @@ public override void Initialize() SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); - - SubscribeLocalEvent(ClientAlertsHandleState); + SubscribeLocalEvent(OnHandleState); } protected override void LoadPrototypes() { @@ -47,17 +47,22 @@ public IReadOnlyDictionary? ActiveAlerts } } - protected override void AfterShowAlert(Entity alerts) + private void OnHandleState(Entity alerts, ref ComponentHandleState args) { + if (args.Current is not AlertComponentState cast) + return; + + alerts.Comp.Alerts = cast.Alerts; + UpdateHud(alerts); } - protected override void AfterClearAlert(Entity alerts) + protected override void AfterShowAlert(Entity alerts) { UpdateHud(alerts); } - private void ClientAlertsHandleState(Entity alerts, ref AfterAutoHandleStateEvent args) + protected override void AfterClearAlert(Entity alerts) { UpdateHud(alerts); } diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index c97110b208e..d2ac0cdefdc 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -1,9 +1,12 @@ +using Content.Shared.Alert; +using Content.Shared.CCVar; using Content.Shared.Movement.Components; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; using Robust.Client.GameObjects; using Robust.Client.Physics; using Robust.Client.Player; +using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -14,6 +17,8 @@ public sealed class MoverController : SharedMoverController { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public override void Initialize() { @@ -135,4 +140,15 @@ protected override bool CanSound() { return _timing is { IsFirstTimePredicted: true, InSimulation: true }; } + + public override void SetSprinting(Entity entity, ushort subTick, bool walking) + { + // Logger.Info($"[{_gameTiming.CurTick}/{subTick}] Sprint: {enabled}"); + base.SetSprinting(entity, subTick, walking); + + if (walking && _cfg.GetCVar(CCVars.ToggleWalk)) + _alerts.ShowAlert(entity, WalkingAlert, showCooldown: false, autoRemove: false); + else + _alerts.ClearAlert(entity, WalkingAlert); + } } diff --git a/Content.Server/Alert/ServerAlertsSystem.cs b/Content.Server/Alert/ServerAlertsSystem.cs index b7b80f73210..5af2b062188 100644 --- a/Content.Server/Alert/ServerAlertsSystem.cs +++ b/Content.Server/Alert/ServerAlertsSystem.cs @@ -1,7 +1,19 @@ using Content.Shared.Alert; +using Robust.Shared.GameStates; namespace Content.Server.Alert; internal sealed class ServerAlertsSystem : AlertsSystem { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetState); + } + + private void OnGetState(Entity alerts, ref ComponentGetState args) + { + args.State = new AlertComponentState(alerts.Comp.Alerts); + } } diff --git a/Content.Shared/Alert/AlertsComponent.cs b/Content.Shared/Alert/AlertsComponent.cs index 05b11e19efb..16827e9cdff 100644 --- a/Content.Shared/Alert/AlertsComponent.cs +++ b/Content.Shared/Alert/AlertsComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -6,12 +7,23 @@ namespace Content.Shared.Alert; /// Handles the icons on the right side of the screen. /// Should only be used for player-controlled entities. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +// Component is not AutoNetworked due to supporting clientside-only alerts. +// Component state is handled manually to avoid the server overwriting the client list. +[RegisterComponent, NetworkedComponent] public sealed partial class AlertsComponent : Component { [ViewVariables] - [AutoNetworkedField] public Dictionary Alerts = new(); public override bool SendOnlyToOwner => true; } + +[Serializable, NetSerializable] +public sealed class AlertComponentState : ComponentState +{ + public Dictionary Alerts { get; } + public AlertComponentState(Dictionary alerts) + { + Alerts = alerts; + } +} diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index 9dda249423e..c11df709f63 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.CCVar; using Content.Shared.Follower.Components; using Content.Shared.Input; @@ -8,6 +9,7 @@ using Robust.Shared.Input; using Robust.Shared.Input.Binding; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -21,6 +23,8 @@ public abstract partial class SharedMoverController { public bool CameraRotationLocked { get; set; } + public static ProtoId WalkingAlert = "Walking"; + private void InitializeInput() { var moveUpCmdHandler = new MoverDirInputCmdHandler(this, Direction.North); @@ -460,7 +464,7 @@ private void ResetSubtick(InputMoverComponent component) component.LastInputSubTick = 0; } - public void SetSprinting(Entity entity, ushort subTick, bool walking) + public virtual void SetSprinting(Entity entity, ushort subTick, bool walking) { // Logger.Info($"[{_gameTiming.CurTick}/{subTick}] Sprint: {enabled}"); diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl index 37af416c3a1..1748798beae 100644 --- a/Resources/Locale/en-US/alerts/alerts.ftl +++ b/Resources/Locale/en-US/alerts/alerts.ftl @@ -27,6 +27,9 @@ alerts-weightless-desc = Gravity has ceased affecting you, and you're floating around aimlessly. Find something sturdy to hold onto, or throw or shoot something in a direction opposite of you. Mag-boots or jetpacks would help you move with more control. +alerts-walking-name = Walking +alerts-walking-desc = You are walking, moving at a slow pace. + alerts-stunned-name = [color=yellow]Stunned[/color] alerts-stunned-desc = You're [color=yellow]stunned[/color]! Something is impairing your ability to move or interact with objects. diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 80fcc44a559..859f223730b 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -13,6 +13,7 @@ - alertType: Ensnared - category: Buckled - alertType: Pulling + - alertType: Walking - category: Piloting - alertType: Corporeal - alertType: Stun @@ -126,6 +127,14 @@ name: alerts-weightless-name description: alerts-weightless-desc +- type: alert + id: Walking + icons: + - sprite: /Textures/Interface/Alerts/walking.rsi + state: walking + name: alerts-walking-name + description: alerts-walking-desc + - type: alert id: Stun icons: diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/meta.json b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json new file mode 100644 index 00000000000..88238a60e32 --- /dev/null +++ b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by SlamBamActionman", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "walking" + } + ] +} diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/walking.png b/Resources/Textures/Interface/Alerts/walking.rsi/walking.png new file mode 100644 index 0000000000000000000000000000000000000000..a0169368a6051afd1675f6f2cd17a06b7dfa3d4e GIT binary patch literal 15838 zcmeI3e~c968OPtlXwN%ABcx}W8rJ0`2+q#0ox9uV?vm^6;hwN~Jr?eWY3l6EySGzz zXV#tB+vQ5r<45sKt08JCA=*&*qZ%8qS|SPrilSmF#r9eXE!NhW6tO@oDTT(`clPJp zdwXwawQ1VCo9vJ0ectc$%zU2reP;HLd9Z)^T{Bxg-vR)b*%yrrpl^@!ZoUqETBD;E z(bx6a=xPgq*4fUx32b}f7687uRgVwZL$PJDYG!R~+MWa) z){T(&{Jw);kFJHhgHnu(WqV*skB;WxiqYk9b##py(7cPoEy1FU0%V}Ac#4^{Vadgi zw-i@Kznx*$>nTmK*Mz*?PD0O6tl!gP=AcLNbucQ|(dp?7_;{(a)8BcgN8osgaT2dZ}EUBbJR>+&O?X1kQg+jqs5PfEDnB@b30LuxiATVeK zW34r8rN|i8ymF9goCvhkoSwCH)9^TPm4unMLtd|wsP?LyS0-CaWLOn;h$355vMlf8 z*hV5vt!c9PT)K2K1u22x2 ztK5@=if!iNrkM_xS6P1*p{J*(w5mJ{26aO-3)US$7MIlPU5^GMiVed8C-@m2Ek+^E zcgegYOMyk4Aak56NO>j}BW7xPa&3bc5-0P5JBDi}9s}(kO|g}$isGK@ileD=(#&NP zJFI7vVaR5U;UHTdbj_@-D!Io@n>ln?Ff0byM#C;uX{E`1hGi>;3i~2qG~m;9O%?<` zA&F`y6X26cMoaqrOhOS=rb7@FG091iUx6ivv6x#vC3M78^UiLmgw{}KuFKC!9cqFR z{er}ZUH&en3kH%5pMXh;gOKY`%Jo5^UGgcR@5$+?(rsxTv~y)eb-Gztbv6Xlg6yQx z`eD_S6`4M@fLBMk9N#6MK1U%14bp}xhbqmQK8R%|?Shhn-NR^2T+LoDN1ZIg!v|TX z`=|B)Kp`w;X}ss{+B9ubsg}NZJ;v~OzojT=SD(C{TKBD zrPTNMAUkEOzGlkvhnzl|&X?wQ3LJW|yz^O+y4|>RHCgI*tlp^^<7cB!1Z zo${r41-dbZ;SNa>r67wBSy$6M#W;$Bp48~NpX?+U|xy~141?_E;1j?OL1X9 z$R@=_=7V`DE({3Sq`1g@FfYZ00U?_d7nu*{rMNI4WRv0|^TE6n7Y2lEQe0#{n3v+h zfRIg!i_8b}Qd}4ivPp4~`Cwj(3j;znDK0V}%u8`$K*%P=MdpKfDJ~2M*`&D0d@wJ? zg#jU(6c?Ef=B2nWAY_x`BJ;t#6c+}BY*JigKA4x{!hn!Xii^w#^HN+G5VA>ek@;X= ziVFimHYqMLAIwW}VL-?x#YN_Wc_}Uo2-zg!YN(@YrOZ@mFPiSj~X3_ z0Wf+y0Am{gxco8tJ_A6W1K|Dp0Fbu=&}KgJ)gwy)Xgbsv>5dmqeJ~g@H}ua5`EP9= zITUT5H7kE+;``Q#f6TbxE(qBq~Y{&s!c?73~{e*d<0>>JISZu;Yk#+JXlG~@MK4>9LAZc`rl`vb3CSa*El z+V5Rz4ldk&wD-)c9dQ8CgRQ=se#?x{|Jk>$(cABNXww59oim%3z1DNvg#+AW<>RBV z!;yu@?>)WcNAV`Bu=z}J!G%?0tFIk>=IibI{?xMW##Or+?N>9l1uulsgWsNeY0)oF zeL4N(fv4|(=h@%=(6&T){?r&%m7CQF5ek706Lbt_iVm&;>yXJSM)!( z;}36M@jSO9xpTv@)Xn#6`2cLcGh1a(~-MYVhS+Mou zs>kOneQ%y;zcu!oajo~r$e!k-^A~+BdibYJbCyDID0$$OI(DdY6 z?IT9}cW?VM`^-ctcy=uD;razfhsIKy`-V<$IXUisxjk;|-}U&ZU4OeWd~r8eHxslQ Y?{3(5<%x0U3GBY!<&j-qx^Kfj0jgnaeE Date: Fri, 8 Nov 2024 23:56:16 -0600 Subject: [PATCH 109/130] The Jumpsuit Re-Detailening (#33096) * jumpsuit detailening * jumpskirt stuff * meta.json * update meta.json * meta.json fix fix * meta.json fix fix fix --- .../color.rsi/equipped-INNERCLOTHING.png | Bin 518 -> 1068 bytes .../Uniforms/Jumpskirt/color.rsi/icon.png | Bin 300 -> 429 bytes .../Jumpskirt/color.rsi/inhand-left.png | Bin 391 -> 435 bytes .../Jumpskirt/color.rsi/inhand-right.png | Bin 408 -> 424 bytes .../Uniforms/Jumpskirt/color.rsi/meta.json | 2 +- .../color.rsi/prisoner-inhand-left.png | Bin 258 -> 221 bytes .../color.rsi/prisoner-inhand-right.png | Bin 259 -> 232 bytes .../trinkets-equipped-INNERCLOTHING.png | Bin 274 -> 292 bytes .../color.rsi/equipped-INNERCLOTHING.png | Bin 540 -> 1314 bytes .../Uniforms/Jumpsuit/color.rsi/icon.png | Bin 293 -> 387 bytes .../Jumpsuit/color.rsi/inhand-left.png | Bin 391 -> 451 bytes .../Jumpsuit/color.rsi/inhand-right.png | Bin 408 -> 437 bytes .../Uniforms/Jumpsuit/color.rsi/meta.json | 2 +- .../prisoner-equipped-INNERCLOTHING.png | Bin 365 -> 413 bytes .../Jumpsuit/color.rsi/prisoner-icon.png | Bin 232 -> 188 bytes .../color.rsi/prisoner-inhand-left.png | Bin 258 -> 221 bytes .../trinkets-equipped-INNERCLOTHING.png | Bin 265 -> 295 bytes .../Jumpsuit/color.rsi/trinkets-icon.png | Bin 235 -> 206 bytes .../color.rsi/trinkets-inhand-left.png | Bin 245 -> 198 bytes .../color.rsi/trinkets-inhand-right.png | Bin 251 -> 212 bytes 20 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png index 3faba7285ff1b3898e47a23c7299d33e20a05c0c..4df4336458d688a519f10685058a3b070ab2c6a3 100644 GIT binary patch delta 1058 zcmV+-1l{|F1gr><8Gi-<0063Kaozv`00DDSM?wIu&K&6g00ZVpL_t(|ob8%1Z=*aM z#-BUA%Gg|^h=C={X@)R{&K)B14Kj4B1YNsiB6C-$)GqLZmZq4(dzbh8TS{!~=kXtGQ`>+*AP@)y0)gP~s;UA2PESu++2wMX z0)X%PxV*gNs*_irUYn-L(jCWP*Sz}w@QCZW4gl~x58LgQnOQ6r&~+WMECWE=L=X(a zV8NGVIoD`i*AYb#yYJ@are1y9w$m)D)he}ZJKb)#scqZoYPHJcXP;CP`jmeODNL_b zpNhY2Bn?7QdVifJK5BfCrz%1CUe<``c_4(a--@C@*L5h0!qNyK@H~&BdF62&C#PQo zAtcu|%CL6~ux&dvO_NpX`#v;HWBJ*}(|l_7Wsv&PctFRUtUjZl<93 z*7+sUqOq<-nHYQ0o?c6J5;?`8qubzrhAtM-3}n$qVsYVC1;Mjsfj8E zsz9}7vsvo8ZrbbhFdmOlH3+3K3?p@2H@6K!043-|u5Ooubp}u+5O{nS`vzGH{Op*>!okG_7eGG)>Fx5I02> zMNBX2;jOo_aBYrK16h(JLA%}N7OsONN!T?#B*6=J0DRxa-Q694U4Oi~xL@c;k-07*qoM6N<$f(GCBdjJ3c delta 503 zcmV3N*fjv{wa9X60AS-DhUkUyv!VvT=5P>efR2AM1$530cm~jt5pnRIZs|4gTo^ZaviP69J# z%$V`t@snb#wf0g<09LD2?|VERJ%DqL&1RDn^EV~AQVJmi&VM<&uJhq@&LM0~Ihd}5gvsj>%0!bwR*b+pKp}Aed&(1#(l2T$4FQI4x!06nk=qD4{7KN8m(zfl}F+814ESF2R zMG;+v=x!};LD%awz{3;(91e$I8yz?4=^PSyp-YZ8V;9DZ3q&>o*Z1rrWdHyG07*qo IM6N<$f?D0eqyPW_ delta 284 zcmZ3>yoPClWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hKfKQ0) zlqpj#UcC7K|Nk2|ZiI%0zIgEhC=>HgiU~-umjw9*1Eqj~LCTxi4JgD};1OBOz`%D9 zgc)~C%zg_L?DceU46*Qk+waJCRDq-3W#X#u_C@S1`b$iFr~Cff!7zti=`8!-#--s5 zro6hQtxdC{#A2+~)7o5l4Yx&x#B+R97G(I!x0H*ad`sH`*_(M^UYx(JB);Ig9K%W< zd!a+@NAKTV#Ij>em}&ygG0Adi}P8aP|Rg;0-=rVd}}Vrjq^N}vFcIn#u5h`b^!KZ_X%MDM$-*1LKdVVlb%0ssI2 z000000Du_A7~eFFpIVR28?QA@<74v+kLwcitMd6VP=X5&i6(*7~_q zVg0Z3=6vl9$n*Szh&&OI*81i5vMh)HJ3Vg=%Lxd>jCUt|-#RRJ-jdxXAb30;)V3`p zNkUncQB_sc_kTUrb$yAvLn)=6FR7_drPQVu7I)r~-B&;<<{7;&u^zP8yd24oG zfubnFeViR=%bn%U0{{R3000000D%8ts*S#Ed(3UFjgD!L*}B2AjoawUw#VGK+vD4w z0Iv3!ts6WGcYA!x6TsOX-|hqiw`z~Makj^|y8_(p@g4210NP^!;PedyoxtVqGpvyS O0000AKt5&T#cI?=!S+jsjrc_^<1f;l1g8YL2!vMpkGdkyi zqMQXDk;M!Qe1}1p@p%4<6rkW8&w3ZfkO=p;Q!ny0EAY5>uaN%#|8Vxglxz1?%c^I3 z`YWB&wr~Okiws(4PNrU-+R_;Wth&tcxkht)|MVYiG~HIyp~EiK8>At zRzy5-ZH|V`zW9YXOe{td|0l56&2DhH_IPVwe!#K?8BcdE*T46Df73~M*5xNPq<`cT zEIzpGJku!=l?R(YrLx)uA6U0-uH2T}J2j*iB)57vaGXlTFs`|H7<^X{$x>J)ojohz*4*wwnLrWNQ=44wf1mMO^02{? z6Ed+^_C&otUaz?6`>L&ej~KqZdvZ62aqZU0LG%7CoFcSRD%MXn%j6s?N~TVE~8&U=ZpQn*i<`(cFbptFP;tzeFjfgKbLh*2~7Y<8o3$( delta 393 zcmZ3%JcD_HWIZzj1H;_yjcNS%G|&0G|-o z-Me?+xpU|K{rms^{kwVd=KT5dXU&?mYSpS^$Bupa^y%EWb3la)=GzGZDV~xbzu^A} zz#w!VEX`Tq5n0T@z;_sg8IRZJuSfx^e(LGs7!u+BcIs`uW(5J4=}KF#{{Mgfoziqy z;kmu~W;Z8`OyN@(kZ-#-d&dFRChiyo8@CC|8*XYmF|@xvGwybWgx9LHZiP)#omyA| z{cdflTqIFx`k^BCMtZk{*bjaWgS68cab+~T}>{$}Uqx80$QI#De3y1UPI zng!KatM6^k5&bat2RrAn981qxFP)7y)z3e=t`=k&(9T1fS$;~cdC}Gtt+i`0Yg^a5 zFI$!_5{)`Adw+zhc1T24IivQj#g}XTvF6@5rZD3jr;g}dNtO!N@-L0LqIV7M{Wx)- d``TCb|8dKCXYUd31^Sr5)78&qofA_+6982YvkCwJ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json index 7e6832bd12c..82edfe13a02 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/993de554ecfc30cc45f8340819c5a60ef1eee7e1 and modified by Flareguy & P3MOIRA, with the lower half of the jumpskirt taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for SS14.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png index f6ff6866ffc359196192cec6c75f0631f2a399a3..6b40ed5af0ec63d3f482b5c3e6a081aa1a2c7e7a 100644 GIT binary patch delta 180 zcmZo-y307huztFyi(^Q|oVPa*ayC1Nuw39=BA|P8_0ot1Z!^@N2{6T_+D|(Aol7F| z|ASN^1`wF{I8@Yx=kP?8#};Yxp09a5EBE#!mEZf~|M`{PTRSb)@}K4VH?g86`ywX! zTrLSQU7++n%+_?lANdJ2>%Z*|yL7E#l?~XOhU2fx5?|_8*{-{`Np{-W!{x6*%u5Y< e@u#YI7|z-~NsBsI%(`PSNU^7@pUXO@geCwL#Zun@ delta 217 zcmcc1*u*r!u%0E|(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG8=Gx~Gd{NJZS+ zn;UtX4Fp&(oK_2{5_L;-2wQk$wu+J0k}aI#Dv!R;($<-)`?K60sDXiDf&BL8HaQY) z)w3U495eCVsNRxE*0`eH>RB!N(B= OQtIjI=d#Wzp$PyZ8d#eE diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png index 45393e81a66103898d2e33673dc0c227824b4f29..e43a9b42dbcce7413e0191765e4d201a3f8cf80e 100644 GIT binary patch delta 191 zcmZo>dciosuzr!Ji(^Q|oVPa*axxi;xL(wb@K`qGrk|#!!CRHNM_M`bc#N{#gx}w+ zW9mPzKAU}#iYEvy`CpjD>%<|N5Gl4TS9z(+Imw0~ug`b4mzo!*R?=B2D>@s&$ugou^%X1y*>9(emq0Z#Bhj77L!z77VMUqd{OH0I=9!{(X-xu qP+n|$EcR>>qyAsU1ZHi|ODuYMrcnpqS4)O40D-5gpUXO@geCwN{!(QC delta 218 zcmaFC*vvG+u%0E|(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG8=GhNp{TNJZS+ zn;UtX4Fp&(oK_2{5_L;-2wP|}TgAw06^Eva;>phMv$S=h)nAv}19dPkJh0LG{&UIe zUD>m1?;khdG4u_-5_NrZYNXlwzo!=d?t8q$Zr;&(wZZXT4w|aZD*Yxm^uMou#bWX{ zTz>z}KgCS5cz!d1&8fM&?%0zHY-Y1_Y9CJ9E<9nOq1~00!WS|U7*FUuV%s|_u2lKd QbX|~APgg&ebxsLQ0Bzt{bN~PV diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png index cee5a50d2caea42b0fc53599a92a1cc8be1a8d72..bb9dd4f505ee4ad6cf2969435ae4333f48849290 100644 GIT binary patch delta 276 zcmbQlw1jDbWIY=L1H-D!!h1l9u{g-xiDBJ2nU_G$Jx>?Mkcv5PZ|(1GHV`@f@xE(j z=6u(qOg;~~WFt=4Zr;F_#2~i7sq8evzE?{oE4g|$xZJ6=?@c{fKR-6&(`29t4ee`R z&w79L{FB#L`}Uj1iX1)tc+Rbv{&LkXcD?&z{$SJ6&lY{v^=ls|o3S3S+K_~WIZzj1H;_yjcNS%G}%0G|-o z8#iufYinm_W@cq&1qB67nKC6fIN09a9w_f;tS1koI7@>3g8xGSL$H5^5J<4VBeIx* zf$tCqGm2_>H2?*(JzX3_BC6cqUbx8BV8GG(aOUQp|NLe2@`c#)L|x|W=ayXEzv0DM z28Im`dl-D0KQe!ssmCjKdtlh%?=+^wxwSSs{4&DGoHM|SrCM!lQ nnfw07&0jb9rZF)%gnngcR;-t?v9eYM+RNbS>gTe~DWM4fWsO~T diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png index 5c333dfc11811bc991f2cd4e82637351c4ead25c..2d86990cb8bf89056064b448cdff4458e5caa870 100644 GIT binary patch delta 1306 zcmV+#1?Bpj1fmL%8Gi-<0063Kaozv`00DDSM?wIu&K&6g00i7gL_t(|ob8%HZ`w!{ z$Nyce=xQs4234%;L$Oj$2^Y493it%bd;<Ep}8(Ab2rP^|tJ&>8&1QL&JSnbxo(|GK8@6Gefn}4z201*)p5fKp)5fR@f zPedNpb)9CjSpYzxP~dGloel*6(=@TWyDKD9R6i?gn#Swv^*S$$>i{A?)dmPT>ZMPQzyM%kLtQk$Kx^8 zb)EKlJ=cBbn}1q{e#SW=bL&IZ&y>%0k~v{seV9fp>ij&L{5atUuZ9?g0YV7BmSq`= zqCl2qUPlOlVHg74^G>~9cj=!8A;dK`yzpQQ&~=?^n#P5iripw$&+j`s&+ap0?}AjI zc);S0Q$H|`0Z!fhejkIuz@`5#UOlS+(Gk$^_W^v1u7B*>?{lJbIvtnX;c&=1zrMZ> zVEQ74!=dXr*6uML908VP!Llq@-C!`d_vTssL+$+FSB6Nt2OThPIgum@gb>$MAcR1Y zBt8VgT80+MA%tLSYYPA{8jWyydFiR$JUs6MoJf-78sc~B|H>E+hd4Vs3q_WY18mzy zqtOUOv40T+9DwQGgazc^-@o@I&sPj!8xj`u0Jt2nOn!O!63u24-EJ3?$pp1p z4e4~+H4;Sdyc3*-efc?^unJ^ZMtWld0C0GC_n#)nudc4pY&KnWVQqW8Fqus7+q-x7>P}BjSE4^6A|fIpA|fIpA|m4Z zMpf0&Gr&R6b)BlJ>dPMC{{gD1(qgfQR4Rp5t3@l73S~z4F~AQ@XQfi1tyYVsQYjRR zMSu8pf@f4!rL9)Wm4;?c2t6;q0H%v|e%2OICkTyzWHO0TsRUs92c}-HBa_J>m&-xZ zw3YlAxw*N4rfJCKa>!&dsMqWKZ&0aJLNb{Yk|*SV7cXA$vSAp=X0woG8Hq#!<#HLD zo0~$){UE=3g>t!!L?QuMmXXb7U1t)UHh+3SI0nqi3Fh;8H!lv3Jmw^#Qu1i0tAd2xYQEapc{ zAY!o?%!`Y;Hi_Wtgb3r04n zFhle&`lPKt0e_?fu=?KubXhDpK$pd{*ntjw4KFXTR-aUwjRI(pdP>suzv`trmx*a_}2NwTeOjugLpl_Vxu)T zB(VLNa>>=Xq{EH@T+gO;e*$3Rj+Zo!pBXU#cDAu-h=2HZ5#ItjzX9+=bam}Jz5^$j zl*N<>V2-%|S-c1%U`7m}o9vAMoEagY%i=|5ha+frZ(-b7Trvqsdn35^9&oh0{YmgU zpHELGky;aGfPch`)`SHR&jH0(% zQ%EEd|DBa3*f|&SJO`jCiui5YwgJFoIjT0s)~r{69PZ9nL>^wn@pv@lOe7MC#2?WJs_uX+ Riy;62002ovPDHLkV1n?ywvqq< delta 277 zcmZo>Udl8}{CC_9?}s@uur)p&YgYr>Yh7;uTF6Z^&~zn61oN z<`{D&TUn&Z{y@xX=(@y0foC-g(bFU)n&dsJOAbr#*WpAD%l@by zKtx1DL_|bHL_{HsF}`hEe{MZAZ@JdCtq;w6DPxRx&UtI?$$#dYa}RHN%3H2mYkf%G zHJ?&JS(YKsbIcFHIp?!13(lJ#g0pB2G zH&>SB?@dkX|DAWq*RugtReb>P08p0Y$?v<}ZvMZw=iMSQ0n=udw=+FIx>@PGYs5Z* zSc#luQ561oJbz-d*&s<0Y`0tN_j?S(fN8yHn!Dd6op+7c1Zb^M*EN(AKt5&T#cI?=!S+jsjrc_^<1f;l1g8YL2!vMpkGdkyi zqMQXDk;M!Qe1}1p@p%4<6rkW8&w3ZfkO=p;Q!ny0EAY5>uaN%#|8Vxglxz1?%c^I3 z`YWB&wr~Okiws(4PNrU-+R_;Wth&tcxkht)|MVYiG~HIyp~EiK8>At zRzy5-ZH|V`zW9YXOe{td|0l56&2DhH_IPVwe!#K?8BcdE*T46Df73~M*5xNPq<`cT zEIzpGJku!=l?R(YrLx)uA6U0-uH2T}J2j*iB)57va$0mHa*dK}bYr?KLvAHku<0L=mF^JR&a*(o@@bEKN6SMc)%VvGx!*9>BJ|kV;Mk5;s}z>rk@+FI zWXg(Fubv%SyH(F>z2ULmpTb+N-CMKVh&B52I==%yYuG-NZi;&Se)jj*D=SUjA1`@W zV6lg>fMLPbd9@2)@A|kee!J=WM=U?iUcUT!esE=FzW2SW`w!G_tS~B#-F^9G%O;&b z5!P?NZGY`MZopIj;dSn9HDlK3PwV^|g1CGyJ8(2U{>Y)oGHY35(5uq?O$QfOhUafw zmmMy`+9Gh{ZP|_(y&ZAuCE65M-u_;6+S>&RrZnG?dc6G9T0=h3(4HsPBNS%G|&0G|-o z-Me?+xpU|K{rms^{kwVd=KT5dXU&?mYSpS^$Bupa^y%EWb3la)=GzGZDV~xbzu^A} zz#w!VEX`Tq5n0T@z;_sg8IRZJuSfx^e(LGs7!u+BcIs`uW(5J4=}KF#{{Mgfoziqy z;kmu~W;Z8`OyN@(kZ-#-d&dFRChiyo8@CC|8*XYmF|@xvGwybWgx9LHZiP)#omyA| z{cdflTqIFx`k^BCMtZk{*bjaWgS68cab+~T}>{$}Uqx80$QI#De3y1UPI zng!KatM6^k5&bat2RrAn981qxFP)7y)z3e=t`=k&(9T1fS$;~cdC}Gtt+i`0Yg^a5 zFI$!_5{)`Adw+zhc1T24IivQj#g}XTvF6@5rZD3jr;g}dNtO!N@-L0LqIV7M{Wx)- d``TCb|8dKCXYUd31^Sr5)78&qofA_+698!hvljpW diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json index 7e6832bd12c..797ea180d8e 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/993de554ecfc30cc45f8340819c5a60ef1eee7e1 and modified for SS14 by Flareguy & P3MOIRA", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png index 320db64b5794a279427cd43b16b4839490b43800..ef35d8c80c579f45bbf65b60c2d209d5fd24af5b 100644 GIT binary patch delta 398 zcmV;90dfBA0-Xbp8Gi-<0063Kaozv`00DDSM?wIu&K&6g00CD?L_t(|obB4Zje{^0 z2k?h97j2QwryLxpN}?w2yjPPmVJB%d~NwMV}I=FhRd>Cv&n-3Uc z(s7*M{b3kL-9Iw^LXsrc&VVS2WK~rZ1OXLAVX31{w9E=2gvB|RbzM^!hLq>I_J~aV z%;Ue40qS|W@&9!B3{btB0edfME&hDORj1DZ0001RAB-^>MUkAgL_e>~^Y$yp2LJ#7 z0001hXMNwF_J3Ra%vf-ByXt7K{(?HXHfJK{rEPw4j4`>kUcgiaOltxT&j!xNS%G}T0G|-o z?(S{{1%=??U?U@=tgI|wUtbp&m+0u|f`WpUmKLC@mrpK~0x9m2Aiv=MaKPZ@&-e)_ z%vskvb7Fd0ANMfN*Wb()@%ZRL1-?BS zYxX~ycwa_A>8?yed$Z9DS(EGnDbXL+jX%_H?pT&vsyOvil#3_>(5wf)Sqj2Tu5H_r zv}rx_Hx7T9AHSCED&@_cl(>@lkU{gyUCq`K%V#DYv*|TzS$JW4$NL3Ls*SI-7%GiK lC-5!syk_^OM$kEeA-;QdO7yZX`almdc)I$ztaD0e0stA8jer0E diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png index faebe0e0550c4a7a41276f787c0f1496dbd6276e..819e7ac9d9c978d7fd87bba47ffbd86bb505a79b 100644 GIT binary patch delta 171 zcmV;c0960z0lWc_8Gi-<0047(dh`GQ00DDSM?wIu&K&6g004GLL_t(oh3(S83BVu> z1<2WLL1_OwNl2o6Bm#iH+oFT5HM`C^=kT6AI>^jq zX2i_V74uZp-n+i6);gWQ;b~4O-7XZ7N3HiB{*Z2^l(h+rY9!tSTn`v5x7o;-CjbBd Z04F$kDR^N;oe%&3002ovPDHLkV1m{Eak-;h&tK%-|;K5WujKOG4s8>4J}vk`fDbBpj|c==twbp1Ht8MnOA) zjY&*^@o6*TF3vRpQhXPD6PE7flt>6+WVsN-C@sy<^hCTPt&SCBJAM1MG8=Gx~Gd{NJZS+ zn;UtX4Fp&(oK_2{5_L;-2wQk$wu+J0k}aI#Dv!R;($<-)`?K60sDXiDf&BL8HaQY) z)w3U495eCVsNRxE*0`eH>RB!N(B= OQtIjI=d#Wzp$PyZ8d#eE diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png index e21afe8d4eb1d95295728d41429e90b26765ade0..c97a78f047727a2fd76b4e841b0bbf7a7dc86edc 100644 GIT binary patch delta 279 zcmV+y0qFjT0;d9y8Gi-<0063Kaozv`00DDSM?wIu&K&6g007}hL_t(|obB2%ii9u} z#_?~LZEat$@&cY9m3Qz$={<|r5D(x5tR!hYK(<&G1_qXyQAb?ze=SU&+U-6K^+N6vfNmxwI>vJoeCa-Q{n<=a$LiIDhUH$7wbtz&W>99H-fo zfd7C5oE^Z~zMdKEz0YM?$~h-9Q`0muvz$^=j8V(7Xc&gWeu}*Jxvp!?^Q@|>?%HXZ z4qYDr000000002|cxSBubqN3f>|*m4CfZ<;A-bkPrXMsm#F#`kN zVGw3Kp1&dmD46Ey;usR){`TC(Laqh_j@HD|mGA!_TUaq!Ajegt@Lz1lhT5J#X$%Z5 z3~~(94*qM%_Pfrw((>;4hJ#Mhoc*_|wWhgepZ~=_jhR7#34%VDHkcS$x_auYmyx@= hM}~pn;_Zgtd{=kmM{Uq*yb83E!PC{xWt~$(69DR)T2BA~ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png index c9e8398b47d94679bfbec574bbdd8c639bb7064b..683e91de958724384d033fbd3ada13b6aed64281 100644 GIT binary patch delta 165 zcmV;W09ya+0nP!CF@K0jL_t(oh3(X_4Fe$z1<;=;D`0AN@Bl2~C0NaiumwE~;j40O zB9r8b_*H;x^CcvJ5W>H^c^g&Lo@)_t&$)XWnHgpVX7-NQH^#8nRbSLv+YaD<0sttb z?B2f@p!a@lfSmKS0X`uDJl-u75lbnZdm=)u6+~on&hvb&1s+v(|BNAo5W>$LuxTA5 Tk@>Vl00000NkvXXu0mjfyxvEy delta 194 zcmV;z06qWC0qX&fF@FSSK}|sb0I`n?{9y$E000SaNLh0L01mxv2);fCe6Ku)6I^ w&iQ=zeyp|Ry{A_1r`7A06mLcV0DzAX9sAlK?eLYNg#Z8m07*qoM6N<$f(-CcVgLXD diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png index 9bbcac8268ab5a6466b66447666b6542c66ca9bc..b0e2998c0d42d5c7316397736533bb4c7ba9a464 100644 GIT binary patch delta 157 zcmey$c#Ls^VSR(Ai(^Q|oVPa@N;Vsav|hYkcV>d+qQ#r!s~6s6n6Dbt&A&zDoa6)X z>-RVqKp^3W&H2Bl_U`>Ic`^64-rd{QsSWj?elRXu?6h>syyCtoL06)bmtKj^-ncGX z=k%vvrTk!B4b~Es{rMkx`}Q2)E|GBLF}uYZ*?(s54H?89+jZz0pXWL}T^^*+)78&q Iol`;+0Kxl4oB#j- delta 204 zcmX@c_?2;jVLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=m#2$kNJZS+ zn;Uss40u=r?)x58&`?gXVM}6}A}FB{UEs?VH6?~|&-EKuw?FyD4%ETGa3M8v+Tyj& zJ?E@{Z?n9z?|rUxa>>1$@p1*~>+26JKbxnyGkhJ?3cgD`)$kdTMy0RUvJZ0{Y|1FPS8F!&+OQQB{Nk(syto&T-G@yGywo; Cc~MvZ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png index cfd725831525040c80289ad5c787cadc64f573c4..ec1962dde48680be042df398a89787a6dcfa40dc 100644 GIT binary patch delta 171 zcmey(c!hC-VSS&ci(^Q|oVPbO@-`cYxL%yEVO+tNrS<-J+?AXM^He>&1-)k|ohb0j z77yQFE64x>2kx2p-oDDK8&!4R-EL~ox$7|tmVUp$`0mX|_8(W|juqZ%OYE2u^kk0m z(k*LWOP$_y#OD0^dN;X?(fVNR4)#^iJ=uQw&3ko^nX2^5yUW)%yt4Y!%_`PV{gdh2 WJmd46Z*LcZlzO`QxvXBuz}nOWd*kchHVYUd_@E&noK-feRlsdmDe% zw|?c@y%7ChGnN|u+bO+ft)bmwS-r~W_^r#NA{e5C3K`ZdFg}*GB=$K-ou{jx%Q~lo FCIG9?Q%(Q? From 287a9a07de9911ac2f32edc4058b5330c89136df Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:29:29 +0100 Subject: [PATCH 110/130] Intellicards now have a doAfter. (#33198) * init * cleanup * Oops! Forgot something * addressing changes * guh * guh 2.0 * some cleanup * all bless the intellicard * Yippee * small locale thing * changes + small bugfix --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Silicons/StationAi/StationAiSystem.cs | 20 ++++- .../Components/IntellicardComponent.cs | 39 ++++++++++ .../StationAi/SharedStationAiSystem.Held.cs | 20 ++++- .../StationAi/SharedStationAiSystem.cs | 75 ++++++++++++++++++- .../Locale/en-US/intellicard/intellicard.ftl | 3 + .../Locale/en-US/silicons/station-ai.ftl | 2 + .../Entities/Mobs/Player/silicon.yml | 1 + 7 files changed, 153 insertions(+), 7 deletions(-) create mode 100644 Content.Shared/Intellicard/Components/IntellicardComponent.cs create mode 100644 Resources/Locale/en-US/intellicard/intellicard.ftl diff --git a/Content.Server/Silicons/StationAi/StationAiSystem.cs b/Content.Server/Silicons/StationAi/StationAiSystem.cs index 846497387d2..a10833dc63b 100644 --- a/Content.Server/Silicons/StationAi/StationAiSystem.cs +++ b/Content.Server/Silicons/StationAi/StationAiSystem.cs @@ -1,10 +1,11 @@ using System.Linq; using Content.Server.Chat.Managers; -using Content.Server.Chat.Systems; using Content.Shared.Chat; +using Content.Shared.Mind; +using Content.Shared.Roles; using Content.Shared.Silicons.StationAi; using Content.Shared.StationAi; -using Robust.Shared.Audio.Systems; +using Robust.Shared.Audio; using Robust.Shared.Map.Components; using Robust.Shared.Player; @@ -14,6 +15,8 @@ public sealed class StationAiSystem : SharedStationAiSystem { [Dependency] private readonly IChatManager _chats = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; private readonly HashSet> _ais = new(); @@ -43,6 +46,19 @@ public override bool SetWhitelistEnabled(Entity ent return true; } + public override void AnnounceIntellicardUsage(EntityUid uid, SoundSpecifier? cue = null) + { + if (!TryComp(uid, out var actor)) + return; + + var msg = Loc.GetString("ai-consciousness-download-warning"); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", msg)); + _chats.ChatMessageToOne(ChatChannel.Server, msg, wrappedMessage, default, false, actor.PlayerSession.Channel, colorOverride: Color.Red); + + if (cue != null && _mind.TryGetMind(uid, out var mindId, out _)) + _roles.MindPlaySound(mindId, cue); + } + private void AnnounceSnip(EntityUid entity) { var xform = Transform(entity); diff --git a/Content.Shared/Intellicard/Components/IntellicardComponent.cs b/Content.Shared/Intellicard/Components/IntellicardComponent.cs new file mode 100644 index 00000000000..e27174977fb --- /dev/null +++ b/Content.Shared/Intellicard/Components/IntellicardComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Intellicard; + +/// +/// Allows this entity to download the station AI onto an AiHolderComponent. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class IntellicardComponent : Component +{ + /// + /// The duration it takes to download the AI from an AiHolder. + /// + [DataField, AutoNetworkedField] + public int DownloadTime = 15; + + /// + /// The duration it takes to upload the AI to an AiHolder. + /// + [DataField, AutoNetworkedField] + public int UploadTime = 3; + + /// + /// The sound that plays for the AI + /// when they are being downloaded + /// + [DataField, AutoNetworkedField] + public SoundSpecifier? WarningSound = new SoundPathSpecifier("/Audio/Misc/notice2.ogg"); + + /// + /// The delay before allowing the warning to play again in seconds. + /// + [DataField, AutoNetworkedField] + public TimeSpan WarningDelay = TimeSpan.FromSeconds(8); + + [ViewVariables] + public TimeSpan NextWarningAllowed = TimeSpan.Zero; +} diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs index e067cf3efad..c9279b02151 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.Held.cs @@ -54,7 +54,7 @@ private void OnCoreJump(Entity ent, ref JumpToCoreEvent } /// - /// Tries to get the entity held in the AI core. + /// Tries to get the entity held in the AI core using StationAiCore. /// private bool TryGetHeld(Entity entity, out EntityUid held) { @@ -71,6 +71,24 @@ private bool TryGetHeld(Entity entity, out EntityUid he return true; } + /// + /// Tries to get the entity held in the AI using StationAiHolder. + /// + private bool TryGetHeldFromHolder(Entity entity, out EntityUid held) + { + held = EntityUid.Invalid; + + if (!Resolve(entity.Owner, ref entity.Comp)) + return false; + + if (!_containers.TryGetContainer(entity.Owner, StationAiHolderComponent.Container, out var container) || + container.ContainedEntities.Count == 0) + return false; + + held = container.ContainedEntities[0]; + return true; + } + private bool TryGetCore(EntityUid ent, out Entity core) { if (!_containers.TryGetContainingContainer(ent, out var container) || diff --git a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs index f88df9eea6b..189515635a8 100644 --- a/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs +++ b/Content.Shared/Silicons/StationAi/SharedStationAiSystem.cs @@ -4,7 +4,9 @@ using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; using Content.Shared.Doors.Systems; +using Content.Shared.DoAfter; using Content.Shared.Electrocution; +using Content.Shared.Intellicard; using Content.Shared.Interaction; using Content.Shared.Item.ItemToggle; using Content.Shared.Mind; @@ -15,6 +17,7 @@ using Content.Shared.Power.EntitySystems; using Content.Shared.StationAi; using Content.Shared.Verbs; +using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map.Components; @@ -40,6 +43,7 @@ public abstract partial class SharedStationAiSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedDoorSystem _doors = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedElectrocutionSystem _electrify = default!; [Dependency] private readonly SharedEyeSystem _eye = default!; [Dependency] protected readonly SharedMapSystem Maps = default!; @@ -87,6 +91,7 @@ public override void Initialize() SubscribeLocalEvent(OnHolderMapInit); SubscribeLocalEvent(OnHolderConInsert); SubscribeLocalEvent(OnHolderConRemove); + SubscribeLocalEvent(OnIntellicardDoAfter); SubscribeLocalEvent(OnAiInsert); SubscribeLocalEvent(OnAiRemove); @@ -197,15 +202,22 @@ private void OnAiInRange(Entity ent, ref InRangeOverr args.InRange = _vision.IsAccessible((targetXform.GridUid.Value, broadphase, grid), targetTile); } - private void OnHolderInteract(Entity ent, ref AfterInteractEvent args) + + private void OnIntellicardDoAfter(Entity ent, ref IntellicardDoAfterEvent args) { - if (!TryComp(args.Target, out StationAiHolderComponent? targetHolder)) + if (args.Cancelled) + return; + + if (args.Handled) + return; + + if (!TryComp(args.Args.Target, out StationAiHolderComponent? targetHolder)) return; // Try to insert our thing into them if (_slots.CanEject(ent.Owner, args.User, ent.Comp.Slot)) { - if (!_slots.TryInsert(args.Target.Value, targetHolder.Slot, ent.Comp.Slot.Item!.Value, args.User, excludeUserAudio: true)) + if (!_slots.TryInsert(args.Args.Target.Value, targetHolder.Slot, ent.Comp.Slot.Item!.Value, args.User, excludeUserAudio: true)) { return; } @@ -215,7 +227,7 @@ private void OnHolderInteract(Entity ent, ref AfterInt } // Otherwise try to take from them - if (_slots.CanEject(args.Target.Value, args.User, targetHolder.Slot)) + if (_slots.CanEject(args.Args.Target.Value, args.User, targetHolder.Slot)) { if (!_slots.TryInsert(ent.Owner, ent.Comp.Slot, targetHolder.Slot.Item!.Value, args.User, excludeUserAudio: true)) { @@ -226,6 +238,55 @@ private void OnHolderInteract(Entity ent, ref AfterInt } } + private void OnHolderInteract(Entity ent, ref AfterInteractEvent args) + { + if (args.Handled || !args.CanReach || args.Target == null) + return; + + if (!TryComp(args.Target, out StationAiHolderComponent? targetHolder)) + return; + + //Don't want to download/upload between several intellicards. You can just pick it up at that point. + if (HasComp(args.Target)) + return; + + if (!TryComp(args.Used, out IntellicardComponent? intelliComp)) + return; + + var cardHasAi = _slots.CanEject(ent.Owner, args.User, ent.Comp.Slot); + var coreHasAi = _slots.CanEject(args.Target.Value, args.User, targetHolder.Slot); + + if (cardHasAi && coreHasAi) + { + _popup.PopupClient(Loc.GetString("intellicard-core-occupied"), args.User, args.User, PopupType.Medium); + args.Handled = true; + return; + } + if (!cardHasAi && !coreHasAi) + { + _popup.PopupClient(Loc.GetString("intellicard-core-empty"), args.User, args.User, PopupType.Medium); + args.Handled = true; + return; + } + + if (TryGetHeldFromHolder((args.Target.Value, targetHolder), out var held) && _timing.CurTime > intelliComp.NextWarningAllowed) + { + intelliComp.NextWarningAllowed = _timing.CurTime + intelliComp.WarningDelay; + AnnounceIntellicardUsage(held, intelliComp.WarningSound); + } + + var doAfterArgs = new DoAfterArgs(EntityManager, args.User, cardHasAi ? intelliComp.UploadTime : intelliComp.DownloadTime, new IntellicardDoAfterEvent(), args.Target, ent.Owner) + { + BreakOnDamage = true, + BreakOnMove = true, + NeedHand = true, + BreakOnDropItem = true + }; + + _doAfter.TryStartDoAfter(doAfterArgs); + args.Handled = true; + } + private void OnHolderInit(Entity ent, ref ComponentInit args) { _slots.AddItemSlot(ent.Owner, StationAiHolderComponent.Container, ent.Comp.Slot); @@ -378,6 +439,8 @@ private void UpdateAppearance(Entity entity) _appearance.SetData(entity.Owner, StationAiVisualState.Key, StationAiState.Occupied); } + public virtual void AnnounceIntellicardUsage(EntityUid uid, SoundSpecifier? cue = null) { } + public virtual bool SetVisionEnabled(Entity entity, bool enabled, bool announce = false) { if (entity.Comp.Enabled == enabled) @@ -419,6 +482,10 @@ public sealed partial class JumpToCoreEvent : InstantActionEvent } +[Serializable, NetSerializable] +public sealed partial class IntellicardDoAfterEvent : SimpleDoAfterEvent; + + [Serializable, NetSerializable] public enum StationAiVisualState : byte { diff --git a/Resources/Locale/en-US/intellicard/intellicard.ftl b/Resources/Locale/en-US/intellicard/intellicard.ftl new file mode 100644 index 00000000000..aed155a1202 --- /dev/null +++ b/Resources/Locale/en-US/intellicard/intellicard.ftl @@ -0,0 +1,3 @@ +# General +intellicard-core-occupied = The AI core is already occupied by another digital consciousness. +intellicard-core-empty = The AI core has no digital consciousness to download. \ No newline at end of file diff --git a/Resources/Locale/en-US/silicons/station-ai.ftl b/Resources/Locale/en-US/silicons/station-ai.ftl index 7d9db3f6dc5..76c30eb1018 100644 --- a/Resources/Locale/en-US/silicons/station-ai.ftl +++ b/Resources/Locale/en-US/silicons/station-ai.ftl @@ -20,3 +20,5 @@ electrify-door-off = Disable overcharge toggle-light = Toggle light ai-device-not-responding = Device is not responding + +ai-consciousness-download-warning = Your consciousness is being downloaded. diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 39750b470f5..e787ef59f00 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -301,6 +301,7 @@ unshaded: Empty: { state: empty } Occupied: { state: full } + - type: Intellicard - type: entity id: PlayerStationAiEmpty From 675e42df2446855694359bbcd9298ac6af3e0e48 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 9 Nov 2024 19:30:38 +0000 Subject: [PATCH 111/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 485cad8e96d..a1a17548d48 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: pigeonpeas - changes: - - message: Added non command mantle into the winterdrobe - type: Add - id: 7100 - time: '2024-08-13T09:20:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29774 - author: TheShuEd changes: - message: change the way food is sliced - food is now sliced whole after a small @@ -3948,3 +3941,14 @@ id: 7599 time: '2024-11-08T14:50:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31710 +- author: ScarKy0 + changes: + - message: Intellicarding the AI is now a doAfter. + type: Tweak + - message: AI now gets notified when someone tries to intellicard it. + type: Add + - message: You can no longer exchange the AI between intellicards. + type: Fix + id: 7600 + time: '2024-11-09T19:29:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33198 From d1c66d71e7e554cc194f6bc1b4e197b35d3b202a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 10 Nov 2024 01:46:58 +0100 Subject: [PATCH 112/130] Update Credits (#33237) Co-authored-by: PJBot --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index 8c2ad5f5b0f..362b82c63f4 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, achookh, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, Afrokada, AftrLite, Agoichi, Ahion, aiden, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, avghdev, Awlod, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, bellwetherlogic, benev0, benjamin-burges, BGare, bhenrich, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, Magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, onoira, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, RiceMar1244, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, Sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceyLady, Spanky, spanky-spanky, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGODiamond, TGRCdev, tgrkzus, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, theOperand, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, TyAshley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, wtcwr68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zonespace27, Zylofan, Zymem, zzylex +0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, achookh, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, Afrokada, AftrLite, Agoichi, Ahion, aiden, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, avghdev, Awlod, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, bellwetherlogic, benev0, benjamin-burges, BGare, bhenrich, bhespiritu, bibbly, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, BriBrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, d4kii, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, echo, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, ertanic, esguard, estacaoespacialpirata, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, firenamefn, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, Magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, moderatelyaware, modern-nm, mokiros, Moneyl, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, NotSoDana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, och-och, OctoRocket, OldDanceJacket, OliverOtter, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, Pissachu, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QueerNB, QuietlyWhisper, qwerltaz, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, SaphireLattice, SapphicOverload, Sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SignalWalker, siigiil, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, snicket, sniperchance, Snowni, snowsignal, SolidusSnek, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, spacelizard, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spanky, spanky-spanky, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGODiamond, TGRCdev, tgrkzus, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, theOperand, TherapyGoth, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, Tr1bute, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, TyAshley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, VasilisThePikachu, veliebm, VelonacepsCalyxEggs, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, waylon531, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, zerorulez, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, Zonespace27, Zylofan, Zymem, zzylex From d939e991bba188b6a37e11f402537a93363b278e Mon Sep 17 00:00:00 2001 From: Armok <155400926+ARMOKS@users.noreply.github.com> Date: Sat, 9 Nov 2024 20:32:54 -0700 Subject: [PATCH 113/130] Removed bola stam damage (#32989) --- .../Prototypes/Entities/Objects/Weapons/Throwable/bola.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml index a4441b18f7f..f8d5efb8c68 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/bola.yml @@ -42,9 +42,9 @@ - type: Ensnaring freeTime: 2.0 breakoutTime: 3.5 #all bola should generally be fast to remove - walkSpeed: 0.7 #makeshift bola shouldn't slow too much - sprintSpeed: 0.7 - staminaDamage: 55 # Sudden weight increase sapping stamina + walkSpeed: 0.5 #makeshift bola shouldn't slow too much + sprintSpeed: 0.5 + staminaDamage: 0 # anything but this is gamebreaking canThrowTrigger: true canMoveBreakout: true - type: LandAtCursor From 33b780fd1fb853220ddda96fdd19339c30477016 Mon Sep 17 00:00:00 2001 From: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Date: Sat, 9 Nov 2024 23:26:51 -0500 Subject: [PATCH 114/130] tweak: weather command tooltip (#33130) clear weather tip --- Content.Server/Weather/WeatherSystem.cs | 4 +++- Resources/Locale/en-US/weather/weather.ftl | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Server/Weather/WeatherSystem.cs b/Content.Server/Weather/WeatherSystem.cs index dbee62a72fc..ec377809133 100644 --- a/Content.Server/Weather/WeatherSystem.cs +++ b/Content.Server/Weather/WeatherSystem.cs @@ -4,6 +4,7 @@ using Robust.Shared.Console; using Robust.Shared.GameStates; using Robust.Shared.Map; +using System.Linq; namespace Content.Server.Weather; @@ -85,6 +86,7 @@ private CompletionResult WeatherCompletion(IConsoleShell shell, string[] args) return CompletionResult.FromHintOptions(CompletionHelper.MapIds(EntityManager), "Map Id"); var a = CompletionHelper.PrototypeIDs(true, ProtoMan); - return CompletionResult.FromHintOptions(a, Loc.GetString("cmd-weather-hint")); + var b = a.Concat(new[] { new CompletionOption("null", Loc.GetString("cmd-weather-null")) }); + return CompletionResult.FromHintOptions(b, Loc.GetString("cmd-weather-hint")); } } diff --git a/Resources/Locale/en-US/weather/weather.ftl b/Resources/Locale/en-US/weather/weather.ftl index 67e6eec35f2..0c67b6f66bf 100644 --- a/Resources/Locale/en-US/weather/weather.ftl +++ b/Resources/Locale/en-US/weather/weather.ftl @@ -1,6 +1,7 @@ cmd-weather-desc = Sets the weather for the current map. cmd-weather-help = weather cmd-weather-hint = Weather prototype +cmd-weather-null = Clears the weather cmd-weather-error-no-arguments = Not enough arguments! cmd-weather-error-unknown-proto = Unknown Weather prototype! From 9396ce302aed7b1cfbe9995c9214ed8ee7cd49fc Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 10 Nov 2024 04:27:57 +0000 Subject: [PATCH 115/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a1a17548d48..9b8052d835a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: change the way food is sliced - food is now sliced whole after a small - doafter than requires multiple clicks on a single entity - type: Tweak - id: 7101 - time: '2024-08-13T10:54:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30824 - author: Ubaser changes: - message: Add two gatfruit mutations, one fake and one real capfruit which spawns @@ -3952,3 +3944,10 @@ id: 7600 time: '2024-11-09T19:29:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33198 +- author: IProduceWidgets + changes: + - message: weather now has a completion result for how to unset the weather. + type: Tweak + id: 7601 + time: '2024-11-10T04:26:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33130 From 1c8992ffbe1dc596ef377e52c3ec13d8d5ab4d5c Mon Sep 17 00:00:00 2001 From: Shaddap1 <106589956+Shaddap1@users.noreply.github.com> Date: Sun, 10 Nov 2024 06:28:55 -0500 Subject: [PATCH 116/130] Goliath rebalance (#31492) Update asteroid.yml --- Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml index 877dd40cc38..270e20e5c52 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/asteroid.yml @@ -50,12 +50,12 @@ Dead: Base: goliath_dead - type: MovementSpeedModifier - baseWalkSpeed : 2.50 - baseSprintSpeed : 2.50 + baseWalkSpeed : 2.00 + baseSprintSpeed : 2.00 - type: MobThresholds thresholds: 0: Alive - 300: Dead + 250: Dead - type: MeleeWeapon soundHit: path: "/Audio/Weapons/smash.ogg" @@ -64,7 +64,7 @@ animation: WeaponArcPunch damage: types: - Slash: 15 + Slash: 10 Piercing: 10 - type: NpcFactionMember factions: From 9b7200607b28e0c8118e70554dc7cb586b6d63a1 Mon Sep 17 00:00:00 2001 From: scrivoy <179060466+scrivoy@users.noreply.github.com> Date: Sun, 10 Nov 2024 12:40:02 +0100 Subject: [PATCH 117/130] Omega Station: Fix Air Alarm in CMO office (#33216) move air alarm and link devices --- Resources/Maps/omega.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index 7709234a6a1..31e3fc7392a 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -4648,9 +4648,13 @@ entities: - uid: 6692 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -23.5,-26.5 + rot: 3.141592653589793 rad + pos: -25.5,-29.5 parent: 4812 + - type: DeviceList + devices: + - 6253 + - 5033 - uid: 7234 components: - type: Transform @@ -54547,6 +54551,9 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-27.5 parent: 4812 + - type: DeviceNetwork + deviceLists: + - 6692 - type: AtmosPipeColor color: '#0055CCFF' - uid: 5222 @@ -55489,6 +55496,9 @@ entities: rot: 3.141592653589793 rad pos: -26.5,-26.5 parent: 4812 + - type: DeviceNetwork + deviceLists: + - 6692 - type: AtmosPipeColor color: '#990000FF' - uid: 6417 From 21979a7b5f4e1a2976440f2fdf1d7c150318931a Mon Sep 17 00:00:00 2001 From: leonidussaks <42278348+leonidussaks@users.noreply.github.com> Date: Mon, 11 Nov 2024 06:17:03 +0300 Subject: [PATCH 118/130] Fix vape use without check if doafter cancelled (#33245) vape small fix --- Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs b/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs index c3d41cead6d..26fa5ca3cc8 100644 --- a/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs +++ b/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs @@ -122,8 +122,7 @@ private void OnVapeInteraction(Entity entity, ref AfterInteractEv private void OnVapeDoAfter(Entity entity, ref VapeDoAfterEvent args) { - if (args.Handled - || args.Args.Target == null) + if (args.Cancelled || args.Handled || args.Args.Target == null) return; var environment = _atmos.GetContainingMixture(args.Args.Target.Value, true, true); From 197d9e68dcc3419ce45844ad64b95fecff680271 Mon Sep 17 00:00:00 2001 From: BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> Date: Mon, 11 Nov 2024 04:22:03 +0100 Subject: [PATCH 119/130] HOTFIX: Fix Security Shell Gun being uncraftable. (#33247) * Sec Shell Gun Craftability Hotfix * Capital Fix --- Resources/Prototypes/Entities/Structures/Machines/lathe.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index b27f2cc1b98..020566ad1a7 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -768,6 +768,7 @@ - TargetHuman - TargetSyndicate - WeaponDisablerPractice + - WeaponFlareGunSecurity - WeaponLaserCarbinePractice - Zipties dynamicRecipes: From a138fede2bda4dcc3901898a5e3cacc415a68c86 Mon Sep 17 00:00:00 2001 From: BramvanZijp <56019239+BramvanZijp@users.noreply.github.com> Date: Mon, 11 Nov 2024 17:12:36 +0100 Subject: [PATCH 120/130] Make the Flare Gun & Security Shell Gun be unbolted by default. (#33248) --- .../Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml index b63036c58b2..224697bc93f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml @@ -27,7 +27,7 @@ gun_chamber: !type:ContainerSlot - type: ChamberMagazineAmmoProvider autoCycle: false - boltClosed: true + boltClosed: false canRack: false soundBoltClosed: /Audio/Weapons/Guns/Cock/revolver_cock.ogg soundBoltOpened: /Audio/Weapons/Guns/Cock/revolver_cock.ogg From b9c2b0c41b16fe46dbd5cb056e1d5a1b0f8d251f Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 11 Nov 2024 16:13:45 +0000 Subject: [PATCH 121/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9b8052d835a..6abb7cc6a5e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Add two gatfruit mutations, one fake and one real capfruit which spawns - cap guns when eaten. - type: Add - id: 7102 - time: '2024-08-13T11:08:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30850 - author: slarticodefast changes: - message: Added new keybindings for rotating and flipping objects. The defaults @@ -3951,3 +3943,10 @@ id: 7601 time: '2024-11-10T04:26:51.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33130 +- author: BramvanZijp + changes: + - message: The Flare Gun & Security Shell Gun now start in their open/unbolted state. + type: Tweak + id: 7602 + time: '2024-11-11T16:12:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33248 From 1136200dc838a5fd0a5a347025b703b968cdabec Mon Sep 17 00:00:00 2001 From: Andrew Montagne Date: Mon, 11 Nov 2024 22:58:31 +0000 Subject: [PATCH 122/130] BUGFIX: Fix APEs being able to be turned on without power (#32493) Add a check to see the APC is powered before turning the emitter on. --- Content.Server/Singularity/EntitySystems/EmitterSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Singularity/EntitySystems/EmitterSystem.cs b/Content.Server/Singularity/EntitySystems/EmitterSystem.cs index 1ada60e1d64..f828139ed6f 100644 --- a/Content.Server/Singularity/EntitySystems/EmitterSystem.cs +++ b/Content.Server/Singularity/EntitySystems/EmitterSystem.cs @@ -196,7 +196,8 @@ public void SwitchOn(EntityUid uid, EmitterComponent component) if (TryComp(uid, out var apcReceiver)) { apcReceiver.Load = component.PowerUseActive; - PowerOn(uid, component); + if (apcReceiver.Powered) + PowerOn(uid, component); } // Do not directly PowerOn(). // OnReceivedPowerChanged will get fired due to DrawRate change which will turn it on. From 37958378cbec572b0de11676c6962983ff2c58d5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 11 Nov 2024 22:59:38 +0000 Subject: [PATCH 123/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6abb7cc6a5e..43c7cad22c6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Added new keybindings for rotating and flipping objects. The defaults - are R for clockwise, Shift+R for counterclockwise and F for flipping. - type: Add - id: 7103 - time: '2024-08-13T13:36:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30540 - author: Cojoke-dot changes: - message: Borg's names are now displayed when they make an announcement on the @@ -3950,3 +3942,10 @@ id: 7602 time: '2024-11-11T16:12:36.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33248 +- author: AndrewMontagne + changes: + - message: APEs could be powered on without local power + type: Fix + id: 7603 + time: '2024-11-11T22:58:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32493 From a1966d867183f2962d17ef5415dc89b3cde54253 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:19:54 +0300 Subject: [PATCH 124/130] improve BiomeDunGen (#33113) * improve BiomeDunGen * forgot lol * Update DungeonJob.PostGenBiome.cs * Update DungeonJob.PostGenBiome.cs --- .../DungeonJob/DungeonJob.PostGenBiome.cs | 25 ++++++++++++------- .../Parallax/Biomes/SharedBiomeSystem.cs | 2 +- .../Procedural/PostGeneration/BiomeDunGen.cs | 7 ++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs b/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs index 65f6d2d14f9..fdadcb7849d 100644 --- a/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs +++ b/Content.Server/Procedural/DungeonJob/DungeonJob.PostGenBiome.cs @@ -1,5 +1,6 @@ using System.Threading.Tasks; using Content.Server.Parallax; +using Content.Shared.Maps; using Content.Shared.Parallax.Biomes; using Content.Shared.Procedural; using Content.Shared.Procedural.PostGeneration; @@ -15,27 +16,35 @@ public sealed partial class DungeonJob /// private async Task PostGen(BiomeDunGen dunGen, DungeonData data, Dungeon dungeon, HashSet reservedTiles, Random random) { - if (_entManager.TryGetComponent(_gridUid, out BiomeComponent? biomeComp)) + if (!_prototype.TryIndex(dunGen.BiomeTemplate, out var indexedBiome)) return; - biomeComp = _entManager.AddComponent(_gridUid); var biomeSystem = _entManager.System(); - biomeSystem.SetTemplate(_gridUid, biomeComp, _prototype.Index(dunGen.BiomeTemplate)); + var seed = random.Next(); var xformQuery = _entManager.GetEntityQuery(); - foreach (var node in dungeon.RoomTiles) + var tiles = _maps.GetAllTilesEnumerator(_gridUid, _grid); + while (tiles.MoveNext(out var tileRef)) { + var node = tileRef.Value.GridIndices; + if (reservedTiles.Contains(node)) continue; + + if (dunGen.TileMask is not null) + { + if (!dunGen.TileMask.Contains(((ContentTileDefinition) _tileDefManager[tileRef.Value.Tile.TypeId]).ID)) + continue; + } // Need to set per-tile to override data. - if (biomeSystem.TryGetTile(node, biomeComp.Layers, seed, _grid, out var tile)) + if (biomeSystem.TryGetTile(node, indexedBiome.Layers, seed, _grid, out var tile)) { _maps.SetTile(_gridUid, _grid, node, tile.Value); } - if (biomeSystem.TryGetDecals(node, biomeComp.Layers, seed, _grid, out var decals)) + if (biomeSystem.TryGetDecals(node, indexedBiome.Layers, seed, _grid, out var decals)) { foreach (var decal in decals) { @@ -43,7 +52,7 @@ private async Task PostGen(BiomeDunGen dunGen, DungeonData data, Dungeon dungeon } } - if (biomeSystem.TryGetEntity(node, biomeComp, _grid, out var entityProto)) + if (tile is not null && biomeSystem.TryGetEntity(node, indexedBiome.Layers, tile.Value, seed, _grid, out var entityProto)) { var ent = _entManager.SpawnEntity(entityProto, new EntityCoordinates(_gridUid, node + _grid.TileSizeHalfVector)); var xform = xformQuery.Get(ent); @@ -61,7 +70,5 @@ private async Task PostGen(BiomeDunGen dunGen, DungeonData data, Dungeon dungeon if (!ValidateResume()) return; } - - biomeComp.Enabled = false; } } diff --git a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs index b14baba9817..250b0f70a54 100644 --- a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs +++ b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs @@ -183,7 +183,7 @@ public bool TryGetEntity(Vector2i indices, BiomeComponent component, MapGridComp } - private bool TryGetEntity(Vector2i indices, List layers, Tile tileRef, int seed, MapGridComponent grid, + public bool TryGetEntity(Vector2i indices, List layers, Tile tileRef, int seed, MapGridComponent grid, [NotNullWhen(true)] out string? entity) { var tileId = TileDefManager[tileRef.TypeId].ID; diff --git a/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs b/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs index 833cf2dec76..e21e582211b 100644 --- a/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs +++ b/Content.Shared/Procedural/PostGeneration/BiomeDunGen.cs @@ -1,3 +1,4 @@ +using Content.Shared.Maps; using Content.Shared.Parallax.Biomes; using Robust.Shared.Prototypes; @@ -11,4 +12,10 @@ public sealed partial class BiomeDunGen : IDunGenLayer { [DataField(required: true)] public ProtoId BiomeTemplate; + + /// + /// creates a biome only on the specified tiles + /// + [DataField] + public HashSet>? TileMask; } From 70e3650246bcf0f32f5d5a78b8238dc6c486a2e5 Mon Sep 17 00:00:00 2001 From: Preston Smith <92108534+thetolbean@users.noreply.github.com> Date: Tue, 12 Nov 2024 06:06:43 -0600 Subject: [PATCH 125/130] Make Droppers Respect Closed/Sealed Containers (#33011) * Make droppers respect closed/sealed * Combine nested * Optimize conditions a bit --- Content.Server/Chemistry/EntitySystems/InjectorSystem.cs | 9 ++++++--- Content.Shared/Chemistry/Components/InjectorComponent.cs | 9 +++++++++ .../Prototypes/Entities/Objects/Specific/chemistry.yml | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs index c5c45daa5bd..eb2039604af 100644 --- a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs @@ -13,6 +13,7 @@ using Content.Shared.Interaction; using Content.Shared.Mobs.Components; using Content.Shared.Stacks; +using Content.Shared.Nutrition.EntitySystems; namespace Content.Server.Chemistry.EntitySystems; @@ -20,6 +21,7 @@ public sealed class InjectorSystem : SharedInjectorSystem { [Dependency] private readonly BloodstreamSystem _blood = default!; [Dependency] private readonly ReactiveSystem _reactiveSystem = default!; + [Dependency] private readonly OpenableSystem _openable = default!; public override void Initialize() { @@ -31,13 +33,14 @@ public override void Initialize() private bool TryUseInjector(Entity injector, EntityUid target, EntityUid user) { + var isOpenOrIgnored = injector.Comp.IgnoreClosed || !_openable.IsClosed(target); // Handle injecting/drawing for solutions if (injector.Comp.ToggleState == InjectorToggleMode.Inject) { - if (SolutionContainers.TryGetInjectableSolution(target, out var injectableSolution, out _)) + if (isOpenOrIgnored && SolutionContainers.TryGetInjectableSolution(target, out var injectableSolution, out _)) return TryInject(injector, target, injectableSolution.Value, user, false); - if (SolutionContainers.TryGetRefillableSolution(target, out var refillableSolution, out _)) + if (isOpenOrIgnored && SolutionContainers.TryGetRefillableSolution(target, out var refillableSolution, out _)) return TryInject(injector, target, refillableSolution.Value, user, true); if (TryComp(target, out var bloodstream)) @@ -58,7 +61,7 @@ private bool TryUseInjector(Entity injector, EntityUid target } // Draw from an object (food, beaker, etc) - if (SolutionContainers.TryGetDrawableSolution(target, out var drawableSolution, out _)) + if (isOpenOrIgnored && SolutionContainers.TryGetDrawableSolution(target, out var drawableSolution, out _)) return TryDraw(injector, target, drawableSolution.Value, user); Popup.PopupEntity(Loc.GetString("injector-component-cannot-draw-message", diff --git a/Content.Shared/Chemistry/Components/InjectorComponent.cs b/Content.Shared/Chemistry/Components/InjectorComponent.cs index 17a65ef1c17..ebd6654d9f5 100644 --- a/Content.Shared/Chemistry/Components/InjectorComponent.cs +++ b/Content.Shared/Chemistry/Components/InjectorComponent.cs @@ -45,6 +45,15 @@ public sealed partial class InjectorComponent : Component [DataField] public bool IgnoreMobs; + /// + /// Whether or not the injector is able to draw from or inject into containers that are closed/sealed + /// + /// + /// for example: droppers can not inject into cans, but syringes can + /// + [DataField] + public bool IgnoreClosed = true; + /// /// The minimum amount of solution that can be transferred at once from this solution. /// diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index 527b0ba5e62..edaa8288145 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -283,6 +283,7 @@ - type: Injector injectOnly: false ignoreMobs: true + ignoreClosed: false minTransferAmount: 1 maxTransferAmount: 5 transferAmount: 1 From 8776c71e5972cc6daec3271b5e6528e48d796770 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 12 Nov 2024 12:07:50 +0000 Subject: [PATCH 126/130] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 43c7cad22c6..4ab88b325b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Cojoke-dot - changes: - - message: Borg's names are now displayed when they make an announcement on the - Communications Console. - type: Tweak - id: 7104 - time: '2024-08-13T18:31:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30107 - author: Spessmann changes: - message: Added Cog, a new midpop map based on Cogmap from ss13 @@ -3949,3 +3941,10 @@ id: 7603 time: '2024-11-11T22:58:31.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32493 +- author: thetolbean + changes: + - message: Droppers can no longer inject or draw from closed containers. + type: Fix + id: 7604 + time: '2024-11-12T12:06:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33011 From 8b154899b515e0d7552d283c3086c417ae00ab7c Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Tue, 12 Nov 2024 22:11:02 +0300 Subject: [PATCH 127/130] Allow editing angle of the fired projectile (#33254) Add Angle datafield to `ProjectileComponent`. It allows to change the angle of the fired projectile --- Content.Shared/Projectiles/ProjectileComponent.cs | 6 ++++++ Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Projectiles/ProjectileComponent.cs b/Content.Shared/Projectiles/ProjectileComponent.cs index c24cf2b5ee5..8349252df2b 100644 --- a/Content.Shared/Projectiles/ProjectileComponent.cs +++ b/Content.Shared/Projectiles/ProjectileComponent.cs @@ -8,6 +8,12 @@ namespace Content.Shared.Projectiles; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ProjectileComponent : Component { + /// + /// The angle of the fired projectile. + /// + [DataField, AutoNetworkedField] + public Angle Angle; + /// /// The effect that appears when a projectile collides with an entity. /// diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 9bd786bbe08..c7cc09e618b 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -429,7 +429,7 @@ public void ShootProjectile(EntityUid uid, Vector2 direction, Vector2 gunVelocit Projectiles.SetShooter(uid, projectile, user ?? gunUid); projectile.Weapon = gunUid; - TransformSystem.SetWorldRotation(uid, direction.ToWorldAngle()); + TransformSystem.SetWorldRotation(uid, direction.ToWorldAngle() + projectile.Angle); } protected abstract void Popup(string message, EntityUid? uid, EntityUid? user); From ef51700094aa22cd1ce7f243d934dc3c45d4ff7f Mon Sep 17 00:00:00 2001 From: Repo <47093363+Titian3@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:03:13 +1300 Subject: [PATCH 128/130] Fix unban/editing role bans placed in groups. (#30659) * On editing a roleban, get all the bans with the same time. * forgoten newline * Update to check for player ID too. --- Content.Server/Database/ServerDbBase.cs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index c85b774e381..3806241e345 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -512,16 +512,23 @@ public abstract Task> GetServerRoleBansAsync(IPAddress? a public async Task EditServerRoleBan(int id, string reason, NoteSeverity severity, DateTimeOffset? expiration, Guid editedBy, DateTimeOffset editedAt) { await using var db = await GetDb(); + var roleBanDetails = await db.DbContext.RoleBan + .Where(b => b.Id == id) + .Select(b => new { b.BanTime, b.PlayerUserId }) + .SingleOrDefaultAsync(); - var ban = await db.DbContext.RoleBan.SingleOrDefaultAsync(b => b.Id == id); - if (ban is null) + if (roleBanDetails == default) return; - ban.Severity = severity; - ban.Reason = reason; - ban.ExpirationTime = expiration?.UtcDateTime; - ban.LastEditedById = editedBy; - ban.LastEditedAt = editedAt.UtcDateTime; - await db.DbContext.SaveChangesAsync(); + + await db.DbContext.RoleBan + .Where(b => b.BanTime == roleBanDetails.BanTime && b.PlayerUserId == roleBanDetails.PlayerUserId) + .ExecuteUpdateAsync(setters => setters + .SetProperty(b => b.Severity, severity) + .SetProperty(b => b.Reason, reason) + .SetProperty(b => b.ExpirationTime, expiration.HasValue ? expiration.Value.UtcDateTime : (DateTime?)null) + .SetProperty(b => b.LastEditedById, editedBy) + .SetProperty(b => b.LastEditedAt, editedAt.UtcDateTime) + ); } #endregion From cc3712be0c3e0da2921cfc6c98897780e975db63 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 12 Nov 2024 21:04:21 +0000 Subject: [PATCH 129/130] Automatic changelog update --- Resources/Changelog/Admin.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 56c82c23a43..680915d3821 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -590,5 +590,12 @@ Entries: id: 73 time: '2024-11-02T13:21:10.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32461 +- author: Repo + changes: + - message: All role bans in a set are updated on edits now. + type: Fix + id: 74 + time: '2024-11-12T21:03:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/30659 Name: Admin Order: 1 From af3593a3b7c2a36b0e0c4a19cc846e96f139fb58 Mon Sep 17 00:00:00 2001 From: SpaceRox1244 <138547931+SpaceRox1244@users.noreply.github.com> Date: Tue, 12 Nov 2024 18:45:59 -0500 Subject: [PATCH 130/130] Adds new sprites for shotgun shell boxes (#33176) * Adds new sprites for shotgun shell boxes * Adds second set of mag visuals for slug and uranium casings * Fixes yaml that I messed up * Changes credit to new username before merging happens --- .../Weapons/Guns/Ammunition/Boxes/shotgun.yml | 95 ++++++++++++------ .../Ammunition/Boxes/shotgun.rsi/base.png | Bin 0 -> 356 bytes .../Ammunition/Boxes/shotgun.rsi/beanbag.png | Bin 0 -> 268 bytes .../Ammunition/Boxes/shotgun.rsi/flare.png | Bin 0 -> 229 bytes .../Boxes/shotgun.rsi/incendiary.png | Bin 0 -> 233 bytes .../Ammunition/Boxes/shotgun.rsi/lethal.png | Bin 0 -> 263 bytes .../Ammunition/Boxes/shotgun.rsi/mag-1.png | Bin 0 -> 107 bytes .../Ammunition/Boxes/shotgun.rsi/mag-2.png | Bin 0 -> 134 bytes .../Ammunition/Boxes/shotgun.rsi/mag-3.png | Bin 0 -> 142 bytes .../Ammunition/Boxes/shotgun.rsi/mag-4.png | Bin 0 -> 155 bytes .../Boxes/shotgun.rsi/mag-alt-1.png | Bin 0 -> 106 bytes .../Boxes/shotgun.rsi/mag-alt-2.png | Bin 0 -> 127 bytes .../Boxes/shotgun.rsi/mag-alt-3.png | Bin 0 -> 135 bytes .../Boxes/shotgun.rsi/mag-alt-4.png | Bin 0 -> 151 bytes .../Ammunition/Boxes/shotgun.rsi/meta.json | 62 ++++++++++++ .../Ammunition/Boxes/shotgun.rsi/practice.png | Bin 0 -> 221 bytes .../Ammunition/Boxes/shotgun.rsi/slug.png | Bin 0 -> 257 bytes .../Boxes/shotgun.rsi/tranquilizer.png | Bin 0 -> 292 bytes .../Ammunition/Boxes/shotgun.rsi/uranium.png | Bin 0 -> 249 bytes 19 files changed, 125 insertions(+), 32 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/base.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/beanbag.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/flare.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/incendiary.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/lethal.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-1.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-2.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-3.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-4.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-1.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-2.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-3.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-4.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/practice.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/slug.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/tranquilizer.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/uranium.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.yml index 063937aee9a..e5c2987ec3e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.yml @@ -16,114 +16,145 @@ id: AmmoProviderShotgunShell abstract: true components: + - type: Sprite + sprite: Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi - type: BallisticAmmoProvider mayTransfer: true whitelist: tags: - ShellShotgun capacity: 16 + - type: MagazineVisuals + magState: mag + steps: 5 + zeroVisible: false + - type: Appearance # Shotgun Shells - type: entity - name: shotgun beanbag cartridges dispenser parent: AmmoProviderShotgunShell id: BoxBeanbag - description: A dispenser box full of beanbag shots, designed for riot shotguns. + name: shell box (beanbag) components: - type: BallisticAmmoProvider proto: ShellShotgunBeanbag - type: Sprite layers: - - state: boxwide - - state: shellbeanbag + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: beanbag - type: entity - name: shotgun lethal cartridges dispenser + name: shell box (lethal) parent: AmmoProviderShotgunShell id: BoxLethalshot - description: A dispenser box full of lethal pellet shots, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgun - type: Sprite layers: - - state: boxwide - - state: shelllethal + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: lethal - type: entity - name: shotgun slug cartridges dispenser + name: shell box (slug) parent: AmmoProviderShotgunShell id: BoxShotgunSlug - description: A dispenser box full of slugs, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgunSlug + - type: MagazineVisuals + magState: mag-alt + steps: 5 + zeroVisible: false - type: Sprite layers: - - state: boxwide - - state: shellslug + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-alt-1 + map: ["enum.GunVisualLayers.Mag"] + - state: slug - type: entity - name: shotgun flare cartridges dispenser + name: shell box (flare) parent: AmmoProviderShotgunShell id: BoxShotgunFlare - description: A dispenser box full of flare cartridges, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgunFlare - type: Sprite layers: - - state: boxwide - - state: shellflare + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: flare - type: entity - name: shotgun incendiary cartridges dispenser + name: shell box (incendiary) parent: AmmoProviderShotgunShell id: BoxShotgunIncendiary - description: A dispenser box full of incendiary cartridges, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgunIncendiary - type: Sprite layers: - - state: boxwide - - state: shellincendiary + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: incendiary - type: entity - name: shotgun uranium cartridges dispenser + name: shell box (uranium) parent: AmmoProviderShotgunShell id: BoxShotgunUranium - description: A dispenser box full of uranium cartridges, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgunUranium + - type: MagazineVisuals + magState: mag-alt + steps: 5 + zeroVisible: false - type: Sprite layers: - - state: boxwide - - state: shelluranium + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-alt-1 + map: ["enum.GunVisualLayers.Mag"] + - state: uranium - type: entity - name: shotgun practice cartridges dispenser + name: shell box (practice) parent: AmmoProviderShotgunShell id: BoxShotgunPractice - description: A dispenser box full of practice cartridges, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellShotgunPractice - type: Sprite layers: - - state: boxwide - - state: shellpractice + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: practice - type: entity - name: tranquilizer cartridges dispenser + name: shell box (tranquilizer) parent: AmmoProviderShotgunShell id: BoxShellTranquilizer - description: A dispenser box full of tranquilizer cartridges, designed for riot shotguns. components: - type: BallisticAmmoProvider proto: ShellTranquilizer - type: Sprite layers: - - state: boxwide - - state: shelltranquilizer + - state: base + map: ["enum.GunVisualLayers.Base"] + - state: mag-1 + map: ["enum.GunVisualLayers.Mag"] + - state: tranquilizer diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/base.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..f460615079dcbc3bc4f0244f62ee6d194767a522 GIT binary patch literal 356 zcmV-q0h|7bP)hx<)!^4}S=qr;oC$=T7E*eH6r?v$|0={nqU@&~G zWz|}{fhhEq1nVMsSP_UqUv)bz&d)sKwUt`%^cX1MAXuK4tN8B(^k4}~6PYbGxqD>} zM;g-SWbkaUq1$PtzJE-92}Lh^*k;OTtF%jo^+{zgOC^y)Od`q8?g;b1re z>v#*m&GjV!&!bNO?(f<_@xd!Cpo=^Nx2)rBsbHbfcc5yxk-&7ms}z();THT1m4e@% z>%5JZ$y&Pt+QtVWWrD5H4|=K}^o;)h4u`|>@7M#Kfp=<`U7Q{O0000}H>5)pw;==K7x8V+~bjYGKg9f2R2p+y&jDE6VgRn&_y0wAB0m6NxliC=S9@r!`VoAb<|1Kiva}4|oD-LF z?gCXJm%+1EaDnv^K-uc?to)Xx<@j;W2bS%37N`=*(t5#-pfslO_bv#6&^9l%CPK^P)v*1c-(z8(jS<5Z9eZF44L1lhRrKFOqG*ah#5% z2#N@;Js=`X5%wY}!d~Q`z+o>D7cjwe03Y|x;WfXh39p&~GEh}ln{V0sO+%=vB*PNa za&VfqfDFx-&U_7v1NpNyjt^qe&6+mp|tO@wD2bZya0gHIOC*Y2?pwdyO1K- fecv6&arWi|ytPQ)duV{k00000NkvXXu0mjfSx8_g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/incendiary.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/incendiary.png new file mode 100644 index 0000000000000000000000000000000000000000..7841707b120f3e1f4577f6c4320b31e2cac551b4 GIT binary patch literal 233 zcmV4nT^wv_^1KwK30C|xZATRPuU@@173Wy*&fag=?@RZ-AgeT1aY1lb8`FKw6vxcy9 zj->epl`Nd17LcZR(}~w`_3y>)9!(5AZ?7fRZ997BaetqOBbw?09|_ujP)GfE;=68&th|NUdT zGHuJ$w6IPqu7@=MWztMI=j`cVEeWvLo!komERzeshe$!t2G?oT6o%$KtpvJ6{LAwl z+yl?1SYP#qd%IT!~_O8cNpWzqlu N002ovPDHLkV1hD0ZubBH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-1.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d77e6507b00fc0910aba7e959d2561f9e0b122e9 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzBTpB{kcif|=L~rn6a-id%6t;v ziHj^`S8it)6S}08kwaP0uAd0TO=D~gJvs9|53PjNBTiZBohMzr{0#T4{i(q!PC{xWt~$(69DIjFhu|W literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-4.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-4.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3c99707fe47b7133a9a2c0937a993983074206 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJBu^K|kcif|7Z>t27>KxD3_ly> zF)cxeWz{lfL6vz4k_)UC$Tv+$$YfRAncna_{*x*L!@n~dHzq%x<)&e)Yi zOU%kYt$01~*8O!%3}Tb+sC++u?WT)y@ZGy^xL(e jS6z<0vSeWR(aX)dQ?BLIq?BnulNmf+{an^LB{Ts519mUd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-4.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/mag-alt-4.png new file mode 100644 index 0000000000000000000000000000000000000000..60be778fdfd459489e53186dddd46287574d4860 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJI8PVHkcif|7Y%t281T4Uynl&9 zZZoIMXM=_h9U=_JCg$Cp?Xgzt?(ICwXe$9h!Jo$E^WWK(TlHN%%#h~xe(o8T1=oJ< zcpp=F;Ecx73sK6(@Bi#FJl4~(mea+>#lZ&O)=-MRXEfi^LCy85}Sb4q9e0Ns>1 Ah5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/meta.json new file mode 100644 index 00000000000..3df588a845e --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by SpaceRox1244", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "mag-1" + }, + { + "name": "mag-2" + }, + { + "name": "mag-3" + }, + { + "name": "mag-4" + }, + { + "name": "mag-alt-1" + }, + { + "name": "mag-alt-2" + }, + { + "name": "mag-alt-3" + }, + { + "name": "mag-alt-4" + }, + { + "name": "lethal" + }, + { + "name": "beanbag" + }, + { + "name": "slug" + }, + { + "name": "incendiary" + }, + { + "name": "practice" + }, + { + "name": "uranium" + }, + { + "name": "flare" + }, + { + "name": "tranquilizer" + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/practice.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/practice.png new file mode 100644 index 0000000000000000000000000000000000000000..4ece8a0c1e58a1bca6482dca0ecd2fc9a52a1863 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJC7v#hArY-_CvW6sR^)N@oua3_ zq$6gdTUdh4vJYnJwX1k0{#)+k)m$V{67w)T`XB!j{YMt(To?>i7i~Sh(}iJ;=ug!G zORpoW(>8ozIGdAKaX!21(C)kky8M%J^yFXu-J1R*`pL2BEdoxwayN~20u)aMowC=y zcD>*`{}Bo2u&0|vcABSc%M})!I3;L?;&qkPLJXcl3}<^TXK!zps;k)W*y5azo#3i? VpBJTKr-ANe@O1TaS?83{1OOy{RxJPk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/slug.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/slug.png new file mode 100644 index 0000000000000000000000000000000000000000..b55085e398ea1f2ecb6f5477a62a21d1728a009b GIT binary patch literal 257 zcmV+c0sj7pP)~|XgfOGES>`4NFvZ`?!hFfvq zCjvnN0PaP+_s_*qxr-P9=UfPW5Sdb(gzH4|f4hPp2;Xo9cZ^oa(r~ID00000NkvXX Hu0mjfHM(oI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/tranquilizer.png b/Resources/Textures/Objects/Weapons/Guns/Ammunition/Boxes/shotgun.rsi/tranquilizer.png new file mode 100644 index 0000000000000000000000000000000000000000..373d6a2a0c91a69c140798bcf956464736eb65bd GIT binary patch literal 292 zcmV+<0o(qGP)3F6RKzUc&7bmQfCZG!zg>vnzuPY5Y3> zXudc8flMZokV-_?b*)o-P>E&iL( z-tGP@KKy%QOuTID#$(&^Wi0?J=MFi@A#6oc1By zf{$%`neV#jnhyz#MF5Pol-}QipCDS`ce5!F(Q(~xR0-$pZ5DAwr=#sF~gnD q=5zWGo(fJvC896+a+ypf^G?q6I%Uv_PY+B00000IJ-kcM(tGQCxciFQAiV6_?(?B`%GKR!Ksz2=AK$dGGyS z!UI7N5>nNLt?I(|?I9v>65s9zzY-CFUg&iJr`vJb@Q~MpglE2mT5CJm4FT9Mj-7o@ zvRU1{XXm~G0Qq_Z!16G+&mu0k+{^%IF#a<`1iD1dm(wFSYF2b-D^gzL!-E8jF&SV1 zlv1B++|hftf_|Wt;8i3hI0;&7>tqB$5dM}stTH=wmQOP{00000NkvXXu0mjfYxrZ$ literal 0 HcmV?d00001