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

[педальные раздатчики] настолько заебался что даже шутить уже не хочется #159

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

Conversation

RedFoxIV
Copy link
Contributor

Описание PR

Универсальные раздатчики для выдачи предметов игрокам на ивентах.
Для каждого игрока - отдельный подсчёт выданных предметов, помогая обеспечить всех необходимым снаряжением.

Медиа

Список

cunt.webm

гифкой почему-то не грузится

image

Тултипы на галочках и текстовых полях более подробно объясняют, какая опция за что отвечает.


Не предназначены для использования вне ивентов, поэтому ченджлог оставляю пустым.

Copy link
Contributor

coderabbitai bot commented Dec 13, 2024

Walkthrough

В данном пулл-реквесте добавлены несколько новых классов и компонентов, связанных с системой раздачи предметов в игре. Включены пользовательский интерфейс для настройки раздатчика, системы управления визуализацией, а также компоненты для управления логикой раздачи предметов. Также добавлены новые строки локализации на русском языке, новые сущности для раздатчиков и шейдеры для визуальных эффектов. Кроме того, внесены изменения в существующие классы для улучшения управления патронами и взаимодействия с пользователем.

Changes

Файл Изменения
Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs Добавлен класс EventItemDispenserConfigBoundUserInterface для управления UI раздатчика.
Content.Client/_White/Event/EventItemDispenserSystem.cs Добавлен класс EventItemDispenserSystem и перечисление EventItemDispenserVisualLayers для управления визуализацией раздатчиков.
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs Добавлен класс EventItemDispenserSystem для управления функциональностью раздатчиков на сервере.
Content.Shared/UserInterface/ActivatableUIComponent.cs Небольшие изменения форматирования, добавлено пробел после свойства AdminOnly.
Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs Добавлен новый класс ForceSpawnAmmoEvent для генерации патронов.
Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs Добавлены изменения для обработки патронов, включая новые методы и обновления существующих.
Content.Shared/_White/Event/EventEntityDispenserComponent.cs Добавлены компоненты EventItemDispenserComponent и EventDispensedComponent, а также классы для сетевого взаимодействия.
Content.Shared/_White/Event/SharedEventEntityDispenserSystem.cs Добавлен абстрактный класс SharedEventItemDispenserSystem.
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl Добавлены новые строки локализации для раздатчика предметов на русском языке.
Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml Добавлены новые сущности для раздатчиков предметов.
Resources/Prototypes/_White/Shaders/shaders.yml Добавлен новый шейдер FlickerHologram.
Resources/Textures/_White/Shaders/flickerhologram.swsl Добавлен новый файл шейдера с функциями для создания эффекта мерцающего голограммы.
Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/meta.json Добавлен новый JSON файл с метаданными для ресурса EventItemDispenser.

Suggested labels

Status: Needs Review

Suggested reviewers

  • Remuchi

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @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

github-actions bot commented Dec 13, 2024

RSI Diff Bot; head commit 1f6ed14 merging into 336a466
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/Objects/Tools/Toolboxes/toolbox_yellow.rsi

State Old New Status
icon Modified

Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi

State Old New Status
base Added
base_glow Added
hands Added
lamp_glow Added

Edit: diff updated after 1f6ed14

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: 6

🧹 Outside diff range and nitpick comments (16)
Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs (1)

33-41: Рекомендации по улучшению реализации события

  1. Маркеры комментариев "WD EDIT" могут не соответствовать принятым в проекте соглашениям об оформлении кода.
  2. Пустая строка 39 может быть удалена для лучшей читаемости.

Предлагаемые изменения:

-// WD EDIT START
/// <summary>
/// Raised on BallisticAmmoComponents to force them to generate their ammo as actual entities.
/// </summary>
public sealed class ForceSpawnAmmoEvent : EntityEventArgs
{
-   
}
-// WD EDIT END
+public sealed class ForceSpawnAmmoEvent : EntityEventArgs
+{
+}
Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs (2)

230-230: Уточнение неясного комментария

Комментарий в строке 230 неясен и может вызвать затруднения при чтении кода. Рекомендуется переписать комментарий, чтобы он четко объяснял назначение кода и был понятен другим разработчикам.


189-189: Удалите неуместные комментарии

Комментарий в строке 189 содержит неформальное выражение, которое не соответствует профессиональному стилю. Рекомендуется изменить или удалить этот комментарий для поддержания профессионализма кода.

Resources/Prototypes/_White/Shaders/shaders.yml (1)

5-5: Исправьте форматирование YAML файла

Необходимо исправить следующие проблемы форматирования:

  1. Удалите пробелы в конце строки 5
  2. Добавьте новую пустую строку в конец файла

Also applies to: 10-10

🧰 Tools
🪛 yamllint (1.35.1)

[error] 5-5: trailing spaces

(trailing-spaces)

Content.Client/_White/Event/EventItemDispenserSystem.cs (2)

13-17: Добавьте XML документацию

Рекомендуется добавить XML документацию для публичного класса и его зависимостей.


34-46: Рефакторинг метода UpdateVisuals

Предлагаю выделить расчет масштаба в отдельный метод для улучшения читаемости и переиспользования.

private void UpdateVisuals(EntityUid uid, EventItemDispenserComponent comp)
{
    var sprite = Comp<SpriteComponent>(uid);
    var icon = _sprite.GetPrototypeIcon(comp.DispensingPrototype).Default;
    sprite.LayerSetTexture(EventItemDispenserVisualLayers.ItemPreview, icon);
-   float scale = comp.ItemPreviewScale;
-
-   if (scale <= 0)
-   {
-       scale = 32f / Math.Max(15, Math.Max(icon.Width, icon.Height));
-   }
+   var scale = CalculatePreviewScale(comp.ItemPreviewScale, icon);
    sprite.LayerSetScale(EventItemDispenserVisualLayers.ItemPreview, new Vector2(scale));
}

+private float CalculatePreviewScale(float configuredScale, Texture icon)
+{
+    if (configuredScale > 0)
+        return configuredScale;
+    
+    return 32f / Math.Max(15, Math.Max(icon.Width, icon.Height));
+}
Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml (2)

40-40: Исправьте форматирование YAML файла

Необходимо исправить следующие проблемы:

  1. Исправьте отступ в строке 40 (ожидается 6 пробелов вместо 8)
  2. Добавьте пустую строку в конец файла

Also applies to: 83-83

🧰 Tools
🪛 yamllint (1.35.1)

[warning] 40-40: wrong indentation: expected 6 but found 8

(indentation)


47-48: Рассмотрите добавление английских названий

Для улучшения интернационализации рекомендуется добавить английские названия сущностей с помощью ключа description.

- name: Раздатчик приколов
+ name: Раздатчик приколов
+ description: Prank Dispenser

- name: Ограниченный Раздатчик приколов
+ name: Ограниченный Раздатчик приколов
+ description: Limited Prank Dispenser

Also applies to: 55-56

Resources/Textures/_White/Shaders/flickerhologram.swsl (5)

1-8: Attribution needs proper formatting

The attribution block should follow a more standardized format and include the CC BY-SA 3.0 license terms link.

-//
-// https://gamedev.stackexchange.com/a/59808
-//
-//   Author: sam hocevar
-// Answered: Jul 27, 2013 at 13:33
-//  License: CC BY-SA 3.0
-//
-
+// Source: https://gamedev.stackexchange.com/a/59808
+// Author: sam hocevar
+// Date: Jul 27, 2013
+// License: CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/)
+// 
+// Implementation of RGB/HSV color space conversion functions

16-18: Magic number should be defined as a constant

The epsilon value should be defined as a named constant at the top of the file for better maintainability.

+const highp float EPSILON = 0.0000000001;
+
 /* float e = 1.0e-10; */
-highp float e = 0.0000000001;
+highp float e = EPSILON;

38-38: TODO comment requires clarification

The TODO comment suggests future improvements but lacks specific requirements or tracking.

Would you like me to create a GitHub issue to track the shader customization requirements?


44-47: Improve comment readability

The multi-line comment explaining the displacement effect could be structured better.

-// absolutely unreadable, introduces random noise in the X coord of the UV, seeded by Y
-// produces scanline-like effect, with each line of pixels being randomly displaced left or right
-// makes the item jitter a bit
+// Displacement effect:
+// 1. Introduces random noise in UV.x coordinate (seeded by UV.y)
+// 2. Creates scanline-like effect by randomly displacing each pixel row
+// 3. Results in subtle item jittering

62-65: Magic numbers in color calculations

The color and transparency calculations contain several magic numbers that should be named constants.

+const highp float COLOR_MIX_FACTOR = 0.3;
+const highp float BASE_ALPHA = 0.45;
+const highp float SCAN_SEED = 1.09248882;
+const highp float ALPHA_MIN = 0.5;
+
-COLOR = vec4(mix(col, col2, 0.3), max(tex.w*(sin(TIME * sin(TIME)))*0.25, 0)+0.45*tex.w);
+COLOR = vec4(mix(col, col2, COLOR_MIX_FACTOR), 
+             max(tex.w*(sin(TIME * sin(TIME)))*0.25, 0) + BASE_ALPHA*tex.w);
-COLOR.w *= rng(vec2(0, 1.09248882*TIME*UV.y))*0.5+0.5;
+COLOR.w *= rng(vec2(0, SCAN_SEED*TIME*UV.y))*0.5 + ALPHA_MIN;
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (3)

1-5: Проверьте согласованность терминологии

В строках используются разные варианты слова "предмет". Рекомендуется использовать единообразную терминологию.

-event-item-dispenser-out-of-stock = Предметы кончились!
+event-item-dispenser-out-of-stock = Предметов больше нет!

47-51: Упростите правило множественного числа

Текущая реализация может быть упрощена с использованием стандартного шаблона Fluent.

--evd-remainplural = {$remaining ->
-    [1] остался
-    *[other] осталось
-}
+evd-remainplural = { NUMBER($remaining, type: "cardinal") ->
+    [one] остался
+    *[other] осталось
+}

75-82: Улучшите форматирование подсказок

Длинные тексты подсказок следует разбить на более короткие предложения для улучшения читаемости.

-eventitemdispenser-configwindow-dispensingprototype-tooltip = Прототип предмета, который будет выдаваться игроку при клике. Когда вы в aghost: кликните предметом по раздатчику, чтобы скопировать его прототип сюда.
+eventitemdispenser-configwindow-dispensingprototype-tooltip = Прототип выдаваемого предмета. 
+    Находясь в режиме aghost, кликните предметом по раздатчику для копирования прототипа.
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 336a466 and 0646f73.

⛔ Files ignored due to path filters (5)
  • Resources/Textures/Objects/Tools/Toolboxes/toolbox_yellow.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/base.png is excluded by !**/*.png
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/base_glow.png is excluded by !**/*.png
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/hands.png is excluded by !**/*.png
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/lamp_glow.png is excluded by !**/*.png
📒 Files selected for processing (13)
  • Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs (1 hunks)
  • Content.Client/_White/Event/EventItemDispenserSystem.cs (1 hunks)
  • Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (1 hunks)
  • Content.Shared/UserInterface/ActivatableUIComponent.cs (2 hunks)
  • Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs (1 hunks)
  • Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs (2 hunks)
  • Content.Shared/_White/Event/EventEntityDispenserComponent.cs (1 hunks)
  • Content.Shared/_White/Event/SharedEventEntityDispenserSystem.cs (1 hunks)
  • Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (1 hunks)
  • Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml (1 hunks)
  • Resources/Prototypes/_White/Shaders/shaders.yml (1 hunks)
  • Resources/Textures/_White/Shaders/flickerhologram.swsl (1 hunks)
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/meta.json (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • Content.Shared/UserInterface/ActivatableUIComponent.cs
  • Content.Shared/_White/Event/SharedEventEntityDispenserSystem.cs
  • Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi/meta.json
🧰 Additional context used
📓 Learnings (1)
Content.Client/_White/Event/EventItemDispenserSystem.cs (1)
Learnt from: RedFoxIV
PR: WWhiteDreamProject/wwdpublic#146
File: Content.Client/_White/Event/EventItemDispenserSystem.cs:28-29
Timestamp: 2024-12-12T20:32:45.068Z
Learning: In `Content.Client/_White/Event/EventItemDispenserSystem.cs`, the developer prefers not to add error handling when working with sprites in the `UpdateSpriteLayer` method because any missing sprite indicates a misconfiguration elsewhere, and they believe error handling is unnecessary in this context.
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Shaders/shaders.yml

[error] 5-5: trailing spaces

(trailing-spaces)


[error] 10-10: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml

[warning] 40-40: wrong indentation: expected 6 but found 8

(indentation)


[error] 83-83: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (6)
Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs (1)

34-38: Проверьте необходимость дополнительных свойств

Пустой класс события предполагает, что он используется только как триггер. Убедитесь, что для правильной обработки события не требуется передача дополнительных данных (например, количество патронов для спавна или их тип).

✅ Verification successful

Пустой класс события является достаточным

Анализ кода показывает, что текущая реализация ForceSpawnAmmoEvent без дополнительных свойств полностью удовлетворяет требованиям системы:

  • Событие обрабатывается в SharedGunSystem методом OnForceSpawnAmmo, который использует всю необходимую информацию из компонента BallisticAmmoProviderComponent
  • Количество патронов определяется через component.UnspawnedCount
  • Тип патронов задается через component.Proto
  • Событие используется как простой триггер для материализации виртуальных патронов в реальные сущности
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Поиск обработчиков события ForceSpawnAmmoEvent для проверки требуемых данных

# Поиск использования события в системах
ast-grep --pattern 'OnForceSpawnAmmo($_) {
  $$$
}'

# Поиск вызовов события
rg -A 3 "RaiseEvent.*ForceSpawnAmmoEvent"

Length of output: 97


Script:

#!/bin/bash
# Поиск использования ForceSpawnAmmoEvent в коде с контекстом
rg -A 5 "ForceSpawnAmmoEvent" 

# Поиск методов, где может вызываться это событие
ast-grep --pattern 'RaiseEvent<ForceSpawnAmmoEvent>($$$)'

# Поиск обработчиков события через подписку
ast-grep --pattern 'Subscribe<ForceSpawnAmmoEvent>($$$)'

# Поиск обработчиков через другой паттерн
ast-grep --pattern 'void OnForceSpawnAmmo($$$)'

Length of output: 2763

Content.Shared/_White/Event/EventEntityDispenserComponent.cs (1)

11-71: Код компонента реализован корректно

Компонент EventItemDispenserComponent и связанные с ним классы и перечисления реализованы правильно. Использованы необходимые атрибуты сериализации и сетевого взаимодействия. Структура кода соответствует стандартам, и логика компонента ясна.

Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs (2)

288-299: Реализация метода для принудительного спавна патронов

Метод OnForceSpawnAmmo корректно реализует принудительный спавн патронов, перемещая их из неинициализированного состояния в контейнер компонента. Логика цикла и обновление состояния компонента выполнены правильно.


Line range hint 61-64: Обработка стопок объектов при взаимодействии

Изменения в методе OnBallisticInteractUsing, связанные с обработкой стопок (StackComponent), улучшают взаимодействие при использовании предметов со стопками. Это обеспечивает корректное поведение при перезарядке оружия стопками патронов.

Resources/Prototypes/_White/Shaders/shaders.yml (1)

7-10: Проверьте наличие файла шейдера

Давайте убедимся, что файл шейдера flickerhologram.swsl существует по указанному пути.

✅ Verification successful

Файл шейдера найден и существует по указанному пути

Файл flickerhologram.swsl успешно обнаружен в директории Resources/Textures/_White/Shaders/, что соответствует пути, указанному в конфигурации.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if shader file exists
fd -t f "flickerhologram.swsl" Resources/Textures/_White/Shaders/

Length of output: 120

🧰 Tools
🪛 yamllint (1.35.1)

[error] 10-10: no new line character at the end of file

(new-line-at-end-of-file)

Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml (1)

40-42: Проверьте безопасность неограниченного диапазона взаимодействия

Значение interactionRange: -1 позволяет взаимодействовать с раздатчиком с любого расстояния. Убедитесь, что это действительно необходимо и не создает проблем с безопасностью.

🧰 Tools
🪛 yamllint (1.35.1)

[warning] 40-40: wrong indentation: expected 6 but found 8

(indentation)

Comment on lines +76 to +86
static string SavedDispensingPrototype = default!;
static bool SavedAutoDispose = default;
static bool SavedCanManuallyDispose = default;
static bool SavedInfinite = default;
static string SavedLimit = default!;
static bool SavedReplaceDisposedItems = default;
static string SavedDisposedReplacementPrototype = default!;
static bool SavedAutoCleanUp = default;

static bool saved = false;

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

Избегайте использования статических переменных для хранения состояния UI

Использование статических полей для хранения состояния копирования и вставки настроек может привести к нежелательным эффектам в многопользовательской среде или при открытии нескольких экземпляров интерфейса. Рекомендуется использовать экземплярные поля или специальный класс для управления состоянием, чтобы обеспечить корректную работу интерфейса для всех пользователей.

@TokiJumper
Copy link
Contributor

как же он хорош

@RedFoxIV
Copy link
Contributor Author

Learnt from: RedFoxIV
PR: #146
File: Content.Client/_White/Event/EventItemDispenserSystem.cs:28-29
Timestamp: 2024-12-12T20:32:45.068Z
Learning: In Content.Client/_White/Event/EventItemDispenserSystem.cs, the developer prefers not to add error handling when working with sprites in the UpdateSpriteLayer method because any missing sprite indicates a misconfiguration elsewhere, and they believe error handling is unnecessary in this context.

блять это чё за зондирование

@RedFoxIV
Copy link
Contributor Author

так стоп, а почему спрайт жёлтого тулбокса поменялся

@RedFoxIV
Copy link
Contributor Author

???

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

🧹 Nitpick comments (1)
Resources/Prototypes/_White/Entities/Effects/effects.yml (1)

41-43: Рекомендация по документации

Рекомендуется добавить комментарий, описывающий назначение этого эффекта в контексте системы раздачи предметов.

 - type: entity
   id: EffectTeslaSparksSilent
   categories: [ HideSpawnMenu ]
+  # Визуальный эффект, используемый при выдаче предметов из раздатчика во время событий
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 09a0383 and 64c0631.

📒 Files selected for processing (2)
  • Resources/Prototypes/_White/Entities/Effects/effects.yml (1 hunks)
  • Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Entities/Effects/effects.yml

[warning] 45-45: wrong indentation: expected 4 but found 2

(indentation)


[warning] 51-51: wrong indentation: expected 6 but found 4

(indentation)


[warning] 58-58: wrong indentation: expected 6 but found 4

(indentation)


[error] 59-59: no new line character at the end of file

(new-line-at-end-of-file)

🔇 Additional comments (1)
Resources/Prototypes/_White/Entities/Effects/effects.yml (1)

53-54: Проверьте наличие указанных ресурсов

Убедитесь, что файл текстур Effects/atmospherics.rsi существует и содержит состояние frezon_old.

✅ Verification successful

Ресурсы найдены и проверены

Файл текстур Effects/atmospherics.rsi существует и содержит необходимое состояние frezon_old. Всё корректно.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия файлов ресурсов
fd -e rsi "atmospherics.rsi$" Resources/Textures/Effects/

Length of output: 104


Script:

#!/bin/bash
# Проверяем содержимое RSI файла на наличие состояния frezon_old
if [ -f "Resources/Textures/Effects/atmospherics.rsi/meta.json" ]; then
    cat "Resources/Textures/Effects/atmospherics.rsi/meta.json" | jq '.states | keys'
fi

Length of output: 237


Script:

#!/bin/bash
# Проверяем имена состояний в RSI файле
if [ -f "Resources/Textures/Effects/atmospherics.rsi/meta.json" ]; then
    cat "Resources/Textures/Effects/atmospherics.rsi/meta.json" | jq -r '.states | keys[] as $k | .[$k].name'
fi

Length of output: 348

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

♻️ Duplicate comments (2)
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (2)

93-93: ⚠️ Potential issue

Исправьте название окна конфигурации

Текущее название "Erectin' a dispenser" не соответствует общему стилю интерфейса и использует английский язык.

-eventitemdispenser-configwindow-title = Erectin' a dispenser
+eventitemdispenser-configwindow-title = Настройка раздатчика предметов

1-1: ⚠️ Potential issue

Добавьте английскую версию локализации

Необходимо создать соответствующий файл локализации на английском языке для поддержки интернационализации.

🧹 Nitpick comments (4)
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (4)

33-33: Исправьте название переменной

Переменная _admeme использует неформальное название. Следует использовать профессиональное именование.

-    [Dependency] private readonly IAdminManager _admeme = default!;
+    [Dependency] private readonly IAdminManager _adminManager = default!;

233-237: Удалите избыточные комментарии

Комментарии do i have to? и "{{{{}}}}" is non-negotiable не несут полезной информации и должны быть удалены.

Also applies to: 251-252


292-292: Исправьте неуместный комментарий

Комментарий erectin' a vendomat не несёт полезной информации и должен быть удален.


350-372: Удалите закомментированный код

Неиспользуемый метод GetPlural следует удалить, так как он заменён на систему локализации.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 64c0631 and e4d1f90.

📒 Files selected for processing (2)
  • Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (1 hunks)
  • Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (1 hunks)
🔇 Additional comments (1)
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (1)

85-86: ⚠️ Potential issue

Уберите неуместные комментарии

Комментарии содержат неформальную лексику. Замените на профессиональное описание проблемы.

-        if (depth >= 5) // what the fuck kind of item is that?
-            throw new ArgumentException($"Item Uid:{item}, proto:\"{MetaData(item).EntityPrototype?.ID}\" has FIVE levels of storage component entities stored in each other. What the fuck?");
+        if (depth >= 5)
+            throw new ArgumentException($"Item Uid:{item}, proto:\"{MetaData(item).EntityPrototype?.ID}\" has excessive nesting of storage components (>5 levels).");

Likely invalid or redundant comment.

@CrimeMoot
Copy link

CrimeMoot commented Dec 18, 2024

Если вставить в раздатчик вещь, без включенной вкладки замены/возвращение. То сервер даёт фаталку:

[FATL] unhandled: Robust.Shared.Utility.DebugAssertException: Exception of type 'Robust.Shared.Utility.DebugAssertException' was thrown.
   at Robust.Shared.Utility.DebugTools.Assert(Boolean condition) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\Utility\DebugTools.cs:line 37
   at Content.Shared.Interaction.SharedInteractionSystem.InteractDoAfter(EntityUid user, EntityUid used, Nullable`1 target, EntityCoordinates clickLocation, Boolean canReach, Boolean checkDeletion) in C:\Users\math\Space-Cats-14\Content.Shared\Interaction\SharedInteractionSystem.cs:line 1067
   at Content.Shared.Interaction.SharedInteractionSystem.InteractUsing(EntityUid user, EntityUid used, EntityUid target, EntityCoordinates clickLocation, Boolean checkCanInteract, Boolean checkCanUse) in C:\Users\math\Space-Cats-14\Content.Shared\Interaction\SharedInteractionSystem.cs:line 1027
   at Content.Shared.Interaction.SharedInteractionSystem.UserInteraction(EntityUid user, EntityCoordinates coordinates, Nullable`1 target, Boolean altInteract, Boolean checkCanInteract, Boolean checkAccess, Boolean checkCanUse) in C:\Users\math\Space-Cats-14\Content.Shared\Interaction\SharedInteractionSystem.cs:line 442
   at Content.Shared.Interaction.SharedInteractionSystem.HandleUseInteraction(ICommonSession session, EntityCoordinates coords, EntityUid uid) in C:\Users\math\Space-Cats-14\Content.Shared\Interaction\SharedInteractionSystem.cs:line 316
   at Robust.Shared.Input.Binding.PointerInputCmdHandler.<>c__DisplayClass5_0.<.ctor>b__0(PointerInputCmdArgs& args) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\Input\Binding\InputCmdHandler.cs:line 97
   at Robust.Shared.Input.Binding.PointerInputCmdHandler.HandleCmdMessage(IEntityManager entManager, ICommonSession session, IFullInputCmdMessage message) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\Input\Binding\InputCmdHandler.cs:line 127
   at Robust.Server.GameObjects.InputSystem.InputMessageHandler(InputCmdMessage message, EntitySessionEventArgs eventArgs) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\GameObjects\EntitySystems\InputSystem.cs:line 65
   at Robust.Shared.GameObjects.EventBusExt.HandlerWrapper`1.Invoke(EntitySessionMessage`1 msg) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\GameObjects\EventBusExt.cs:line 46
   at Robust.Shared.GameObjects.EntityEventBus.<>c__DisplayClass4_0`1.<SubscribeEvent>b__0(Unit& ev) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\GameObjects\EntityEventBus.Broadcast.cs:line 173
   at Robust.Shared.GameObjects.EntityEventBus.ProcessSingleEventCore(EventSource source, Unit& unitRef, EventData subs) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\GameObjects\EntityEventBus.Broadcast.cs:line 335
   at Robust.Shared.GameObjects.EntityEventBus.ProcessSingleEvent(EventSource source, Unit& unitRef, Type eventType) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\GameObjects\EntityEventBus.Broadcast.cs:line 324
   at Robust.Shared.GameObjects.EntityEventBus.RaiseEvent(EventSource source, Object toRaise) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\GameObjects\EntityEventBus.Broadcast.cs:line 267
   at Robust.Server.GameObjects.ServerEntityManager.<Initialize>b__8_0(Object _, Object systemMsg) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\GameObjects\ServerEntityManager.cs:line 53
   at Robust.Server.GameObjects.ServerEntityManager.DispatchEntityNetworkMessage(MsgEntity message) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\GameObjects\ServerEntityManager.cs:line 266
   at Robust.Server.GameObjects.ServerEntityManager.TickUpdate(Single frameTime, Boolean noPredictions, Histogram histogram) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\GameObjects\ServerEntityManager.cs:line 192
   at Robust.Server.BaseServer.Update(FrameEventArgs frameEventArgs) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\BaseServer.cs:line 731
   at Robust.Server.BaseServer.<SetupMainLoop>b__67_1(Object sender, FrameEventArgs args) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\BaseServer.cs:line 544
   at Robust.Shared.Timing.GameLoop.Run() in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Shared\Timing\GameLoop.cs:line 235
   at Robust.Server.BaseServer.MainLoop() in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\BaseServer.cs:line 571
   at Robust.Server.Program.ParsedMain(CommandLineArgs args, Boolean contentStart, ServerOptions options) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\Program.cs:line 74
   at Robust.Server.Program.Start(String[] args, ServerOptions options, Boolean contentStart) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\Program.cs:line 42
   at Robust.Server.ContentStart.Start(String[] args) in C:\Users\math\Space-Cats-14\RobustToolbox\Robust.Server\ContentStart.cs:line 10
   at Content.Server.Program.Main(String[] args) in C:\Users\math\Space-Cats-14\Content.Server\Program.cs:line 9

Там ещё это. При попытке взять - когда лимит закончился, вместо текста пишется строка непереведенного кода.

@RedFoxIV
Copy link
Contributor Author

InteractDoAfter(EntityUid user, EntityUid used, Nullable`1 target, EntityCoordinates clickLocation, Boolean canReach, Boolean checkDeletion) in C:\Users\math\Space-Cats-14\Content.Shared\Interaction\SharedInteractionSystem.cs:line 1067

у меня в этом методе никаких ассертов нету
А ещё он на строчках 949-978
works on my machine

Если вставить в раздатчик вещь, без включенной вкладки замены/возвращение. То сервер даёт фаталку:

вообще не понял. Какая вкладка? Там нигде нету вкладок, в ПРе только одно окно добавлено.

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

🧹 Nitpick comments (4)
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (4)

33-33: Переименуйте зависимость _admeme

Использование неформального названия "_admeme" для зависимости IAdminManager не соответствует профессиональным стандартам именования.

-    [Dependency] private readonly IAdminManager _admeme = default!;
+    [Dependency] private readonly IAdminManager _adminManager = default!;

83-103: Очистите непрофессиональные комментарии

Метод содержит неуместные комментарии и текст исключения. Необходимо переформулировать, сохранив техническую информацию.

-        if (depth >= 5) // what the fuck kind of item is that?
-            throw new ArgumentException($"Item Uid:{item}, proto:\"{MetaData(item).EntityPrototype?.ID}\" has FIVE levels of storage component entities stored in each other. What the fuck?");
+        if (depth >= 5)
+            throw new ArgumentException($"Item Uid:{item}, proto:\"{MetaData(item).EntityPrototype?.ID}\" exceeds maximum allowed storage nesting depth of 5 levels.");

226-253: Оптимизируйте методы DeleteAll и ReleaseAll

Методы содержат лишние комментарии и могут быть оптимизированы с использованием LINQ.

     private void DeleteAll(EntityUid uid, EventItemDispenserComponent comp)
     {
-        foreach (var items in comp.dispensedItems.Values)
-        {
-            foreach (var item in items)
-            {
-                if (!TerminatingOrDeleted(item)) // do i have to?
-                {
-                    Recycle(item, comp, false); // no fancy effects
-                } // "{{{{}}}}" is non-negotiable
-            }
-        }
+        var items = comp.dispensedItems.Values
+            .SelectMany(items => items)
+            .Where(item => !TerminatingOrDeleted(item));
+        
+        foreach (var item in items)
+        {
+            Recycle(item, comp, false);
+        }
     }

     private void ReleaseAll(EntityUid dispenser, EventItemDispenserComponent comp)
     {
-        foreach (var items in comp.dispensedItems.Values)
-        {
-            foreach (var item in items)
-            {
-                if (!TerminatingOrDeleted(item))
-                {
-                    RemComp<EventDispensedComponent>(item);
-                } // "{{{{}}}}" is non-negotiable
-            }
-        }
+        var items = comp.dispensedItems.Values
+            .SelectMany(items => items)
+            .Where(item => !TerminatingOrDeleted(item));
+        
+        foreach (var item in items)
+        {
+            RemComp<EventDispensedComponent>(item);
+        }
     }

329-341: Улучшите читаемость метода GetRemaining

Метод содержит магическое число и может быть упрощен.

+    private const int UnlimitedItems = 9001; // Значение для неограниченного количества предметов
+
     private int GetRemaining(EntityUid user, EventItemDispenserComponent comp)
     {
         if (comp.Limit <= 0)
-            return 9001;
+            return UnlimitedItems;
+
         if (comp.Infinite)
         {
             PruneItemList(user, comp);
-            return comp.dispensedItems.ContainsKey(user) ? comp.Limit - comp.dispensedItems[user].Count : comp.Limit;
-        }
-        else
-            return comp.dispensedItemsAmount.ContainsKey(user) ? comp.Limit - comp.dispensedItemsAmount[user] : comp.Limit;
+            return comp.dispensedItems.TryGetValue(user, out var items) 
+                ? comp.Limit - items.Count 
+                : comp.Limit;
+        }
+
+        return comp.dispensedItemsAmount.TryGetValue(user, out var amount)
+            ? comp.Limit - amount
+            : comp.Limit;
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8056588 and 8a0377d.

📒 Files selected for processing (1)
  • Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs (1 hunks)

@CrimeMoot
Copy link

CrimeMoot commented Dec 19, 2024

вообще не понял. Какая вкладка? Там нигде нету вкладок, в ПРе только одно окно добавлено.

Я не знаю какая. Но смотри. Я пытаюсь вставить Объект который взял - допустим автомат, но вместо замены - он выдаёт фаталку которую я скинул. В момент замены, там было 0/3 - то есть 0 объектов доступных.

Copy link
Member

@Spatison Spatison left a comment

Choose a reason for hiding this comment

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

Ну вроде стало по лучше, но есть маленькая проблема с переводом. Еще бы на английский перевести интерфейс. В общем, пусть еще ремучи глянет

Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl Outdated Show resolved Hide resolved
Co-authored-by: Spatison <[email protected]>
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: 2

🧹 Nitpick comments (1)
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (1)

90-98: Подсказки конфигурации требуют доработки

  1. В строке 90 упоминается "aghost" без объяснения
  2. В строке 91 используется восклицательный знак непоследовательно
  3. В строке 96 цветовое выделение используется только для одного предупреждения

Предлагаю следующие улучшения:

-eventitemdispenser-configwindow-dispensingprototype-tooltip = Прототип предмета, который будет выдаваться игроку при клике. Когда вы в aghost: кликните предметом по раздатчику, чтобы скопировать его прототип сюда.
+eventitemdispenser-configwindow-dispensingprototype-tooltip = Прототип предмета, который будет выдаваться игроку при клике. [color=yellow]Для администраторов:[/color] кликните предметом по раздатчику, чтобы скопировать его прототип сюда.

-eventitemdispenser-configwindow-autodispose-tooltip = При попытке взять предмет сверх установленного лимита, удаляет самый старый предмет. Не имеет эффекта на раздатчиках с конечным запасом!
+eventitemdispenser-configwindow-autodispose-tooltip = При попытке взять предмет сверх установленного лимита, удаляет самый старый предмет. [color=yellow]Не имеет эффекта на раздатчиках с конечным запасом![/color]
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8a0377d and 1f6ed14.

📒 Files selected for processing (1)
  • Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (1 hunks)
🔇 Additional comments (2)
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (2)

1-2: Статусные сообщения выглядят корректно

Сообщения краткие и понятные, что соответствует хорошим практикам UI/UX.


99-99: Заголовок окна конфигурации на английском языке

Текущий заголовок "Erectin' a dispenser" не соответствует языку интерфейса.

Comment on lines +1 to +107
-item-plural = {$count ->
[one] предмет
[few] предмета
*[many] предметов
}

-item-plural-remain = {$count ->
[one] остался
*[few] осталось
}

event-item-dispenser-item-name = Выдаёт нечто под названием "[color=violet]{ $itemName }[/color]"

event-item-dispenser-examine-infinite = Я могу взять {$noLimit ->
[true] { -event-item-dispenser-unlimited }!
*[other] { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }.
}

event-item-dispenser-examine-infinite-autodispose = {$noLimit ->
[true] Я могу взять { -event-item-dispenser-unlimited }!
*[other] Я могу взять { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, прежде чем самый старый предмет пропадёт.
}

event-item-dispenser-examine-infinite-autodispose-manualdispose = {$noLimit ->
[true] Я могу взять { -event-item-dispenser-unlimited }! Если что, я могу вернуть их здесь.
*[other] Я могу взять { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, прежде чем самый старый предмет пропадёт. Если что, я могу вернуть их здесь, чтобы получить новые.
}

event-item-dispenser-examine-infinite-manualdispose= {$noLimit ->
[true] Я могу взять { -event-item-dispenser-unlimited }! Если что, я могу вернуть их здесь.
*[other] Я могу взять { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, прежде чем мне придётся их вернуть, чтобы взять новые.
}

event-item-dispenser-examine-infinite-single = {$remaining ->
[1] Внутри только [color=yellow]один[/color] предмет.
*[0] Внутри [color=yellow]пусто[/color].
}

event-item-dispenser-examine-infinite-autodispose-single = {$remaining ->
[1] Я могу здесь взять только [color=yellow]один[/color] предмет. Если я возьму второй, первый пропадёт.
*[0] Если я возьму здесь [color=yellow]новый[/color] предмет, старый пропадёт.
}

event-item-dispenser-examine-infinite-autodispose-manualdispose-single = {$remaining ->
[1] Я могу здесь взять только [color=yellow]один[/color] предмет. Если что, я смогу его вернуть, чтобы получить новый.
*[0] Если я возьму здесь [color=yellow]новый[/color] предмет, старый пропадёт. А ещё я могу вернуть здесь старый предмет, чтобы получить новый.
}

event-item-dispenser-examine-infinite-manualdispose-single = {$remaining ->
[1] Я могу здесь взять только [color=yellow]один[/color] предмет. Если что, я смогу его вернуть.
*[0] Внутри [color=yellow]пусто[/color], но я могу вернуть здесь старый предмет, чтобы получить новый.
}


# For some reason, after the {-item-plural()} fluent fails to insert {$l}, despite it being passed, but successfully inserts {$limit}, even though
# it is "global" and should fail the same way it fails to insert {$remaining}.
-event-item-dispenser-finite-count = [color=yellow]{$r}[/color] { -item-plural(count: $remaining)} (из [color=yellow]{$limit}[/color])



event-item-dispenser-examine-finite = {$noLimit ->
[true] Я могу взять { -event-item-dispenser-unlimited }!
*[false] Внутри {-item-plural-remain(count: $remaining)} { -event-item-dispenser-finite-count(r:$remaining, l:$limit) }.
}

event-item-dispenser-examine-finite-manualdispose = Внутри {-item-plural-remain(count: $remaining)} {$noLimit ->
[true] Я могу взять { -event-item-dispenser-unlimited }! Если что, я могу их вернуть.
*[false] Внутри {-item-plural-remain(count: $remaining)} { -event-item-dispenser-finite-count(r:$remaining, l:$limit) } Если что, я могу их вернуть, чтобы получить новые.
}

event-item-dispenser-examine-finite-single = {$remaining ->
[1] Внутри только [color=yellow]один[/color] предмет.
*[0] Внутри [color=yellow]пусто[/color].
}

event-item-dispenser-examine-finite-manualdispose-single = {$remaining ->
[1] Внутри только [color=yellow]один[/color] предмет. Если что, я смогу его вернуть, чтобы получить новый.
*[0] Внутри [color=yellow]пусто[/color], но я могу вернуть здесь старый предмет, чтобы получить новый.
}



eventitemdispenser-configwindow-dispensingprototype-tooltip = Прототип предмета, который будет выдаваться игроку при клике. Когда вы в aghost: кликните предметом по раздатчику, чтобы скопировать его прототип сюда.
eventitemdispenser-configwindow-autodispose-tooltip = При попытке взять предмет сверх установленного лимита, удаляет самый старый предмет. Не имеет эффекта на раздатчиках с конечным запасом!
eventitemdispenser-configwindow-infinite-tooltip = Раздатчик с конечным запасом отслеживает, сколько предметов взял игрок и не даёт взять сверх лимита. Бесконечный раздатчик в своём подсчёте не учитывает удалённые предметы.
eventitemdispenser-configwindow-limit-tooltip = Максимальное количество предметов, которое может взять каждый игрок из этого раздатчика. Ноль отключает лимит, будьте осторожны!
eventitemdispenser-configwindow-canmanuallydispose-tooltip = Если да, то при клике на раздатчик выданным предметом удаляет его, "возвращая" в раздатчик. Свойства предмета (напр. батарейка егана) не переносятся на следующий выдаваемый предмет.
eventitemdispenser-configwindow-replacedisposeditems-tooltip = При автоматическом удалении лишних предметов заменять их на данный прототип. Не имеет эффекта на раздатчиках без автоудаления излишка!
eventitemdispenser-configwindow-disposedreplacement-tooltip = Прототип предмета, на который будет заменён удаляемый лишний предмет. Рекомендуется указать либо прототип какого-нибудь мусора, либо прототип эффекта. [color=yellow]Не имеет эффекта на раздатчиках без автоудаления излишка![/color]
eventitemdispenser-configwindow-autocleanup-tooltip = Если да, то все предметы, выданные этим раздатчиком, будут удалены вместе с этим раздатчиком. (На самом деле вместе с компонентом EventItemDispenser раздатчика)

eventitemdispenser-configwindow-title = Erectin' a dispenser
eventitemdispenser-configwindow-dispensingprototype = Прототип предмета
eventitemdispenser-configwindow-autodispose = Автоматически удалять излишек?
eventitemdispenser-configwindow-canmanuallydispose = Можно ли вручную удалить предмет?
eventitemdispenser-configwindow-infinite = Бесконечно восполняемый запас
eventitemdispenser-configwindow-limit = Лимит предметов
eventitemdispenser-configwindow-replacedisposeditems = Заменять автоматически удалённые предметы?
eventitemdispenser-configwindow-disposedreplacement = Прототип замены
eventitemdispenser-configwindow-autocleanup = Автоматическая чистка при удалении раздатчика
Copy link
Contributor

@coderabbitai coderabbitai bot Dec 21, 2024

Choose a reason for hiding this comment

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

⚠️ Potential issue

Отсутствует английская версия локализации

Необходимо создать соответствующий файл с английскими переводами.

Хотите, чтобы я помог создать английскую версию файла локализации?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Делай

Copy link
Contributor

Choose a reason for hiding this comment

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

@RedFoxIV, вот английская версия локализации:

event-item-dispenser-out-of-stock = Items are out of stock!
event-item-dispenser-limit-reached = Limit reached!
-event-item-dispenser-unlimited = [color=yellow]unlimited[/color] items

# For some reason, after the {-item-plural()} Fluent fails to insert {$l}, despite it being passed,
# but successfully inserts {$limit}, even though it is "global" and should fail the same way it fails to insert {$remaining}.
-event-item-dispenser-infinite-count = [color=yellow]{ $r }[/color] more { -item-plural(count:$r) } (of [color=yellow]{ $limit }[/color])
-item-plural = {$count ->
    [one] item
    [few] items
    *[many] items
}

-item-plural-remain = {$count ->
    [one] remains
    *[few] remain
}

event-item-dispenser-item-name = Dispenses something called "[color=violet]{ $itemName }[/color]"

event-item-dispenser-examine-infinite = I can take {$noLimit ->
    [true]   { -event-item-dispenser-unlimited }!
    *[other] { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }.
}

event-item-dispenser-examine-infinite-autodispose = {$noLimit ->
    [true]   I can take { -event-item-dispenser-unlimited }!
    *[other] I can take { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, after which the oldest item will be removed.
}

event-item-dispenser-examine-infinite-autodispose-manualdispose = {$noLimit ->
    [true]   I can take { -event-item-dispenser-unlimited }! If needed, I can return them here.
    *[other] I can take { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, after which the oldest item will be removed. If needed, I can return them here to request new ones.
}

event-item-dispenser-examine-infinite-manualdispose = {$noLimit ->
    [true]   I can take { -event-item-dispenser-unlimited }! If needed, I can return them here.
    *[other] I can take { -event-item-dispenser-infinite-count(r: $remaining, l: $limit) }, after which I must return them here if I need more.
}

event-item-dispenser-examine-infinite-single = {$remaining ->
    [1] There's only [color=yellow]one[/color] item inside.
    *[0] It's [color=yellow]empty[/color] inside.
}

event-item-dispenser-examine-infinite-autodispose-single = {$remaining ->
    [1] I can only take [color=yellow]one[/color] item here. If I take a second one, the first one will be removed.
    *[0] If I take a [color=yellow]new[/color] item here, the old one will be removed.
}

event-item-dispenser-examine-infinite-autodispose-manualdispose-single = {$remaining ->
    [1] I can only take [color=yellow]one[/color] item here. If needed, I can return it to request a new one.
    *[0] If I take a [color=yellow]new[/color] item here, the old one will be removed. I can also return the old item here to request a new one.
}

event-item-dispenser-examine-infinite-manualdispose-single = {$remaining ->
    [1] I can only take [color=yellow]one[/color] item here. If needed, I can return it.
    *[0] It's [color=yellow]empty[/color] inside, but I can return the old item here to request a new one.
}

# For some reason, after the {-item-plural()} Fluent fails to insert {$l}, despite it being passed,
# but successfully inserts {$limit}, even though it is "global" and should fail the same way it fails to insert {$remaining}.
-event-item-dispenser-finite-count = [color=yellow]{$r}[/color] { -item-plural(count: $remaining) } (of [color=yellow]{$limit}[/color])

event-item-dispenser-examine-finite = {$noLimit ->
    [true]   I can take { -event-item-dispenser-unlimited }!
    *[false] There { -item-plural-remain(count: $remaining) } { -event-item-dispenser-finite-count(r: $remaining, l: $limit) } inside.
}

event-item-dispenser-examine-finite-manualdispose = There { -item-plural-remain(count: $remaining) } {$noLimit ->
    [true]   I can take { -event-item-dispenser-unlimited }! If needed, I can return them.
    *[false] There { -item-plural-remain(count: $remaining) } { -event-item-dispenser-finite-count(r: $remaining, l: $limit) }. If needed, I can return them here to request new ones.
}

event-item-dispenser-examine-finite-single = {$remaining ->
    [1] There's only [color=yellow]one[/color] item inside.
    *[0] It's [color=yellow]empty[/color] inside.
}

event-item-dispenser-examine-finite-manualdispose-single = {$remaining ->
    [1] There's only [color=yellow]one[/color] item inside. If needed, I can return it to request a new one.
    *[0] It's [color=yellow]empty[/color] inside, but I can return the old item here to request a new one.
}

eventitemdispenser-configwindow-dispensingprototype-tooltip = The item prototype to be dispensed upon click. When you're in aghost mode: click on the dispenser with an item to copy its prototype here.
eventitemdispenser-configwindow-autodispose-tooltip = If the limit is exceeded, automatically removes the oldest item. Has no effect on dispensers with a finite stock!
eventitemdispenser-configwindow-infinite-tooltip = A finite-stock dispenser tracks how many items a player has taken and doesn’t allow taking above that limit. An infinite dispenser doesn’t account for removed items in its count.
eventitemdispenser-configwindow-limit-tooltip = The maximum number of items each player can take from this dispenser. Zero disables the limit, be cautious!
eventitemdispenser-configwindow-canmanuallydispose-tooltip = If enabled, clicking on the dispenser with a dispensed item deletes it, effectively “returning” it to the dispenser. The item’s properties (e.g., a gun’s battery) do not carry over to the next dispensed item.
eventitemdispenser-configwindow-replacedisposeditems-tooltip = When automatically removing excess items, replace them with this prototype. Has no effect on dispensers without auto-removal!
eventitemdispenser-configwindow-disposedreplacement-tooltip = The prototype used to replace items automatically removed. Recommended to specify either a “trash” prototype or an effect prototype. [color=yellow]Has no effect on dispensers without auto-removal![/color]
eventitemdispenser-configwindow-autocleanup-tooltip = If enabled, all items dispensed by this dispenser will be removed together with the dispenser. (Technically when the EventItemDispenser component is removed)

eventitemdispenser-configwindow-title = Erectin' a dispenser
eventitemdispenser-configwindow-dispensingprototype = Item prototype
eventitemdispenser-configwindow-autodispose = Automatically remove excess?
eventitemdispenser-configwindow-canmanuallydispose = Allow manual removal of items?
eventitemdispenser-configwindow-infinite = Infinite restock
eventitemdispenser-configwindow-limit = Item limit
eventitemdispenser-configwindow-replacedisposeditems = Replace automatically removed items?
eventitemdispenser-configwindow-disposedreplacement = Replacement prototype
eventitemdispenser-configwindow-autocleanup = Automatic cleanup when the dispenser is removed

Comment on lines +8 to +17
-item-plural = {$count ->
[one] предмет
[few] предмета
*[many] предметов
}

-item-plural-remain = {$count ->
[one] остался
*[few] осталось
}
Copy link
Contributor

@coderabbitai coderabbitai bot Dec 21, 2024

Choose a reason for hiding this comment

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

⚠️ Potential issue

Необходимо добавить поддержку чисел 20-29 в функции pluralization

Текущая реализация не учитывает особенности склонения для чисел от 20 до 29 (например, "22 предметов" вместо "22 предмета").

Предлагаю следующее решение:

 -item-plural = {$count ->
     [one] предмет
     [few] предмета
+    [20] предметов
+    [21] предмет
+    [22] предмета
+    [23] предмета
+    [24] предмета
+    [25] предметов
+    [26] предметов
+    [27] предметов
+    [28] предметов
+    [29] предметов
     *[many] предметов
 }

Committable suggestion skipped: line range outside the PR's diff.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ключи "one", "few" и "many" следуют правилам склонения множественных чисел в используемом языке (русском)

Copy link
Contributor

Choose a reason for hiding this comment

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

@RedFoxIV, понял вас. Если текущие ключи удовлетворяют правилам русского языка, можно оставить их как есть. Вопрос с числами 20–29 иногда вызывает споры, но если вы уверены в корректной работе one, few и many, то никаких дополнительных изменений не требуется. Спасибо за уточнение.
(╥_╥)

Copy link
Collaborator

@Remuchi Remuchi left a comment

Choose a reason for hiding this comment

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

вроде плюс минус прилично надо в игре посмотреть. Единственное да, переводы бы еще впилить

@RedFoxIV
Copy link
Contributor Author

todo надо пару строк переписать, чтобы использовал IconComponent когда можно

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

Successfully merging this pull request may close these issues.

5 participants