-
Notifications
You must be signed in to change notification settings - Fork 149
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[FEATURE][TWEAK] AccessWeaponBlocker #920
base: master
Are you sure you want to change the base?
Conversation
Ёбаный в рот, его вообще лучше не трогать лишний раз.. |
А как работает вообще. Не ясно. Не демонстрации ничего... |
Принцип работы: |
А если серьёзно, то скоро запишу видео-демонстрацию. |
В общем, ждем демонстрацию |
Ждать будете долго... |
@CatBackGround это для админ абуза или будут какие-то с оружия с ним? типа табельного? |
Доброго. Это система НЕ для админ арбуза, по крайней мере просто так её в игре не подключить к оружию(добавлением компонента), нужно прототипом грузить. |
WalkthroughВ данном пулл-реквесте добавлены два новых файла, которые реализуют систему контроля доступа к оружию в сетевой игре. Changes
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 7
🧹 Outside diff range and nitpick comments (8)
Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (2)
5-7
: Добавьте XML-документацию для публичного классаРекомендуется добавить XML-документацию для улучшения читаемости и поддержки IntelliSense.
[RegisterComponent] +/// <summary> +/// Клиентский компонент для управления блокировкой оружия на основе прав доступа. +/// </summary> public sealed partial class AccessWeaponBlockerComponent : SharedAccessWeaponBlockerComponent
8-13
: Рекомендуется добавить валидацию для AlertTextТекст оповещения может потребовать проверки на null или максимальную длину. Также рекомендуется добавить XML-документацию для публичных свойств.
[ViewVariables(VVAccess.ReadWrite)] + /// <summary> + /// Определяет, может ли оружие быть использовано. + /// </summary> public bool CanUse; [ViewVariables(VVAccess.ReadWrite)] + /// <summary> + /// Текст, отображаемый при попытке использования заблокированного оружия. + /// </summary> - public string AlertText = ""; + public string AlertText { get; set; } = string.Empty;Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (3)
7-9
: Рекомендуется добавить документацию к компонентуКомпонент играет важную роль в системе контроля доступа к оружию, поэтому следует добавить XML-документацию с описанием его назначения и принципов работы.
Предлагаемые изменения:
[RegisterComponent] +/// <summary> +/// Компонент для управления доступом к оружию на основе прав доступа игрока. +/// Используется совместно с системой AccessWeaponBlockerSystem. +/// </summary> public sealed partial class AccessWeaponBlockerComponent : SharedAccessWeaponBlockerComponent
13-15
: Рассмотрите использование локализации для AlertTextТекст оповещения следует локализовать для поддержки многоязычности.
Предлагаемые изменения:
[ViewVariables(VVAccess.ReadWrite)] -[DataField("alertText")] +[DataField("alertText", required: true)] -public string AlertText = ""; +[AutoNetworkedField] +public string AlertText = "access-weapon-blocker-default-message";
17-19
: Проверьте безопасность хранения прав доступаТекущая реализация хранит права доступа в HashSet. Рекомендуется:
- Сделать коллекцию неизменяемой после инициализации
- Добавить валидацию входящих данных
- Рассмотреть использование более строгого типа вместо string
Предлагаемые изменения:
[ViewVariables(VVAccess.ReadWrite), DataField("access", customTypeSerializer: typeof(PrototypeIdHashSetSerializer<AccessLevelPrototype>))] -public HashSet<string> Access = new(); +private HashSet<string> _access = new(); +public IReadOnlySet<string> Access => _access;Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs (3)
9-20
: Добавьте документацию к классуРекомендуется добавить XML-документацию, описывающую назначение системы и её взаимодействие с другими компонентами.
Пример:
+/// <summary> +/// Клиентская система, обрабатывающая блокировку оружия на основе прав доступа. +/// Работает совместно с серверным компонентом AccessWeaponBlockerComponent. +/// </summary> public sealed class AccessWeaponBlockerSystem : EntitySystem
38-45
: Добавьте проверку на null для AlertTextПри обработке состояния компонента следует проверять AlertText на null во избежание потенциальных ошибок.
private void OnAccessWeaponBlockerHandleState(EntityUid uid, AccessWeaponBlockerComponent component, ref ComponentHandleState args) { if (args.Current is not AccessWeaponBlockerComponentState state) return; component.CanUse = state.CanUse; - component.AlertText = state.AlertText; + component.AlertText = state.AlertText ?? "Access denied"; }
22-36
: Добавьте логирование отказов в доступеДля целей отладки и мониторинга рекомендуется добавить логирование случаев отказа в доступе к оружию.
+using Robust.Shared.Log; + private void OnUseAttempt(EntityUid uid, AccessWeaponBlockerComponent component, ref UseAttemptEvent args) { if (component.CanUse) return; + Logger.Debug($"Weapon access denied for entity {uid}"); args.Cancel(); } private void OnInteractAttempt(EntityUid uid, AccessWeaponBlockerComponent component, ref InteractionAttemptEvent args) { if (component.CanUse) return; + Logger.Debug($"Weapon interaction denied for entity {uid}"); args.Cancelled = true; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (6)
Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
(1 hunks)Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
(1 hunks)Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
(1 hunks)Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
(1 hunks)Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
(1 hunks)Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedFactionWeaponBlockerSystem.cs
(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedFactionWeaponBlockerSystem.cs
🔇 Additional comments (9)
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs (3)
48-55
: Убедитесь в корректности передачи состояния компонента
Метод OnGetState
передает состояние компонента клиенту. Проверьте, что все необходимые поля состояния включены, и что состояние синхронизируется корректно.
57-64
: Проверка условий в методе OnMeleeAttempt
Логика метода OnMeleeAttempt
корректна: если оружие не может быть использовано (!component.CanUse
), то событие отменяется, и выводится сообщение. Убедитесь, что AlertText
содержит информативное сообщение для пользователя.
66-73
: Проверка условий в методе OnShootAttempt
Метод OnShootAttempt
работает аналогично предыдущему и корректно обрабатывает попытку стрельбы, когда доступ запрещен.
Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (1)
1-13
: Реализация выглядит корректной
Компонент правильно наследуется от SharedAccessWeaponBlockerComponent и следует архитектурному паттерну клиент-сервер. Регистрация компонента и доступ к свойствам реализованы корректно.
✅ Verification successful
Let me generate additional scripts to verify the shared component and system implementation.
Let me check the shared component implementation to verify the inheritance.
Компонент реализован корректно
Проверка подтвердила, что клиентский компонент AccessWeaponBlockerComponent
правильно наследуется от SharedAccessWeaponBlockerComponent
. Базовый компонент имеет необходимую сетевую разметку [NetworkedComponent]
и корректно определяет состояние компонента через AccessWeaponBlockerComponentState
. Поля CanUse
и AlertText
в клиентском компоненте соответствуют полям в состоянии компонента.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверяем наличие базового класса SharedAccessWeaponBlockerComponent
ast-grep --pattern 'class SharedAccessWeaponBlockerComponent'
# Проверяем использование компонента в системе
rg -A 5 "AccessWeaponBlockerComponent"
Length of output: 100285
Script:
#!/bin/bash
# Check for the shared component implementation
rg -l "SharedAccessWeaponBlockerComponent"
# Check for any related systems or usages
rg -A 5 "SharedAccessWeaponBlockerSystem"
Length of output: 333
Script:
#!/bin/bash
# Check the shared component implementation
cat Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
Length of output: 487
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs (1)
1-17
: Рекомендации по архитектуре системы блокировки оружия
- Рассмотрите создание интерфейса
IBlockableWeapon
для стандартизации взаимодействия с различными типами оружия - Добавьте фабрику для создания прототипов блокировки оружия
- Реализуйте систему кэширования проверок доступа для оптимизации производительности
- Добавьте события для логирования попыток доступа к заблокированному оружию
✅ Verification successful
Архитектура системы блокировки оружия реализована корректно и соответствует лучшим практикам
Анализ кода показывает, что:
- Система использует существующую инфраструктуру проверки доступа через AccessComponent
- Корректно интегрируется с системами стрельбы через события AttemptShootEvent и AttemptMeleeEvent
- Имеет правильную сетевую синхронизацию состояния через NetworkedComponent
- Поддерживает гибкую настройку прав доступа через теги
Дополнительные интерфейсы или фабрики не требуются, так как текущая реализация:
- Уже обеспечивает расширяемость через систему тегов доступа
- Интегрирована с существующими системами оружия
- Использует стандартные паттерны событий для блокировки действий
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка существующих прототипов оружия
rg -l "antique.*laser.*pistol|energy.*shotgun" --type yaml
Length of output: 224
Script:
#!/bin/bash
# Проверяем содержимое файлов прототипов оружия для анализа структуры
cat Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml
# Ищем существующие системы для работы с оружием
ast-grep --pattern 'public sealed class $_ : EntitySystem
{
$$$
}'
# Проверяем интеграцию с системой доступа
rg -l "AccessComponent" --type cs
Length of output: 110331
Script:
#!/bin/bash
# Проверяем интеграцию с системой доступа
rg -A 5 "AccessComponent" --type cs
# Ищем существующие системы для работы с оружием
rg -A 5 "Gun|Weapon" "Content.Shared/Weapons" --type cs
# Проверяем использование событий для оружия
rg -A 5 "AttemptShoot|AttemptMelee" --type cs
Length of output: 110536
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (2)
1-4
: Проверьте необходимость всех импортов
Импорты выглядят корректно для текущей реализации. Использование TypeSerializers для сериализации прототипов доступа является правильным подходом.
1-20
: Проверьте интеграцию с существующей системой безопасности
Необходимо убедиться, что компонент корректно интегрируется с существующей системой контроля доступа и не создает уязвимостей.
✅ Verification successful
Let me gather more information about the access weapon blocker system implementation.
Based on the analysis of the code, I can now provide a final response regarding the security integration.
Компонент корректно интегрирован с системой безопасности
Проверка показала, что:
- Компонент использует стандартный
AccessLevelPrototype
для определения уровней доступа - Проверка доступа реализована через существующий механизм
AccessComponent
, аналогично другим системам - Реализация
IsAnyAccess
соответствует общепринятым практикам проверки доступа в кодовой базе
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск связанных компонентов безопасности
rg -l "AccessLevelPrototype|IAccessReader|AccessComponent" --type cs
# Поиск существующих проверок доступа
ast-grep --pattern 'HasAccessLevel($$$)'
Length of output: 2271
Script:
#!/bin/bash
# Check the AccessWeaponBlockerSystem implementation
cat Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
# Look for usage of AccessReaderSystem
rg -A 5 "AccessReaderSystem" --type cs
# Check how access checks are implemented in similar systems
ast-grep --pattern 'TryComp<AccessReaderComponent>($$$)'
Length of output: 40265
Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs (2)
1-8
: Корректная организация импортов и пространства имён!
Все необходимые зависимости присутствуют, и структура пространства имён соответствует архитектуре проекта.
1-64
: Проверьте интеграцию с указанным оружием
Необходимо убедиться, что система корректно работает с конкретными видами оружия, упомянутыми в целях PR (антикварный лазерный пистолет и энергетический дробовик).
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
Outdated
Show resolved
Hide resolved
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
Outdated
Show resolved
Hide resolved
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
Outdated
Show resolved
Hide resolved
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
Outdated
Show resolved
Hide resolved
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
Outdated
Show resolved
Hide resolved
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
Outdated
Show resolved
Hide resolved
Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (2)
Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
(1 hunks)Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
🧰 Additional context used
🪛 GitHub Check: build (ubuntu-latest)
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
🪛 GitHub Check: YAML Linter
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
🪛 GitHub Check: Test Packaging
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
🔇 Additional comments (3)
Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs (3)
6-10
: Дополните базовый компонент необходимой функциональностью
Базовый компонент требует доработки:
- Отсутствует XML-документация
- Нет общих свойств и методов, необходимых для работы системы блокировки оружия
Рекомендуется обратиться к предыдущему комментарию с предложенными улучшениями для этого класса.
12-17
:
Улучшите безопасность и надёжность класса состояния
Текущая реализация класса состояния имеет несколько проблем:
- Использование публичных полей вместо свойств нарушает инкапсуляцию
- Отсутствует защита от null-значений
- Нет валидации входных данных
Рекомендуется обратиться к предыдущему комментарию с предложенными улучшениями для этого класса. Дополнительно предлагается добавить валидацию:
[Serializable, NetSerializable]
public sealed class AccessWeaponBlockerComponentState : ComponentState
{
- public bool CanUse;
- public string AlertText = "";
+ public bool CanUse { get; }
+ public string AlertText { get; }
+
+ public AccessWeaponBlockerComponentState(bool canUse, string alertText)
+ {
+ CanUse = canUse;
+ if (string.IsNullOrWhiteSpace(alertText))
+ {
+ throw new ArgumentException("AlertText не может быть пустым", nameof(alertText));
+ }
+ AlertText = alertText;
+ }
}
6-6
: Проверьте регистрацию сетевого компонента
Убедитесь, что компонент правильно зарегистрирован в системе для сетевой синхронизации.
✅ Verification successful
Компонент корректно зарегистрирован и настроен
Проверка показала, что:
- Компонент правильно помечен как
[NetworkedComponent]
- Системы на сервере и клиенте корректно зарегистрированы и обрабатывают сетевые события
- Реализована правильная иерархия наследования от
SharedAccessWeaponBlockerComponent
- Настроена корректная сериализация состояния компонента через
ComponentState
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверяем регистрацию компонента в системе
ast-grep --pattern 'IoCManager.Register<$_>($$$)' | grep -i 'AccessWeaponBlocker'
# Проверяем использование компонента в других файлах
rg "AccessWeaponBlockerComponent" -l
Length of output: 523
Script:
#!/bin/bash
# Проверяем регистрацию компонента в системах
ast-grep --pattern 'class AccessWeaponBlockerSystem : EntitySystem {
$$$
}'
# Проверяем инициализацию в системах
ast-grep --pattern 'public override void Initialize() {
$$$
RequireComponent<$_>($$$);
$$$
}'
# Проверяем наличие атрибутов регистрации систем
rg "^\[RegisterSystem\]" -A 2 Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
Length of output: 369
Script:
#!/bin/bash
# Проверяем содержимое файлов системы
cat Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
cat Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
# Проверяем содержимое компонентов
cat Content.Server/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
cat Content.Client/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
cat Content.Shared/Backmen/AccessWeaponBlockerSystem/SharedAccessWeaponBlockerComponent.cs
Length of output: 6717
using Robust.Shared.GameStates; | ||
using Robust.Shared.Serialization; | ||
|
||
namespace Content.Shared.Backmen.AccessWeaponBlockerSystem;; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправьте синтаксическую ошибку в объявлении пространства имен
В строке с объявлением пространства имен присутствует двойная точка с запятой, что является синтаксической ошибкой.
-namespace Content.Shared.Backmen.AccessWeaponBlockerSystem;;
+namespace Content.Shared.Backmen.AccessWeaponBlockerSystem;
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
namespace Content.Shared.Backmen.AccessWeaponBlockerSystem;; | |
namespace Content.Shared.Backmen.AccessWeaponBlockerSystem; |
🧰 Tools
🪛 GitHub Check: build (ubuntu-latest)
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
🪛 GitHub Check: YAML Linter
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
🪛 GitHub Check: Test Packaging
[failure] 4-4:
Type or namespace definition, or end-of-file expected
[failure] 4-4:
Type or namespace definition, or end-of-file expected
Сегодня как домой приду протестю, если никаких ошибок не буду, мерджну |
Готовь прототип. Добавлением компонента к оружию ingame не даст результата. |
если что, ошибка не связана с этим пром |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
алерт текст не работает корректно
добавил в прототип
- type: AccessWeaponBlocker
access:
- MTF
alertText: "У вас недостаточный уровень доступа"
текста при попытке использовать без доступа нету, но сам поп ап есть, ибо появляется счетчик x2 при многокрадной попытке использования
в прототипе тоже проверил, текст который я описал там присутсвует
@CatBackGround @nomad0260 вычистил гавно из пра - тестируйте |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🧹 Outside diff range and nitpick comments (4)
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (3)
1-6
: Проверьте область видимости импортовИмпорты и пространство имен выглядят корректно, но рекомендуется добавить комментарий, описывающий назначение компонента для улучшения документации.
using Content.Shared.Access; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; +/// <summary> +/// Компонент для управления доступом к оружию на основе уровней доступа. +/// </summary> namespace Content.Shared.Backmen.AccessWeaponBlockerSystem;
7-9
: Рассмотрите добавление интерфейса ISerializationHooksКомпонент правильно аннотирован для работы в сети, но рекомендуется реализовать
ISerializationHooks
для валидации данных при десериализации.[RegisterComponent,NetworkedComponent,AutoGenerateComponentState] -public sealed partial class AccessWeaponBlockerComponent : Component +public sealed partial class AccessWeaponBlockerComponent : Component, ISerializationHooks { + void ISerializationHooks.AfterDeserialization() + { + // Валидация Access и других полей + }
1-20
: Рассмотрите добавление событий для изменения состоянияРекомендуется добавить события для отслеживания изменений состояния доступа к оружию.
public sealed partial class AccessWeaponBlockerComponent : Component { + /// <summary> + /// Вызывается при изменении состояния доступа к оружию. + /// </summary> + public event Action<bool>? OnAccessStateChanged; + // ... существующий код ... + + private void RaiseAccessStateChanged(bool newState) + { + OnAccessStateChanged?.Invoke(newState); + } }Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs (1)
70-80
: Оптимизация методаIsAnyAccess
с помощью LINQ.Для улучшения читаемости и производительности можно использовать LINQ-запрос вместо цикла
foreach
.Предлагаемое изменение:
private bool IsAnyAccess(EntityUid accessEntity, AccessWeaponBlockerComponent component) { if (!TryComp<AccessComponent>(accessEntity, out var access)) return false; - foreach (var accessTag in access.Tags) - { - if (component.Access.Contains(accessTag)) - return true; - } - return false; + return access.Tags.Any(tag => component.Access.Contains(tag)); }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (2)
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs
(1 hunks)Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs
(1 hunks)
🔇 Additional comments (7)
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs (1)
13-15
: Проверьте локализацию AlertText
Убедитесь, что все возможные значения AlertText
имеют соответствующие переводы в системе локализации.
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs (6)
13-13
: Проверьте корректность внедрения зависимости InventorySystem
.
Убедитесь, что InventorySystem
правильно инициализируется через атрибут [Dependency]
и доступен к моменту использования.
18-23
: Подписки на события корректны и соответствуют функционалу.
Подписка на события в методе Initialize
соответствует ожидаемому поведению системы.
25-31
: Проверка доступа в методе OnUseAttempt
.
Отмена действия при отсутствии доступа реализована правильно с помощью args.Cancel()
.
41-48
: Сообщение пользователю при блокировке ближнего боя.
Установка args.Message = component.AlertText
информирует пользователя о причине блокировки, что улучшает опыт взаимодействия.
50-57
: Сообщение пользователю при блокировке стрельбы.
Аналогично предыдущему методу, пользователь получает понятное сообщение при попытке стрельбы без доступа.
66-67
: Отметка компонента как измененного после обновления CanUse
.
Вызов Dirty(uid, component)
необходим для синхронизации состояния компонента после изменения CanUse
.
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField] | ||
public bool CanUse; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Добавьте документацию и значение по умолчанию для CanUse
Свойство CanUse
требует документации и явного значения по умолчанию для улучшения читаемости и предсказуемости поведения.
+ /// <summary>
+ /// Определяет, может ли оружие быть использовано в данный момент.
+ /// </summary>
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField]
- public bool CanUse;
+ public bool CanUse = false;
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField] | |
public bool CanUse; | |
/// <summary> | |
/// Определяет, может ли оружие быть использовано в данный момент. | |
/// </summary> | |
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField] | |
public bool CanUse = false; |
[ViewVariables(VVAccess.ReadWrite), | ||
DataField("access")] | ||
public HashSet<ProtoId<AccessLevelPrototype>> Access = new(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавьте валидацию для множества Access
Необходимо добавить проверку на null и валидацию прототипов доступа при их добавлении в множество.
[ViewVariables(VVAccess.ReadWrite),
DataField("access")]
- public HashSet<ProtoId<AccessLevelPrototype>> Access = new();
+ private HashSet<ProtoId<AccessLevelPrototype>> _access = new();
+
+ /// <summary>
+ /// Множество уровней доступа, необходимых для использования оружия.
+ /// </summary>
+ public HashSet<ProtoId<AccessLevelPrototype>> Access
+ {
+ get => _access;
+ set => _access = value ?? new();
+ }
Committable suggestion skipped: line range outside the PR's diff.
if (!_inventorySystem.TryGetSlotEntity(args.User, "id", out var slotCardUid)) | ||
return; | ||
var accessEntity = TryComp<PdaComponent>(slotCardUid, out var pda) && pda.ContainedId is { } pdaSlot | ||
? pdaSlot | ||
: slotCardUid.Value; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Потенциальная ошибка при доступе к slotCardUid.Value
.
Если slotCardUid
не имеет значения, попытка доступа к slotCardUid.Value
может вызвать исключение. Рекомендуется добавить проверку на наличие значения перед использованием.
Примените следующий дифф для исправления:
var accessEntity = TryComp<PdaComponent>(slotCardUid, out var pda) && pda.ContainedId is { } pdaSlot
? pdaSlot
- : slotCardUid.Value;
+ : slotCardUid.HasValue ? slotCardUid.Value : EntityUid.Invalid;
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
if (!_inventorySystem.TryGetSlotEntity(args.User, "id", out var slotCardUid)) | |
return; | |
var accessEntity = TryComp<PdaComponent>(slotCardUid, out var pda) && pda.ContainedId is { } pdaSlot | |
? pdaSlot | |
: slotCardUid.Value; | |
if (!_inventorySystem.TryGetSlotEntity(args.User, "id", out var slotCardUid)) | |
return; | |
var accessEntity = TryComp<PdaComponent>(slotCardUid, out var pda) && pda.ContainedId is { } pdaSlot | |
? pdaSlot | |
: slotCardUid.HasValue ? slotCardUid.Value : EntityUid.Invalid; |
ЯО тест сломал чек, увы. |
сделай чтобы работало от компонента AccessReader, а не от своего хранилища доступов. |
Я уже не буду переписывать рабочий код. |
Я кстати ХЗ. Я Аунтификацию для оружие и брони использую вот: |
Тут мы сравниваем наличие доступа с ID-карты/КПК. А твои ПР нацелены на сравнение данных ДНК для скафандров и оружия. |
Описание PR
PR, добавляющий систему блокировок дальнобойного и ближнего оружия.
Адаптация под Backmen.
Блокировка работает на считывании и сравнении данных AccessComponent ID/КПК с заранее записанными.
Будет распространяться на:
Медиа
Не требуется на данный момент.
Тип PR
Изменения
🆑 CatBG
Summary by CodeRabbit
Новые функции
AccessWeaponBlockerComponent
, управляющий доступом к оружию на основе уровней доступа.AccessWeaponBlockerSystem
, которая обрабатывает попытки использования оружия и уведомляет игроков о недостаточном доступе.Исправления ошибок