-
Notifications
You must be signed in to change notification settings - Fork 34
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
base: master
Are you sure you want to change the base?
Conversation
WalkthroughВ данном пулл-реквесте добавлены несколько новых классов и компонентов, связанных с системой раздачи предметов в игре. Включены пользовательский интерфейс для настройки раздатчика, системы управления визуализацией, а также компоненты для управления логикой раздачи предметов. Также добавлены новые строки локализации на русском языке, новые сущности для раздатчиков и шейдеры для визуальных эффектов. Кроме того, внесены изменения в существующие классы для улучшения управления патронами и взаимодействия с пользователем. Changes
Suggested labels
Suggested reviewers
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
RSI Diff Bot; head commit 1f6ed14 merging into 336a466 Resources/Textures/_White/Structures/Misc/EventItemDispenser.rsi
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 6
🧹 Outside diff range and nitpick comments (16)
Content.Shared/Weapons/Ranged/Events/TakeAmmoEvent.cs (1)
33-41
: Рекомендации по улучшению реализации события
- Маркеры комментариев "WD EDIT" могут не соответствовать принятым в проекте соглашениям об оформлении кода.
- Пустая строка 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 файлаНеобходимо исправить следующие проблемы форматирования:
- Удалите пробелы в конце строки 5
- Добавьте новую пустую строку в конец файла
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 файлаНеобходимо исправить следующие проблемы:
- Исправьте отступ в строке 40 (ожидается 6 пробелов вместо 8)
- Добавьте пустую строку в конец файла
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 DispenserAlso applies to: 55-56
Resources/Textures/_White/Shaders/flickerhologram.swsl (5)
1-8
: Attribution needs proper formattingThe 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 constantThe 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 clarificationThe 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 readabilityThe 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 calculationsThe 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
⛔ 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)
Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs
Show resolved
Hide resolved
Content.Client/_White/Event/EventItemDispenserConfigBoundUserInterface.cs
Show resolved
Hide resolved
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; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Избегайте использования статических переменных для хранения состояния UI
Использование статических полей для хранения состояния копирования и вставки настроек может привести к нежелательным эффектам в многопользовательской среде или при открытии нескольких экземпляров интерфейса. Рекомендуется использовать экземплярные поля или специальный класс для управления состоянием, чтобы обеспечить корректную работу интерфейса для всех пользователей.
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
Show resolved
Hide resolved
как же он хорош |
блять это чё за зондирование |
так стоп, а почему спрайт жёлтого тулбокса поменялся |
??? |
Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml
Outdated
Show resolved
Hide resolved
Resources/Prototypes/_White/Entities/Structures/Misc/EventDispensers.yml
Outdated
Show resolved
Hide resolved
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
Outdated
Show resolved
Hide resolved
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
Show resolved
Hide resolved
Co-authored-by: Spatison <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 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
📒 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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ 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
📒 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
:
Уберите неуместные комментарии
Комментарии содержат неформальную лексику. Замените на профессиональное описание проблемы.
- 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.
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
Show resolved
Hide resolved
Если вставить в раздатчик вещь, без включенной вкладки замены/возвращение. То сервер даёт фаталку: [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 Там ещё это. При попытке взять - когда лимит закончился, вместо текста пишется строка непереведенного кода. |
у меня в этом методе никаких ассертов нету
вообще не понял. Какая вкладка? Там нигде нету вкладок, в ПРе только одно окно добавлено. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 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
📒 Files selected for processing (1)
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
(1 hunks)
Content.Server/_White/Event/EventEntityDispenser/EventItemDispenserSystem.cs
Show resolved
Hide resolved
Я не знаю какая. Но смотри. Я пытаюсь вставить Объект который взял - допустим автомат, но вместо замены - он выдаёт фаталку которую я скинул. В момент замены, там было 0/3 - то есть 0 объектов доступных. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ну вроде стало по лучше, но есть маленькая проблема с переводом. Еще бы на английский перевести интерфейс. В общем, пусть еще ремучи глянет
Co-authored-by: Spatison <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (1)
Resources/Locale/ru-RU/_white/Event/eventItemDispenser.ftl (1)
90-98
: Подсказки конфигурации требуют доработки
- В строке 90 упоминается "aghost" без объяснения
- В строке 91 используется восклицательный знак непоследовательно
- В строке 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
📒 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" не соответствует языку интерфейса.
-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 = Автоматическая чистка при удалении раздатчика |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Отсутствует английская версия локализации
Необходимо создать соответствующий файл с английскими переводами.
Хотите, чтобы я помог создать английскую версию файла локализации?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Делай
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@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
-item-plural = {$count -> | ||
[one] предмет | ||
[few] предмета | ||
*[many] предметов | ||
} | ||
|
||
-item-plural-remain = {$count -> | ||
[one] остался | ||
*[few] осталось | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо добавить поддержку чисел 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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ключи "one", "few" и "many" следуют правилам склонения множественных чисел в используемом языке (русском)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@RedFoxIV, понял вас. Если текущие ключи удовлетворяют правилам русского языка, можно оставить их как есть. Вопрос с числами 20–29 иногда вызывает споры, но если вы уверены в корректной работе one
, few
и many
, то никаких дополнительных изменений не требуется. Спасибо за уточнение.
(╥_╥)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
вроде плюс минус прилично надо в игре посмотреть. Единственное да, переводы бы еще впилить
todo надо пару строк переписать, чтобы использовал IconComponent когда можно |
Описание PR
Универсальные раздатчики для выдачи предметов игрокам на ивентах.
Для каждого игрока - отдельный подсчёт выданных предметов, помогая обеспечить всех необходимым снаряжением.
Медиа
Список
cunt.webm
гифкой почему-то не грузится
Тултипы на галочках и текстовых полях более подробно объясняют, какая опция за что отвечает.
Не предназначены для использования вне ивентов, поэтому ченджлог оставляю пустым.