From 769f899420c831504cf70d5fa55e4f43bcc3f1a1 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Tue, 30 Jun 2026 04:40:58 +0700 Subject: [PATCH 01/12] =?UTF-8?q?=D0=B2=D0=B7=D1=8F=D0=BB=20=D1=83=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BD=D1=80=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../_Arcane/MarkingWhitelistManager.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Content.Client/_Arcane/MarkingWhitelistManager.cs diff --git a/Content.Client/_Arcane/MarkingWhitelistManager.cs b/Content.Client/_Arcane/MarkingWhitelistManager.cs new file mode 100644 index 00000000000..6b40bb7359a --- /dev/null +++ b/Content.Client/_Arcane/MarkingWhitelistManager.cs @@ -0,0 +1,29 @@ +using Content.Shared.Humanoid.Markings; +using Robust.Shared.Player; + +namespace Content.Shared.SpecialWhitelist; + +public sealed class MarkingWhitelistManager +{ + public static bool IsMarkingAllowed(MarkingPrototype marking, ICommonSession? session) + { + // Если вайтлиста нет — разметка доступна всем + if (marking.Whitelist == null || marking.Whitelist.Allowed.Count == 0) + return true; + + // Если сессии нет (например, локальный просмотр без игрока), скрываем на всякий случай + if (session == null) + return false; + + // Для привязки к аккаунту используем login username, а не отображаемое имя персонажа. + var ckey = session.Data.UserName; + + foreach (var allowedCkey in marking.Whitelist.Allowed) + { + if (string.Equals(allowedCkey, ckey, StringComparison.OrdinalIgnoreCase)) + return true; + } + + return false; + } +} From 73dbd0d87f1fc94cc44e47128b37d077ac8839a5 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Tue, 30 Jun 2026 05:23:18 +0700 Subject: [PATCH 02/12] =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=88=D0=BB=D1=8B?= =?UTF-8?q?=D0=B9=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=D1=81=D1=8F=20=D0=BD=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Shared/Humanoid/Markings/MarkingPrototype.cs | 4 ++++ .../_Arcane/MarkingWhitelistManager.cs | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) rename {Content.Client => Content.Shared}/_Arcane/MarkingWhitelistManager.cs (80%) diff --git a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs index 152610a216a..ba907ac2e06 100644 --- a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs +++ b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs @@ -69,5 +69,9 @@ public Marking AsMarking() { return new Marking(ID, Sprites.Count); } + // Arcane - Start + [DataField("whitelist")] + public MarkingWhitelistData? Whitelist { get; private set; } + // Arcane - End } } diff --git a/Content.Client/_Arcane/MarkingWhitelistManager.cs b/Content.Shared/_Arcane/MarkingWhitelistManager.cs similarity index 80% rename from Content.Client/_Arcane/MarkingWhitelistManager.cs rename to Content.Shared/_Arcane/MarkingWhitelistManager.cs index 6b40bb7359a..06585bf7d82 100644 --- a/Content.Client/_Arcane/MarkingWhitelistManager.cs +++ b/Content.Shared/_Arcane/MarkingWhitelistManager.cs @@ -1,9 +1,14 @@ using Content.Shared.Humanoid.Markings; using Robust.Shared.Player; -namespace Content.Shared.SpecialWhitelist; +namespace Content.Shared._Arcane.SpecialWhitelist; -public sealed class MarkingWhitelistManager +public sealed partial class MarkingWhitelistData +{ + [DataField("allowed")] + public List Allowed { get; private set; } = new(); +} +public static class MarkingWhitelistManager { public static bool IsMarkingAllowed(MarkingPrototype marking, ICommonSession? session) { From a6e484d8e998b30a713ea0585e0d87fb1417aee0 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Tue, 30 Jun 2026 05:40:53 +0700 Subject: [PATCH 03/12] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B4=D0=B0=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Shared/Humanoid/Markings/MarkingPrototype.cs | 1 + Content.Shared/_Arcane/MarkingWhitelistData.cs | 10 ++++++++++ Content.Shared/_Arcane/MarkingWhitelistManager.cs | 5 ----- 3 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 Content.Shared/_Arcane/MarkingWhitelistData.cs diff --git a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs index ba907ac2e06..f92b1cb1086 100644 --- a/Content.Shared/Humanoid/Markings/MarkingPrototype.cs +++ b/Content.Shared/Humanoid/Markings/MarkingPrototype.cs @@ -17,6 +17,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; +using Content.Shared._Arcane.SpecialWhitelist; namespace Content.Shared.Humanoid.Markings { diff --git a/Content.Shared/_Arcane/MarkingWhitelistData.cs b/Content.Shared/_Arcane/MarkingWhitelistData.cs new file mode 100644 index 00000000000..88789d1bc2a --- /dev/null +++ b/Content.Shared/_Arcane/MarkingWhitelistData.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._Arcane.SpecialWhitelist; + +[DataDefinition] +public sealed partial class MarkingWhitelistData +{ + [DataField("allowed")] + public List Allowed { get; private set; } = new(); +} diff --git a/Content.Shared/_Arcane/MarkingWhitelistManager.cs b/Content.Shared/_Arcane/MarkingWhitelistManager.cs index 06585bf7d82..63af2b62ee0 100644 --- a/Content.Shared/_Arcane/MarkingWhitelistManager.cs +++ b/Content.Shared/_Arcane/MarkingWhitelistManager.cs @@ -3,11 +3,6 @@ namespace Content.Shared._Arcane.SpecialWhitelist; -public sealed partial class MarkingWhitelistData -{ - [DataField("allowed")] - public List Allowed { get; private set; } = new(); -} public static class MarkingWhitelistManager { public static bool IsMarkingAllowed(MarkingPrototype marking, ICommonSession? session) From f0b05220d9cb0e4f2cea2262a30ebe3a7761044d Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Sat, 4 Jul 2026 02:20:46 +0700 Subject: [PATCH 04/12] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=82=D0=BE=D1=82=D0=B8=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru-RU/_Arcane/markings/humanoid_xeno.ftl | 3 ++ .../Customization/Markings/humanoid_xeno.yml | 38 ++++++++++++++++++ .../HumanoidXeno/head.rsi/meta.json | 8 ++++ .../HumanoidXeno/head.rsi/ren_head.png | Bin 0 -> 1168 bytes .../HumanoidXeno/tail.rsi/meta.json | 8 ++++ .../HumanoidXeno/tail.rsi/ren_tail.png | Bin 0 -> 1250 bytes .../HumanoidXeno/tail.rsi/ren_tail_grad.png | Bin 0 -> 1416 bytes .../HumanoidXeno/tracheas.rsi/meta.json | 4 ++ .../HumanoidXeno/tracheas.rsi/ren_tubes.png | Bin 0 -> 409 bytes 9 files changed, 61 insertions(+) create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/ren_head.png create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/ren_tail.png create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/ren_tail_grad.png create mode 100644 Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/ren_tubes.png diff --git a/Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftl b/Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftl index 792bbf10659..86d7d5fca0a 100644 --- a/Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftl +++ b/Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftl @@ -8,6 +8,7 @@ marking-HumanoidXenoTailRunner = Хвост бегуна marking-HumanoidXenoTailBoiler = Хвост бойлера marking-HumanoidXenoTailCrusher = Хвост крушителя marking-HumanoidXenoTailNeomprph = Хвост неоморфа +marking-HumanoidXenoTailRen = Хвост Рэна marking-HumanoidXenoTailQueenLong = Длинный хвост королевы marking-HumanoidXenoHeadDrone = Голова дрона marking-HumanoidXenoHeadSpitter = Голова плевателя @@ -21,6 +22,7 @@ marking-HumanoidXenoHeadCrusher = Голова крушителя marking-HumanoidXenoHeadCarrier = Голова носителя marking-HumanoidXenoHeadNeomorph = Голова неоморфа marking-HumanoidXenoHeadWorker = Голова рабочего +marking-HumanoidXenoHeadRen = Голова Рэна marking-HumanoidXenoChestPredalien = Грудь предалиена marking-HumanoidXenoChestSpitter = Грудь плевателя marking-HumanoidXenoChestMuscles = "Мышцы" @@ -35,6 +37,7 @@ marking-HumanoidXenoTracheasBoiler = Трахеи бойлера marking-HumanoidXenoTracheasCrusher = Трахеи крушителя marking-HumanoidXenoTracheasNeomorph = Трахеи неоморфа marking-HumanoidXenoTracheasCarrier = Трахеи носителя +marking-HumanoidXenoTracheasRen = Трахеи Рэна marking-HumanoidXenoLegsPredalien = Ноги предалиена marking-HumanoidXenoLegsMuscles = "Мышцы" marking-HumanoidXenoArmsPredalien = Руки предалиена diff --git a/Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml b/Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml index e734ba9a304..f7c61271be0 100644 --- a/Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml +++ b/Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml @@ -117,6 +117,20 @@ - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tail.rsi state: neomorph_tail +- type: marking + id: HumanoidXenoTailRen + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [HumanoidXeno] + sprites: + - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tail.rsi + state: ren_tail + - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tail.rsi + state: ren_tail_grad + whitelist: + allowed: + - Bulbo44key + # Head - type: marking @@ -281,6 +295,18 @@ - sprite: _Arcane/Mobs/Customization/HumanoidXeno/head.rsi state: worker_shine +- type: marking + id: HumanoidXenoHeadRen + bodyPart: Head + markingCategory: Head + speciesRestriction: [HumanoidXeno] + sprites: + - sprite: _Arcane/Mobs/Customization/HumanoidXeno/head.rsi + state: ren_head + whitelist: + allowed: + - Bulbo44key + # Chest - type: marking @@ -411,6 +437,18 @@ - sprite: _Arcane/Mobs/Customization/HumanoidXeno/long_tracheas.rsi state: carrier_tubes +- type: marking + id: HumanoidXenoTracheasRen + bodyPart: Chest + markingCategory: Tracheas + speciesRestriction: [HumanoidXeno] + sprites: + - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi + state: ren_tubes + whitelist: + allowed: + - Bulbo44key + # Legs - type: marking diff --git a/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json index 23fcc137ada..dff1f1fde8d 100644 --- a/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json +++ b/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json @@ -138,6 +138,14 @@ { "name": "worker_teeth", "directions": 4 + }, + { + "name": "worker_teeth", + "directions": 4 + }, + { + "name": "ren_head", + "directions": 4 } ] } diff --git a/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/ren_head.png b/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/ren_head.png new file mode 100644 index 0000000000000000000000000000000000000000..c7dd57d04e798bb313a999d0cb02d1e263707a53 GIT binary patch literal 1168 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 T8ER7p3~L5YS3j3^P6 Date: Sat, 4 Jul 2026 02:55:19 +0700 Subject: [PATCH 05/12] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Mobs/Customization/HumanoidXeno/head.rsi/meta.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json b/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json index dff1f1fde8d..ac84ce667de 100644 --- a/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json +++ b/Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json @@ -139,10 +139,6 @@ "name": "worker_teeth", "directions": 4 }, - { - "name": "worker_teeth", - "directions": 4 - }, { "name": "ren_head", "directions": 4 From ba94aedfc8a52f41e20da64f764f881179d63514 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Sun, 12 Jul 2026 06:20:11 +0700 Subject: [PATCH 06/12] whitelist --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 16 +++++++++++++++- .../Humanoid/SingleMarkingPicker.xaml.cs | 9 ++++++++- .../Preferences/HumanoidCharacterProfile.cs | 15 +++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index 80b4270c3e7..27beb01f02d 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -22,6 +22,10 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; using static Robust.Client.UserInterface.Controls.BoxContainer; +// Arcane - Start +using Content.Shared._Arcane.SpecialWhitelist; +using Robust.Client.Player; +// Arcane - End namespace Content.Client.Humanoid; @@ -31,6 +35,7 @@ public sealed partial class MarkingPicker : Control [Dependency] private readonly MarkingManager _markingManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; // Arcane private readonly SpriteSystem _sprite; @@ -177,6 +182,11 @@ private void SetupCategoryButtons() validCategories.Add(category); CMarkingCategoryButton.AddItem(Loc.GetString($"markings-category-{category.ToString()}"), i); } + // Arcane - Start + var session = _playerManager.LocalSession; // получить текущую клиентскую сессию + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) + continue; // не добавлять в список + // Arcane - End if (validCategories.Contains(_selectedMarkingCategory)) { @@ -190,6 +200,10 @@ private void SetupCategoryButtons() { _selectedMarkingCategory = MarkingCategories.Chest; } + // Arcane - Start + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) + continue; + // Arcane - End } private string GetMarkingName(MarkingPrototype marking) => Loc.GetString($"marking-{marking.ID}"); @@ -561,4 +575,4 @@ private void MarkingRemove() CMarkingColors.Visible = false; OnMarkingRemoved?.Invoke(_currentMarkings); } -} \ No newline at end of file +} diff --git a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs index 6bad2c2c57c..ed5872921ea 100644 --- a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs @@ -13,6 +13,8 @@ using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; +using Content.Shared._Arcane.SpecialWhitelist; +using Robust.Client.Player; namespace Content.Client.Humanoid; @@ -310,4 +312,9 @@ private string GetMarkingName(MarkingPrototype marking) { return Loc.GetString($"marking-{marking.ID}"); } -} \ No newline at end of file + // Arcane - Start + var session = _playerManager.LocalSession; // получить текущую клиентскую сессию + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) + continue; // не добавлять в список + // Arcane - End +} diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 4d825e206da..1197e10edb7 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -69,6 +69,11 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Utility; +// Arcane - Start +using Content.Shared._Arcane.SpecialWhitelist; +using Robust.Shared.Prototypes; +using Robust.Shared.Player; +// Arcane - End namespace Content.Shared.Preferences { @@ -1292,5 +1297,15 @@ public HumanoidCharacterProfile Clone() { return new HumanoidCharacterProfile(this); } + foreach (var markingId in profile.Appearance.Markings.ToList()) + { + // Arcane - Start + if (!_prototypeManager.TryIndex(markingId.MarkingId, out var proto)) + continue; + + if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) + profile.Appearance.Markings.Remove(markingId); // либо reject профиль + } + // Arcane - End } } From c10a07faaab50a099b6ebc4eee5e3e06843ab7d1 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Sun, 12 Jul 2026 06:51:38 +0700 Subject: [PATCH 07/12] =?UTF-8?q?=D0=B5=D1=89=D1=91=20=D0=BF=D0=BE=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B8=D0=BB=20=D0=BA=D0=B0=D0=BA=20=D0=BA?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=B8=D0=BA=20=D1=81=D0=BA=D0=B0=D0=B7=D0=B0?= =?UTF-8?q?=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Humanoid/SingleMarkingPicker.xaml.cs | 10 +++++----- .../Preferences/HumanoidCharacterProfile.cs | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs index ed5872921ea..2a5dd7fae87 100644 --- a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs @@ -212,6 +212,11 @@ public void PopulateList(string filter) item.Selected = true; _ignoreItemSelected = false; } + // Arcane - Start + var session = _playerManager.LocalSession; // получить текущую клиентскую сессию + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) + continue; // не добавлять в список + // Arcane - End } } @@ -312,9 +317,4 @@ private string GetMarkingName(MarkingPrototype marking) { return Loc.GetString($"marking-{marking.ID}"); } - // Arcane - Start - var session = _playerManager.LocalSession; // получить текущую клиентскую сессию - if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) - continue; // не добавлять в список - // Arcane - End } diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 1197e10edb7..c317404c0cd 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -1111,6 +1111,14 @@ public void EnsureValid(ICommonSession session, IDependencyCollection collection { _loadouts.Remove(value); } + // Arcane - Start + if (!_prototypeManager.TryIndex(markingId.MarkingId, out var proto)) + continue; + + if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) + profile.Appearance.Markings.Remove(markingId); // либо reject профиль + } + // Arcane - End } // Art-TTS Start @@ -1299,13 +1307,5 @@ public HumanoidCharacterProfile Clone() } foreach (var markingId in profile.Appearance.Markings.ToList()) { - // Arcane - Start - if (!_prototypeManager.TryIndex(markingId.MarkingId, out var proto)) - continue; - - if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) - profile.Appearance.Markings.Remove(markingId); // либо reject профиль - } - // Arcane - End } } From a2c737b3558c7fe3660cfb39576c19ff001486bb Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Sun, 12 Jul 2026 07:10:22 +0700 Subject: [PATCH 08/12] =?UTF-8?q?=D1=87=D0=B8=D0=BD=D0=B8=D0=BC=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 12 ++++++------ .../Humanoid/SingleMarkingPicker.xaml.cs | 12 +++++++----- .../Preferences/HumanoidCharacterProfile.cs | 14 ++++++++------ 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index 27beb01f02d..eea66873498 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -182,11 +182,6 @@ private void SetupCategoryButtons() validCategories.Add(category); CMarkingCategoryButton.AddItem(Loc.GetString($"markings-category-{category.ToString()}"), i); } - // Arcane - Start - var session = _playerManager.LocalSession; // получить текущую клиентскую сессию - if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) - continue; // не добавлять в список - // Arcane - End if (validCategories.Contains(_selectedMarkingCategory)) { @@ -252,7 +247,12 @@ public void Populate(string filter) { continue; } - + // Arcane - Start + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) + { + continue; + } + // Arcane - End var item = CMarkingsUnused.AddItem($"{GetMarkingName(marking)}", _sprite.Frame0(marking.Sprites[0])); item.Metadata = marking; } diff --git a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs index 2a5dd7fae87..2ed8fe8227f 100644 --- a/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/SingleMarkingPicker.xaml.cs @@ -23,6 +23,7 @@ public sealed partial class SingleMarkingPicker : BoxContainer { [Dependency] private readonly MarkingManager _markingManager = default!; [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; // Arcane private readonly SpriteSystem _sprite; @@ -203,6 +204,12 @@ public void PopulateList(string filter) foreach (var (id, marking) in sortedMarkings) { + // Arcane - Start + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) + { + continue; + } + // Arcane - End var item = MarkingList.AddItem(Loc.GetString($"marking-{id}"), _sprite.Frame0(marking.Sprites[0])); item.Metadata = marking.ID; @@ -212,11 +219,6 @@ public void PopulateList(string filter) item.Selected = true; _ignoreItemSelected = false; } - // Arcane - Start - var session = _playerManager.LocalSession; // получить текущую клиентскую сессию - if (!MarkingWhitelistManager.IsMarkingAllowed(marking, session)) - continue; // не добавлять в список - // Arcane - End } } diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index c317404c0cd..ab691369a44 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -1112,13 +1112,15 @@ public void EnsureValid(ICommonSession session, IDependencyCollection collection _loadouts.Remove(value); } // Arcane - Start - if (!_prototypeManager.TryIndex(markingId.MarkingId, out var proto)) - continue; + foreach (var markingId in Appearance.Markings.ToList()) + { + if (!prototypeManager.TryIndex(markingId.MarkingId, out var proto)) + continue; - if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) - profile.Appearance.Markings.Remove(markingId); // либо reject профиль - } - // Arcane - End + if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) + Appearance.Markings.Remove(markingId); + } +// Arcane - End } // Art-TTS Start From eee81b0d05ad26ccf9a98627110db6329a857506 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Mon, 13 Jul 2026 00:43:48 +0700 Subject: [PATCH 09/12] =?UTF-8?q?=D1=87=D0=B8=D0=BD=D0=B8=D0=BC=20=D0=B4?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D1=88=D0=B5=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 5 +++-- Content.Shared/Preferences/HumanoidCharacterProfile.cs | 4 ---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index eea66873498..b9697a7f1e2 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -248,10 +248,11 @@ public void Populate(string filter) continue; } // Arcane - Start - if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) + else { - continue; + _ selectedMarkingCategory = MarkingCategories.Chest; } + } // Arcane - End var item = CMarkingsUnused.AddItem($"{GetMarkingName(marking)}", _sprite.Frame0(marking.Sprites[0])); item.Metadata = marking; diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index ab691369a44..1a849d7bcc4 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -71,8 +71,6 @@ using Robust.Shared.Utility; // Arcane - Start using Content.Shared._Arcane.SpecialWhitelist; -using Robust.Shared.Prototypes; -using Robust.Shared.Player; // Arcane - End namespace Content.Shared.Preferences @@ -1307,7 +1305,5 @@ public HumanoidCharacterProfile Clone() { return new HumanoidCharacterProfile(this); } - foreach (var markingId in profile.Appearance.Markings.ToList()) - { } } From d64c38c07df81c90e3a28ba2a53162510f0aa150 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Mon, 13 Jul 2026 00:44:58 +0700 Subject: [PATCH 10/12] =?UTF-8?q?=D0=BE=D0=B9=20=D0=BE=D1=82=D1=81=D1=82?= =?UTF-8?q?=D1=83=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index b9697a7f1e2..be23b533b37 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -197,8 +197,8 @@ private void SetupCategoryButtons() } // Arcane - Start if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) - continue; - // Arcane - End + continue; + // Arcane - End } private string GetMarkingName(MarkingPrototype marking) => Loc.GetString($"marking-{marking.ID}"); From 66e57c8bcdefa1d5ebd6af62fb56030fafe03775 Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Mon, 13 Jul 2026 01:10:53 +0700 Subject: [PATCH 11/12] =?UTF-8?q?=D1=87=D0=B8=D0=BD=D1=8E=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BA=D1=80=D0=BE=D0=BB=D0=B8=D0=BA=D1=83=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D1=88=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 11 +++++------ .../Preferences/HumanoidCharacterProfile.cs | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index be23b533b37..94b93b97ca1 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -247,15 +247,14 @@ public void Populate(string filter) { continue; } + // Arcane - Start - else - { - _ selectedMarkingCategory = MarkingCategories.Chest; - } - } + if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) + continue; // Arcane - End + var item = CMarkingsUnused.AddItem($"{GetMarkingName(marking)}", _sprite.Frame0(marking.Sprites[0])); - item.Metadata = marking; + item.Metadata = marking; } CMarkingPoints.Visible = _currentMarkings.PointsLeft(_selectedMarkingCategory) != -1; diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 1a849d7bcc4..e0e0bacf386 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -1118,7 +1118,7 @@ public void EnsureValid(ICommonSession session, IDependencyCollection collection if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session)) Appearance.Markings.Remove(markingId); } -// Arcane - End + // Arcane - End } // Art-TTS Start From f5e7b3eee9ffb49e23b3769fc0d4cc10043e8d7c Mon Sep 17 00:00:00 2001 From: bzzzbzzbz Date: Mon, 13 Jul 2026 02:01:03 +0700 Subject: [PATCH 12/12] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BA=D1=80=D0=BE=D0=BB=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Content.Client/Humanoid/MarkingPicker.xaml.cs | 4 ---- Content.Shared/Preferences/HumanoidCharacterProfile.cs | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Content.Client/Humanoid/MarkingPicker.xaml.cs b/Content.Client/Humanoid/MarkingPicker.xaml.cs index 94b93b97ca1..6dd9d3d9e92 100644 --- a/Content.Client/Humanoid/MarkingPicker.xaml.cs +++ b/Content.Client/Humanoid/MarkingPicker.xaml.cs @@ -195,10 +195,6 @@ private void SetupCategoryButtons() { _selectedMarkingCategory = MarkingCategories.Chest; } - // Arcane - Start - if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession)) - continue; - // Arcane - End } private string GetMarkingName(MarkingPrototype marking) => Loc.GetString($"marking-{marking.ID}"); diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index e0e0bacf386..4e05dedbd62 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -70,6 +70,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Utility; // Arcane - Start +using Content.Shared.Humanoid.Markings; using Content.Shared._Arcane.SpecialWhitelist; // Arcane - End