Skip to content
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

Open
wants to merge 18 commits into
base: master
Choose a base branch
from

Conversation

CatBackGround
Copy link
Contributor

@CatBackGround CatBackGround commented Nov 17, 2024

Описание PR

PR, добавляющий систему блокировок дальнобойного и ближнего оружия.
Адаптация под Backmen.
Блокировка работает на считывании и сравнении данных AccessComponent ID/КПК с заранее записанными.

Будет распространяться на:

  • Антикварный лазерный пистолет.
  • Энергетический дробовик.

Медиа

Не требуется на данный момент.

Тип PR

  • Feature
  • Fix
  • Tweak
  • Balance
  • Refactor
  • Port
  • Translate
  • Resprite

Изменения

🆑 CatBG

  • add: Добавлена система блокировки оружия.

Summary by CodeRabbit

  • Новые функции

    • Добавлен компонент AccessWeaponBlockerComponent, управляющий доступом к оружию на основе уровней доступа.
    • Внедрена система AccessWeaponBlockerSystem, которая обрабатывает попытки использования оружия и уведомляет игроков о недостаточном доступе.
  • Исправления ошибок

    • Устранены проблемы с уведомлениями при попытках использования оружия без необходимого доступа.

@CatBackGround CatBackGround changed the title AccessWeaponBlocker [FEATURE]AccessWeaponBlocker Nov 18, 2024
@CatBackGround CatBackGround changed the title [FEATURE]AccessWeaponBlocker [FEATURE] [TWEAK] AccessWeaponBlocker Nov 18, 2024
@CatBackGround CatBackGround changed the title [FEATURE] [TWEAK] AccessWeaponBlocker [DON'T MERGE][FEATURE] [TWEAK] AccessWeaponBlocker Nov 18, 2024
@CatBackGround CatBackGround changed the title [DON'T MERGE][FEATURE] [TWEAK] AccessWeaponBlocker [DON'T MERGE][FEATURE][TWEAK] AccessWeaponBlocker Nov 18, 2024
@CatBackGround CatBackGround marked this pull request as ready for review November 18, 2024 08:31
@CatBackGround CatBackGround requested a review from Rxup as a code owner November 18, 2024 08:31
@CatBackGround CatBackGround changed the title [DON'T MERGE][FEATURE][TWEAK] AccessWeaponBlocker [FEATURE][TWEAK] AccessWeaponBlocker Nov 18, 2024
@CatBackGround
Copy link
Contributor Author

Ёбаный в рот, его вообще лучше не трогать лишний раз..

@CatBackGround
Copy link
Contributor Author

@Rxup @nomad0260

@CrimeMoot
Copy link
Contributor

А как работает вообще. Не ясно. Не демонстрации ничего...

@CatBackGround
Copy link
Contributor Author

CatBackGround commented Nov 19, 2024

А как работает вообще. Не ясно. Не демонстрации ничего...

Принцип работы:
Человек берёт оружие под блокировкой, оружие(компонент) считывает доступы с КПК/ID.
Если всё сходится - оружие разблокировано.

@CatBackGround
Copy link
Contributor Author

CatBackGround commented Nov 19, 2024

А если серьёзно, то скоро запишу видео-демонстрацию.
UPD:
Не запишу блять, хирургия сломала локалку...

@nomad0260
Copy link
Collaborator

В общем, ждем демонстрацию

@Rxup Rxup requested review from nomad0260 and removed request for Rxup November 20, 2024 01:59
@CatBackGround
Copy link
Contributor Author

В общем, ждем демонстрацию

Ждать будете долго...

@Rxup
Copy link
Owner

Rxup commented Nov 23, 2024

@CatBackGround это для админ абуза или будут какие-то с оружия с ним? типа табельного?

@CatBackGround
Copy link
Contributor Author

CatBackGround commented Nov 24, 2024

@CatBackGround это для админ абуза или будут какие-то с оружия с ним? типа табельного?

Доброго. Это система НЕ для админ арбуза, по крайней мере просто так её в игре не подключить к оружию(добавлением компонента), нужно прототипом грузить.
Оружия, которые ТОЧНО будут с ней:
Антикварный лазерный пистолет Капитана.
Энергетический дробовик ГСБ.

Copy link
Contributor

coderabbitai bot commented Nov 24, 2024

Walkthrough

В данном пулл-реквесте добавлены два новых файла, которые реализуют систему контроля доступа к оружию в сетевой игре. AccessWeaponBlockerComponent управляет доступом к оружию с помощью трех свойств: CanUse, AlertText и Access. Класс AccessWeaponBlockerSystem обрабатывает события, связанные с использованием оружия, проверяя доступ через AccessWeaponBlockerComponent и отменяя действия при недостаточном доступе.

Changes

Файл Изменения
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerComponent.cs Добавлен класс AccessWeaponBlockerComponent с свойствами CanUse, AlertText, Access.
Content.Shared/Backmen/AccessWeaponBlockerSystem/AccessWeaponBlockerSystem.cs Добавлен класс AccessWeaponBlockerSystem, который управляет событиями использования оружия.

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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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. Рекомендуется:

  1. Сделать коллекцию неизменяемой после инициализации
  2. Добавить валидацию входящих данных
  3. Рассмотреть использование более строгого типа вместо 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

📥 Commits

Reviewing files that changed from the base of the PR and between 120f7e8 and 19993d3.

📒 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: Рекомендации по архитектуре системы блокировки оружия

  1. Рассмотрите создание интерфейса IBlockableWeapon для стандартизации взаимодействия с различными типами оружия
  2. Добавьте фабрику для создания прототипов блокировки оружия
  3. Реализуйте систему кэширования проверок доступа для оптимизации производительности
  4. Добавьте события для логирования попыток доступа к заблокированному оружию
✅ Verification successful

Архитектура системы блокировки оружия реализована корректно и соответствует лучшим практикам

Анализ кода показывает, что:

  1. Система использует существующую инфраструктуру проверки доступа через AccessComponent
  2. Корректно интегрируется с системами стрельбы через события AttemptShootEvent и AttemptMeleeEvent
  3. Имеет правильную сетевую синхронизацию состояния через NetworkedComponent
  4. Поддерживает гибкую настройку прав доступа через теги

Дополнительные интерфейсы или фабрики не требуются, так как текущая реализация:

  • Уже обеспечивает расширяемость через систему тегов доступа
  • Интегрирована с существующими системами оружия
  • Использует стандартные паттерны событий для блокировки действий
🏁 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 (антикварный лазерный пистолет и энергетический дробовик).

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between 19993d3 and 85bfd8e.

📒 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: Дополните базовый компонент необходимой функциональностью

Базовый компонент требует доработки:

  1. Отсутствует XML-документация
  2. Нет общих свойств и методов, необходимых для работы системы блокировки оружия

Рекомендуется обратиться к предыдущему комментарию с предложенными улучшениями для этого класса.


12-17: ⚠️ Potential issue

Улучшите безопасность и надёжность класса состояния

Текущая реализация класса состояния имеет несколько проблем:

  1. Использование публичных полей вместо свойств нарушает инкапсуляцию
  2. Отсутствует защита от null-значений
  3. Нет валидации входных данных

Рекомендуется обратиться к предыдущему комментарию с предложенными улучшениями для этого класса. Дополнительно предлагается добавить валидацию:

 [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;;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Исправьте синтаксическую ошибку в объявлении пространства имен

В строке с объявлением пространства имен присутствует двойная точка с запятой, что является синтаксической ошибкой.

-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.

Suggested change
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

@nomad0260
Copy link
Collaborator

Сегодня как домой приду протестю, если никаких ошибок не буду, мерджну

@CatBackGround
Copy link
Contributor Author

Сегодня как домой приду протестю, если никаких ошибок не буду, мерджну

Готовь прототип. Добавлением компонента к оружию ingame не даст результата.

@nomad0260
Copy link
Collaborator

если что, ошибка не связана с этим пром

Copy link
Collaborator

@nomad0260 nomad0260 left a 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 при многокрадной попытке использования

Screenshot_1890

в прототипе тоже проверил, текст который я описал там присутсвует

Screenshot_1891

@CatBackGround
Copy link
Contributor Author

@nomad0260 @Rxup

@Rxup
Copy link
Owner

Rxup commented Dec 7, 2024

@CatBackGround @nomad0260 вычистил гавно из пра - тестируйте

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

📥 Commits

Reviewing files that changed from the base of the PR and between 6c93971 and 7e8c070.

📒 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.

Comment on lines +10 to +11
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField]
public bool CanUse;
Copy link
Contributor

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.

Suggested change
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField]
public bool CanUse;
/// <summary>
/// Определяет, может ли оружие быть использовано в данный момент.
/// </summary>
[ViewVariables(VVAccess.ReadWrite),AutoNetworkedField]
public bool CanUse = false;

Comment on lines +17 to +20
[ViewVariables(VVAccess.ReadWrite),
DataField("access")]
public HashSet<ProtoId<AccessLevelPrototype>> Access = new();
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Добавьте валидацию для множества 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.

Comment on lines +61 to +65
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;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Потенциальная ошибка при доступе к 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.

Suggested change
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;

@CatBackGround
Copy link
Contributor Author

@CatBackGround @nomad0260 вычистил гавно из пра - тестируйте

ЯО тест сломал чек, увы.

@KayzelW
Copy link
Collaborator

KayzelW commented Dec 13, 2024

сделай чтобы работало от компонента AccessReader, а не от своего хранилища доступов.

@CatBackGround
Copy link
Contributor Author

сделай чтобы работало от компонента AccessReader, а не от своего хранилища доступов.

Я уже не буду переписывать рабочий код.

@CrimeMoot
Copy link
Contributor

CrimeMoot commented Dec 20, 2024

Я кстати ХЗ. Я Аунтификацию для оружие и брони использую вот:
DNK/ID для брони (работает ток по сущности id) - fospas#534
Для оружие (работает ток на пушки xd) - fospas#588
Хз как тут реализуемо.

@CatBackGround
Copy link
Contributor Author

CatBackGround commented Dec 25, 2024

Я кстати ХЗ. Я Аунтификацию для оружие и брони использую вот:
DNK/ID для брони (работает ток по сущности id) - fospas#534
Для оружие (работает ток на пушки xd) - fospas#588
Хз как тут реализуемо.

Тут мы сравниваем наличие доступа с ID-карты/КПК. А твои ПР нацелены на сравнение данных ДНК для скафандров и оружия.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants