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

[Tweak] Holoprojector / Голопроектрор #112

Merged
merged 4 commits into from
Nov 6, 2024
Merged

Conversation

Spatison
Copy link
Member

Описание PR

Переработка голопроекторов, теперь они больше похоже на свой вариант из 13-ой станции.


Изменения

🆑 Spatison

  • tweak: The holoprojectors have been redesigned / Голопроекторы были переработаны

@Spatison Spatison requested a review from Remuchi October 30, 2024 13:20
@Spatison Spatison self-assigned this Oct 30, 2024
Copy link
Contributor

coderabbitai bot commented Oct 30, 2024

Walkthrough

The changes in this pull request involve significant modifications to the HolosignProjectorComponent and related systems. The ChargeUse field has been replaced with a count-based usage model, introducing MaxUses and Uses fields. The HolosignSystem has been updated to remove dependencies on battery management, directly utilizing the new usage properties. A new HolosignComponent has been added, along with a new HolosignSystem for managing holosign destruction. Localization files have been updated to reflect new user messages, and various entity definitions and recipes have been modified to align with these changes.

Changes

File Path Change Summary
Content.Server/Holosign/HolosignProjectorComponent.cs - Removed ChargeUse field.
- Added MaxUses and Uses fields.
- Added read-only list Signs.
Content.Server/Holosign/HolosignSystem.cs - Removed dependency on PowerCellSystem.
- Updated OnExamine and OnBeforeInteract methods.
- Added OnUse method for managing signs.
Content.Server/_White/Holosign/HolosignComponent.cs - Introduced HolosignComponent with a read-only property Projector.
Content.Server/_White/Holosign/HolosignSystem.cs - Added new HolosignSystem class with methods for handling HolosignComponent destruction.
Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl - Added new localization strings for active projections, usage limits, and deletion confirmation.
Resources/Locale/ru-RU/_white/holoprojector/holoprojector.ftl - Added Russian localization strings for active projections, usage limits, and deletion confirmation.
Resources/Migrations/migration.yml - Added new entity mappings for various holoprojector entities.
- Removed obsolete entity mappings.
Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml - Removed several projector entities.
- Updated Holoprojector entity with a new delay property.
- Removed chargeUse from multiple entities.
Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml - Updated BorgModuleAdvancedCleaning to include Holoprojector as an item.
Resources/Prototypes/Entities/Structures/Holographic/projections.yml - Removed TimedDespawn component from several entities.
- Added Clickable and MeleeSound components to HolosignWetFloor.
Resources/Prototypes/Recipes/Lathes/janitorial.yml - Updated Holoprojector recipe result from HoloprojectorEmpty to Holoprojector.
Resources/Prototypes/Recipes/Lathes/security.yml - Updated HoloprojectorSecurity recipe result from HoloprojectorSecurityEmpty to HoloprojectorSecurity.
Resources/Prototypes/Recipes/Lathes/tools.yml - Updated HolofanProjector and HoloprojectorField recipe results from empty variants to standard items.
Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/holoprojectors.yml - Removed ItemSlots component from HoloprojectorEngineering.

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 resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🧹 Outside diff range and nitpick comments (12)
Content.Server/_White/Holosign/HolosignComponent.cs (1)

1-5: Add XML documentation for the component class.

While the component structure is correct, adding XML documentation would improve maintainability by describing the component's purpose and usage within the holoprojector system.

 namespace Content.Server._White.Holosign;

 [RegisterComponent]
+/// <summary>
+/// Component that represents a holosign entity and maintains a reference to its associated sign.
+/// Used in conjunction with the holoprojector system for managing holographic signs.
+/// </summary>
 public sealed partial class HolosignComponent : Component
Resources/Locale/ru-RU/_white/holoprojector/holoprojector.ftl (1)

1-3: LGTM! Consider standardizing punctuation.

The translations are accurate and properly formatted. For consistency, consider adding an exclamation mark to the first message to match the style of the other two messages.

-holoprojector-active-holo = Активные проекции: [color=fuchsia]{ $activeholo }[/color]
+holoprojector-active-holo = Активные проекции: [color=fuchsia]{ $activeholo }[/color]!
Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl (1)

2-2: Consider making the limit message more informative.

The warning message could be more helpful by including the actual maximum number of allowed projections.

-holoprojector-uses-limit = The maximum number of projections was used!
+holoprojector-uses-limit = Maximum limit reached! You can only create { $maxUses } projections.
Content.Server/_White/Holosign/HolosignSystem.cs (1)

1-3: Consider adding XML documentation comments.

Adding XML documentation comments for the namespace and class would improve code maintainability by clearly describing the purpose and functionality of this new system.

Content.Server/Holosign/HolosignProjectorComponent.cs (2)

17-19: Add ViewVariables attribute to Uses field.

Consider adding the ViewVariables attribute to the Uses field for consistency and to aid in debugging:

 [DataField]
+[ViewVariables(VVAccess.ReadWrite)]
 public int Uses = 6;

13-22: Consider additional safeguards for the usage system.

A few architectural suggestions to improve robustness:

  1. Consider adding validation to ensure Uses doesn't exceed MaxUses
  2. Consider implementing a maximum limit for the Signs list to prevent unbounded growth
  3. Consider adding documentation explaining the rationale for 6 uses

Here's a more robust implementation:

 // WD EDIT START
+/// <summary>
+/// Maximum number of signs that can be created before recharge is needed.
+/// Set to 6 to match the reference design from the 13th station.
+/// </summary>
 [DataField]
 public int MaxUses = 6;

+[ViewVariables(VVAccess.ReadWrite)]
 [DataField]
-public int Uses = 6;
+public int Uses
+{
+    get => _uses;
+    set => _uses = Math.Clamp(value, 0, MaxUses);
+}
+private int _uses = 6;

+/// <summary>
+/// Tracks currently active signs created by this projector.
+/// </summary>
 [ViewVariables(VVAccess.ReadOnly)]
+[DataField]
+[DataDefinition]
 public List<EntityUid?> Signs = new();
+
+/// <summary>
+/// Maximum number of signs that can exist simultaneously to prevent resource exhaustion.
+/// </summary>
+[DataField]
+public int MaxSigns = 20;
 // WD EDIT END
Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (1)

Line range hint 44-45: Fix inconsistent tag values across projector variants.

All projector variants are using the "HolofanProjector" tag, which appears to be incorrect for the field and security variants.

Apply these changes to fix the tag consistency:

  - type: Tag
    tags:
-     - HolofanProjector
+     - HoloprojectorField
  - type: Tag
    tags:
-     - HolofanProjector
+     - HoloprojectorSecurity

Also applies to: 67-68, 89-90

Resources/Prototypes/Entities/Structures/Holographic/projections.yml (2)

Line range hint 1-124: Consider persistence implications of removing TimedDespawn.

The removal of the TimedDespawn component from all holographic entities has several implications:

  1. Without automatic cleanup, holograms could persist indefinitely
  2. This might impact server performance if many holograms are created
  3. Consider implementing alternative cleanup mechanisms or decay behavior

Consider one of these alternatives:

  1. Add a maximum lifetime alongside the usage count
  2. Implement a decay system based on distance from projector
  3. Add a maximum concurrent holograms limit per area

Line range hint 35-124: Consider restructuring entity inheritance hierarchy.

The current inheritance structure where all holographic entities inherit from HolosignWetFloor might not be optimal:

  1. Base entity has canCollide: false while children override with different collision settings
  2. Children have significantly different behaviors (force fields vs. warning signs)

Consider creating a more logical hierarchy:

  1. Abstract base HolosignBase with common properties
  2. Separate hierarchies for interactive vs. barrier holograms
  3. Group similar collision behaviors together
Content.Server/Holosign/HolosignSystem.cs (1)

28-41: Consider defensive programming improvements.

While the logic is functionally correct, consider these improvements:

  1. Add null check for component.Signs
  2. Use consistent string interpolation style
  3. Use a more specific examination group name

Consider this refactor:

-        var activeholo = component.Signs.Count;
+        var activeholo = component.Signs?.Count ?? 0;

-        using (args.PushGroup(nameof(HolosignProjectorComponent)))
+        using (args.PushGroup("HoloprojectorStatus"))
         {
-            args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", ("charges", charges)));
-            args.PushMarkup(Loc.GetString("holoprojector-active-holo", ("activeholo", activeholo)));
+            args.PushMarkup(Loc.GetString("limited-charges-charges-remaining", new { charges }));
+            args.PushMarkup(Loc.GetString("holoprojector-active-holo", new { activeholo }));
Resources/Migrations/migration.yml (2)

251-251: Fix date format in comment

The date format 2024-30-10 is non-standard. It should be 2024-10-30 to maintain consistency with the YYYY-MM-DD format used throughout the file.


256-256: Add newline at end of file

Add a newline character at the end of the file to comply with YAML best practices and prevent potential issues with some tools.

🧰 Tools
🪛 yamllint

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

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

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 6093d72 and 570f13b.

📒 Files selected for processing (13)
  • Content.Server/Holosign/HolosignProjectorComponent.cs (1 hunks)
  • Content.Server/Holosign/HolosignSystem.cs (1 hunks)
  • Content.Server/_White/Holosign/HolosignComponent.cs (1 hunks)
  • Content.Server/_White/Holosign/HolosignSystem.cs (1 hunks)
  • Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/holoprojector/holoprojector.ftl (1 hunks)
  • Resources/Migrations/migration.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Holographic/projections.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/janitorial.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/security.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/tools.yml (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • Resources/Prototypes/Recipes/Lathes/security.yml
🧰 Additional context used
🪛 yamllint
Resources/Migrations/migration.yml

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

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

🔇 Additional comments (15)
Content.Server/_White/Holosign/HolosignComponent.cs (1)

1-8: Verify the component's integration with HolosignSystem.

The component looks good overall, but we should verify its integration with the system that manages it.

✅ Verification successful

Component is properly integrated with HolosignSystem

The component is well integrated with both HolosignSystem implementations:

  • The _White/Holosign/HolosignSystem.cs handles component destruction via DestructionEventArgs
  • The main Holosign/HolosignSystem.cs manages the component's lifecycle:
    • Creates and initializes HolosignComponent when placing new signs
    • Properly sets the Sign field to reference the projector
    • Handles cleanup when signs are removed or destroyed
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the HolosignSystem implementation and its interaction with this component

# Test 1: Check if HolosignSystem exists and handles this component
ast-grep --pattern 'class HolosignSystem : EntitySystem
{
  $$$
  public void $_(EntityUid uid, HolosignComponent component)
  {
    $$$
  }
  $$$
}'

# Test 2: Check for proper cleanup handling
rg -A 5 "OnRemove.*HolosignComponent"

Length of output: 151


Script:

#!/bin/bash
# Let's try a broader search to find any mentions of HolosignSystem and its implementation

# Search for HolosignSystem class definition
rg -l "class HolosignSystem"

# Search for any file handling HolosignComponent
rg -l "HolosignComponent"

# Search for any methods that might be handling the Sign field
ast-grep --pattern 'class $_ {
  $$$
  $_($_, HolosignComponent $_) {
    $$$
  }
  $$$
}'

Length of output: 383


Script:

#!/bin/bash
# Let's examine the content of both HolosignSystem files to understand the implementation

# Check the content of _White/Holosign/HolosignSystem.cs
cat Content.Server/_White/Holosign/HolosignSystem.cs

# Check the content of the other HolosignSystem.cs
cat Content.Server/Holosign/HolosignSystem.cs

# Look for any initialization or cleanup methods
rg -A 5 "Initialize|OnRemove" Content.Server/_White/Holosign/HolosignSystem.cs

Length of output: 4753

Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl (1)

1-3: LGTM! Consistent terminology and clear messaging.

The localization strings are well-structured with consistent use of terminology ("projections") and proper grammar throughout. The color formatting and string interpolation are correctly implemented.

Content.Server/_White/Holosign/HolosignSystem.cs (1)

1-21: Verify the implementation matches the AI summary.

The current implementation appears incomplete compared to the AI-generated summary which mentions:

  1. Handling of UseInHandEvent
  2. Integration with PopupSystem
  3. Management of MaxUses

Let's verify if these components exist elsewhere in the codebase:

Resources/Prototypes/Recipes/Lathes/janitorial.yml (1)

69-69: LGTM! The recipe update aligns with the new holoprojector system.

The change from HoloprojectorEmpty to Holoprojector as the recipe result is consistent with the broader system updates that remove empty variants and transition to a usage-count based system.

Let's verify there are no remaining references to the removed HoloprojectorEmpty:

✅ Verification successful

The reference to HoloprojectorEmpty in the migration file is expected and correct

The presence of HoloprojectorEmpty: Holoprojector in Resources/Migrations/migration.yml is actually part of the intended change. This migration file is specifically designed to map old entity IDs to new ones when loading older content, ensuring backward compatibility. The migration entry aligns perfectly with the holoprojector redesign that removes empty variants and transitions to the new system.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining references to HoloprojectorEmpty
# Expected: No results, as this entity has been removed

# Search for any remaining references to HoloprojectorEmpty
rg "HoloprojectorEmpty"

Length of output: 92


Script:

#!/bin/bash
# Let's check the migration file to understand the context
cat Resources/Migrations/migration.yml

Length of output: 8309

Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (3)

Line range hint 71-76: Consider adding ReverseEngineering component to HoloprojectorSecurity.

The HolofanProjector and HoloprojectorField have ReverseEngineering components with difficulty 3, but HoloprojectorSecurity doesn't. This might be intentional, but worth verifying.

Let's check if this is consistent with similar security devices:

#!/bin/bash
# Check ReverseEngineering usage on security devices
rg "parent: .*Security.*\n.*\n.*\n.*ReverseEngineering:" -A 2

Also applies to: 89-93


Line range hint 1-93: Verify the default Uses/MaxUses values are appropriate for all variants.

The AI summary indicates a transition from charge-based to usage-count system, but the YAML doesn't specify MaxUses or Uses values. Consider if different projector types should have different usage limits.

Let's check the component implementation:


11-11: Consider documenting the reasoning behind the 0.5s delay.

While adding a delay helps prevent spam usage, it would be helpful to document why 0.5 seconds was chosen as the specific value. Also, consider using a more descriptive comment format instead of "WD EDIT".

Let's check if there are any established delay values for similar items:

✅ Verification successful

The 0.5s delay is consistent with similar interaction-preventing delays in the codebase

The 0.5 second delay appears to be a common value used across various items to prevent rapid/spam usage, including:

  • Desk bells
  • Light switches
  • Trashbags
  • Hyposprays
  • Mech equipment
  • Shield toggles

While documenting the specific reasoning would be nice, the chosen delay value aligns well with established patterns for preventing interaction spam in the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for other UseDelay configurations to ensure consistency
rg "UseDelay:?\s*\n\s*delay:" -A 1

Length of output: 228


Script:

#!/bin/bash
# Search for UseDelay configurations with multiline mode
rg -U "UseDelay:?\s*\n\s*delay:" -A 1

# Also search for delay configurations in general to understand common patterns
rg "delay:\s*[0-9.]+" -A 1

Length of output: 45021

Content.Server/Holosign/HolosignSystem.cs (2)

1-23: LGTM: Clean dependency management and initialization.

The changes properly integrate the new PopupSystem dependency and event subscription while removing the battery-related dependencies, aligning well with the new usage-based system.


48-48: Good catch on preventing storage interaction.

The storage component check prevents unintended interactions when storing the projector.

Resources/Prototypes/Recipes/Lathes/tools.yml (2)

241-241: Verify entity exists and approve recipe update.

The recipe update from HoloprojectorFieldEmpty to HoloprojectorField aligns with the new usage-based system. The higher material cost (including plasma) suggests this is an advanced variant.

Let's verify the entity exists:

#!/bin/bash
# Description: Verify that HoloprojectorField entity exists in the prototypes
# Expected: Should find the entity definition

rg -l "^- type: entity\s+id: HoloprojectorField\s*$"

192-192: Verify entity exists and approve recipe update.

The recipe update from HolofanProjectorEmpty to HolofanProjector aligns with the new usage-based system.

Let's verify the entity exists:

✅ Verification successful

Recipe update to HolofanProjector is valid and entity exists

The entity HolofanProjector is properly defined in Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml with all required components. The migration from HolofanProjectorEmpty to HolofanProjector is also documented in Resources/Migrations/migration.yml, confirming this is an intended change aligned with the new usage-based system.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that HolofanProjector entity exists in the prototypes
# Expected: Should find the entity definition

rg -l "^- type: entity\s+id: HolofanProjector\s*$"

Length of output: 54


Script:

#!/bin/bash
# Let's try a more flexible search pattern for the entity
rg "id: HolofanProjector" -A 5

# Also search in yaml files specifically
fd -e yml -e yaml -x rg "id: HolofanProjector" {} -A 5

# Let's also check if there might be a different casing or naming
rg -i "holofan" -A 5

Length of output: 18155

Resources/Migrations/migration.yml (2)

249-250: LGTM: VendingMachinePride mapping

The mapping follows the established pattern for vending machine migrations.


252-256: LGTM: Holoprojector mappings

The consolidation of specialized holoprojector variants to their base types aligns with the PR objectives of redesigning the holoprojector system.

Let's verify that these entities are properly handled:

✅ Verification successful

Holoprojector mappings verified successfully

The old holoprojector entities are only referenced in the migration file, and the base types (Holoprojector, HolofanProjector, HoloprojectorField, HoloprojectorSecurity) are properly defined across various prototype and map files. The consolidation appears to be implemented correctly.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for any remaining references to the old holoprojector entities
rg -l "HoloprojectorEmpty|HoloprojectorBorg|HolofanProjectorEmpty|HoloprojectorFieldEmpty|HoloprojectorSecurityEmpty"

Length of output: 154


Script:

#!/bin/bash
# Let's check the content around these references to ensure they are only in migration mappings
rg -C 3 "HoloprojectorEmpty|HoloprojectorBorg|HolofanProjectorEmpty|HoloprojectorFieldEmpty|HoloprojectorSecurityEmpty" Resources/Migrations/migration.yml

# Also search for base types to ensure they exist
rg -l "Holoprojector|HolofanProjector|HoloprojectorField|HoloprojectorSecurity"

Length of output: 2142

🧰 Tools
🪛 yamllint

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

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

Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml (2)

Line range hint 342-348: LGTM! The change is properly integrated

The addition of the Holoprojector to the advanced cleaning module's item list is well-placed within the janitorial section. The change is consistent with the PR's objective of redesigning holoprojectors.


346-346: Verify the Holoprojector entity exists

The change replaces HoloprojectorBorg with Holoprojector. While this aligns with the holoprojector redesign objectives, we should verify the new entity's existence and compatibility.

✅ Verification successful

Holoprojector entity verified and migration confirmed

The new Holoprojector entity is properly defined in Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml with appropriate components including HolosignProjector. The migration from HoloprojectorBorg to Holoprojector is also documented in Resources/Migrations/migration.yml, confirming this is an intentional replacement.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the Holoprojector entity exists and is properly defined
# Expected: Find the entity definition for Holoprojector

# Search for Holoprojector entity definition
echo "Searching for Holoprojector entity definition..."
rg "id: Holoprojector$" -A 10

# Search for any remaining references to the old HoloprojectorBorg
echo "Checking for any remaining references to HoloprojectorBorg..."
rg "HoloprojectorBorg"

Length of output: 3026

Content.Server/_White/Holosign/HolosignComponent.cs Outdated Show resolved Hide resolved
Content.Server/_White/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
Content.Server/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
Content.Server/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
Content.Server/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
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: 4

🧹 Outside diff range and nitpick comments (12)
Resources/Locale/ru-RU/_white/holoprojector/holoprojector.ftl (2)

1-3: Consider adding exclamation mark for message consistency.

The messages follow a consistent format, but the first message lacks an exclamation mark while the others have it.

-holoprojector-active-holo = Активные проекции: [color=fuchsia]{ $activeholo }[/color]
+holoprojector-active-holo = Активные проекции: [color=fuchsia]{ $activeholo }[/color]!

1-1: Consider using a more accessible color.

While fuchsia provides visual emphasis, it might not be optimal for all users. Consider using a more neutral color or implementing a configurable color system for better accessibility.

Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl (2)

1-3: LGTM! Consider minor improvements to message clarity.

The messages are well-structured and grammatically correct. Consider these minor improvements:

  1. Make the limit message more informative by including the maximum number: "Maximum number of projections ({$maxUses}) reached!"
  2. Use more neutral punctuation in the limit message
 holoprojector-active-holo = Active projections: [color=fuchsia]{ $activeholo }[/color]
-holoprojector-uses-limit = The maximum number of projections was used!
+holoprojector-uses-limit = Maximum number of projections ({ $maxUses }) reached.
 holoprojector-delete-signs = All projections have been deleted!

1-3: Consider consistent color formatting across messages.

The active projections count uses fuchsia coloring, but other messages don't use any color formatting. Consider using consistent color highlighting for important numbers or status changes across all messages.

 holoprojector-active-holo = Active projections: [color=fuchsia]{ $activeholo }[/color]
-holoprojector-uses-limit = Maximum number of projections ({ $maxUses }) reached.
-holoprojector-delete-signs = All projections have been deleted!
+holoprojector-uses-limit = Maximum number of projections ([color=fuchsia]{ $maxUses }[/color]) reached.
+holoprojector-delete-signs = [color=fuchsia]All[/color] projections have been deleted!
Content.Server/_White/Holosign/HolosignSystem.cs (1)

6-11: Add XML documentation for better code maintainability.

Consider adding XML documentation to describe the system's purpose and responsibilities.

+/// <summary>
+/// Handles the destruction of holosigns and manages their relationship with projectors.
+/// </summary>
 public sealed class HolosignSystem : EntitySystem
Content.Server/Holosign/HolosignProjectorComponent.cs (1)

20-21: Add XML documentation for Signs list

The Signs list would benefit from documentation explaining its purpose and lifecycle management.

+/// <summary>
+/// Tracks all active signs created by this projector for cleanup purposes.
+/// </summary>
 [ViewVariables(VVAccess.ReadOnly)]
 public List<EntityUid?> Signs = new();
Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (2)

Line range hint 7-7: Missing configuration for the new usage-based system.

The HolosignProjector component has been changed from a charge-based to a count-based system, but the YAML configurations don't specify the required MaxUses and Uses properties. This could lead to undefined behavior.

Add the missing properties to each holoprojector variant:

  - type: HolosignProjector
+   maxUses: 10  # Adjust this value based on design requirements
+   uses: 10     # Initial number of uses

Also applies to: 23-24, 44-45, 67-68


Line range hint 31-32: Fix inconsistent entity tags.

The HoloprojectorField and HoloprojectorSecurity entities incorrectly use the "HolofanProjector" tag. Each entity should have its own specific tag for proper identification.

Apply these fixes:

# In HoloprojectorField
    - type: Tag
      tags:
-       - HolofanProjector
+       - HoloprojectorField

# In HoloprojectorSecurity
    - type: Tag
      tags:
-       - HolofanProjector
+       - HoloprojectorSecurity

Also applies to: 54-55, 76-77

Resources/Prototypes/Entities/Structures/Holographic/projections.yml (1)

26-33: Consider the UX implications of the electrical glove sound.

The melee sound effect (egloves.ogg) seems thematically inconsistent with a holographic projection. Consider using a more appropriate sound effect that better represents the interaction with a hologram, such as an electronic or energy-based sound.

Content.Server/Holosign/HolosignSystem.cs (2)

28-37: Consider using named format parameters in localization strings.

While the functionality is correct, consider updating the localization string "holoprojector-active-holo" to use named parameters instead of positional ones for better maintainability and clarity.

-args.PushMarkup(Loc.GetString("holoprojector-active-holo", ("activeholo", activeholo)));
+args.PushMarkup(Loc.GetString("holoprojector-active-holo", ("count", activeholo)));

84-96: Consider adding operation success feedback.

While the sign cleanup logic is correct, consider tracking the number of signs removed and providing more detailed feedback to the user.

+var removedCount = 0;
 foreach (var sign in component.Signs.ToList())
 {
     component.Signs.Remove(sign);
     QueueDel(sign);
+    removedCount++;
 }

 component.Uses = component.MaxUses;
-_popup.PopupEntity(Loc.GetString("holoprojector-delete-signs"), args.User, args.User, PopupType.Medium);
+_popup.PopupEntity(Loc.GetString("holoprojector-delete-signs-count", ("count", removedCount)), 
+    args.User, args.User, PopupType.Medium);
Resources/Migrations/migration.yml (1)

256-256: Add newline at end of file.

The file is missing a newline character at the end, which is a YAML best practice.

Add a newline at the end of the file:

 HoloprojectorSecurityEmpty: HoloprojectorSecurity
+
🧰 Tools
🪛 yamllint

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

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

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 6093d72 and 570f13b.

📒 Files selected for processing (13)
  • Content.Server/Holosign/HolosignProjectorComponent.cs (1 hunks)
  • Content.Server/Holosign/HolosignSystem.cs (1 hunks)
  • Content.Server/_White/Holosign/HolosignComponent.cs (1 hunks)
  • Content.Server/_White/Holosign/HolosignSystem.cs (1 hunks)
  • Resources/Locale/en-US/_white/holoprojector/holoprojector.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/holoprojector/holoprojector.ftl (1 hunks)
  • Resources/Migrations/migration.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Holographic/projections.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/janitorial.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/security.yml (1 hunks)
  • Resources/Prototypes/Recipes/Lathes/tools.yml (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • Resources/Prototypes/Recipes/Lathes/security.yml
🧰 Additional context used
🪛 yamllint
Resources/Migrations/migration.yml

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

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

🔇 Additional comments (15)
Content.Server/_White/Holosign/HolosignComponent.cs (1)

1-3: LGTM! Namespace and component registration are properly implemented.

Content.Server/_White/Holosign/HolosignSystem.cs (2)

1-4: LGTM! Clean and focused imports.

The imports are minimal and directly related to the system's functionality.


6-21: Verify completeness of the implementation.

Based on the AI summary, several expected features appear to be missing:

  • OnUse handler for projector usage
  • OnExamine functionality
  • Sign spawning logic

Let's verify if these features exist elsewhere in the codebase:

Resources/Prototypes/Recipes/Lathes/janitorial.yml (2)

69-69: LGTM! Recipe update aligns with holoprojector system changes.

The change from HoloprojectorEmpty to Holoprojector is consistent with the removal of the charge-based system in favor of the new usage-based system.


69-69: Verify consistency of holoprojector recipe changes.

Let's ensure similar recipe updates were applied consistently across all holoprojector variants.

✅ Verification successful

Holoprojector recipe changes are consistent

All holoprojector-related recipes have been updated consistently:

  • Regular Holoprojector in janitorial.yml
  • HoloprojectorSecurity in security.yml
  • HoloprojectorField in tools.yml
  • HolofanProjector in tools.yml

All recipes have the "# WD EDIT" comment and none contain "Empty" variants, confirming the changes were applied uniformly across all variants.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining references to empty holoprojector variants in recipes
# Expected: No matches for *Empty variants, confirming consistent updates

echo "Checking for any remaining references to empty holoprojector variants in recipes..."
rg -l "result: .*HoloprojectorEmpty" "Resources/Prototypes/Recipes"

echo "Checking for any remaining references to empty holofan/field variants in recipes..."
rg -l "result: .*Holo(fan|field).*Empty" "Resources/Prototypes/Recipes"

Length of output: 493


Script:

#!/bin/bash
# Let's check all holoprojector-related recipes to verify consistency
echo "Checking all holoprojector recipes and variants..."
rg -A 5 -B 5 "result:.*[Hh]oloprojector" "Resources/Prototypes/Recipes"

echo -e "\nChecking all holofan/field recipes..."
rg -A 5 -B 5 "result:.*[Hh]olo(fan|field)" "Resources/Prototypes/Recipes"

Length of output: 3211

Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml (1)

11-11: Verify the gameplay impact of the 0.5s use delay.

The addition of a 0.5-second delay between uses could affect gameplay mechanics. Please ensure this delay provides a good balance between preventing spam usage while maintaining responsive controls.

Consider documenting the rationale for this specific delay value in the code comment instead of just marking it as an edit.

Resources/Prototypes/Entities/Structures/Holographic/projections.yml (1)

Line range hint 1-140: Verify the removal of TimedDespawn components.

The AI summary indicates that TimedDespawn components were removed from all holosign entities. This architectural change from temporary to permanent holosigns could have significant gameplay implications:

  1. Resource Management: Without auto-despawn, players need to manually manage/cleanup holosigns
  2. Server Performance: Permanent holosigns could accumulate over time
  3. Game Balance: Infinite duration might make these tools too powerful

Let's confirm the impact and current usage:

Consider implementing one of these alternatives:

  1. Add a manual "disable" interaction using the new Clickable component
  2. Implement a cleanup system that removes unused holosigns after a certain period
  3. Add a maximum concurrent holosigns limit per projector
Content.Server/Holosign/HolosignSystem.cs (3)

1-23: LGTM! Dependencies and initialization are properly structured.

The new dependencies and event subscriptions align well with the system's functionality.


48-48: Good addition of storage component check.

The storage component check prevents unintended interactions when storing the projector.


74-79: 🛠️ Refactor suggestion

Consider adding error handling for sign creation.

The sign creation process should handle potential failures in component addition and entity spawning.

-EnsureComp<HolosignComponent>(holoUid, out var holosign);
-component.Signs.Add(holoUid);
-holosign.Sign = uid;
+if (TryComp<HolosignComponent>(holoUid, out var holosign))
+{
+    component.Signs.Add(holoUid);
+    holosign.Sign = uid;
+}
+else
+{
+    QueueDel(holoUid);
+    _popup.PopupEntity(Loc.GetString("holoprojector-creation-failed"), args.User, args.User, PopupType.Error);
+    return;
+}
Resources/Prototypes/Recipes/Lathes/tools.yml (2)

192-192: LGTM: Recipe result update aligns with system redesign.

The change from HolofanProjectorEmpty to HolofanProjector correctly reflects the architectural shift from charge-based to count-based usage model.


241-241: LGTM: Recipe result update aligns with system redesign.

The change from HoloprojectorFieldEmpty to HoloprojectorField correctly reflects the architectural shift from charge-based to count-based usage model.

Let's verify that all holoprojector-related recipes have been updated consistently:

✅ Verification successful

All holoprojector recipes have been updated consistently

Based on the search results, all holoprojector recipes (Holoprojector, HoloprojectorField, and HoloprojectorSecurity) have been updated to use the new count-based model, with no remaining references to "Empty" variants. Each recipe has the "# WD EDIT" comment indicating they were part of the same system redesign.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining references to 'Empty' holoprojectors
# across all recipe files

# Test: Search for any remaining 'Empty' variants in recipes
rg -l "result: .*Holoprojector.*Empty" "Resources/Prototypes/Recipes"

Length of output: 69


Script:

#!/bin/bash
# Let's do a broader search to understand the holoprojector recipes and entities
# First, find all holoprojector-related recipes
rg -i "holoprojector" "Resources/Prototypes/Recipes" -A 5 -B 5

# Also search for holoprojector entities to understand the available types
rg -i "holoprojector" "Resources/Prototypes/Entities" -A 5 -B 5

Length of output: 13883

Resources/Migrations/migration.yml (2)

249-250: LGTM: VendingMachine mapping preserved.

The mapping of VendingMachinePride to RandomVending is maintained correctly.


251-256: Verify holoprojector entity consolidation.

The mappings align with the holoprojector redesign objectives, consolidating specialized variants into their base types. This matches the broader system changes described in the PR.

Let's verify that these entities are properly handled in the codebase:

✅ Verification successful

Let me check the actual content of these files to verify the entity definitions and their usage.


Holoprojector entity consolidation verified successfully

The verification confirms proper implementation of the holoprojector consolidation:

  • All old entity IDs (Empty/Borg variants) are completely removed from the prototypes
  • Base entities (Holoprojector, HolofanProjector, HoloprojectorField, HoloprojectorSecurity) are properly defined with correct inheritance
  • Manufacturing recipes are updated to use the new consolidated entities
  • Component configurations are maintained appropriately for each variant
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that old holoprojector entities are properly migrated

# Test 1: Check if old entity IDs are completely removed from prototypes
echo "Checking for any remaining references to old holoprojector entities..."
rg -l "HoloprojectorEmpty|HoloprojectorBorg|HolofanProjectorEmpty|HoloprojectorFieldEmpty|HoloprojectorSecurityEmpty" Resources/Prototypes/

# Test 2: Verify new entity definitions exist
echo "Verifying new holoprojector entity definitions..."
rg -l "^(?:  )?id: (Holoprojector|HolofanProjector|HoloprojectorField|HoloprojectorSecurity)$" Resources/Prototypes/

Length of output: 761


Script:

#!/bin/bash
# Check the content of holoprojectors.yml for entity definitions
echo "=== Checking holoprojectors.yml ==="
cat "Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml"

# Check recipes to ensure they reference correct entities
echo -e "\n=== Checking recipes ==="
cat "Resources/Prototypes/Recipes/Lathes/janitorial.yml" "Resources/Prototypes/Recipes/Lathes/security.yml" "Resources/Prototypes/Recipes/Lathes/tools.yml" | grep -A 5 "Holoprojector"

# Check tags file
echo -e "\n=== Checking tags.yml ==="
cat "Resources/Prototypes/tags.yml" | grep -A 2 -B 2 "Holoprojector"

Length of output: 2908

🧰 Tools
🪛 yamllint

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

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

Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml (1)

346-346: Verify the Holoprojector integration.

The addition of Holoprojector to the advanced cleaning module aligns with the PR's objective of redesigning holoprojectors. However, let's verify a few aspects:

✅ Verification successful

Based on the shell script results, I can now generate the final response:

Holoprojector integration is properly configured and balanced

The Holoprojector entity is well-defined in Resources/Prototypes/Entities/Objects/Devices/holoprojectors.yml with appropriate components and configurations. It's a janitorial tool that projects holographic signs, which thematically fits with the advanced cleaning module. The item is:

  • Craftable in janitorial lathe with balanced material costs (250 Plastic, 150 Glass)
  • Already integrated into service/janitorial loadouts
  • Part of the standard janitorial equipment set
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the Holoprojector entity exists and check its configuration
# Test 1: Check if Holoprojector entity exists
echo "Checking for Holoprojector entity definition..."
rg -l "^- type: entity\n\s+id: Holoprojector\b" "Resources/Prototypes"

# Test 2: Check for any balance-related configurations
echo "Checking for Holoprojector balance configurations..."
rg "Holoprojector" "Resources/Prototypes" -A 5

Length of output: 17711

Content.Server/_White/Holosign/HolosignComponent.cs Outdated Show resolved Hide resolved
Content.Server/_White/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
Content.Server/Holosign/HolosignSystem.cs Outdated Show resolved Hide resolved
@Spatison Spatison requested a review from Remuchi October 31, 2024 08:54
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Outside diff range and nitpick comments (3)
Content.Server/_White/Holosign/HolosignComponent.cs (1)

1-5: Add XML documentation to improve code clarity.

The component would benefit from XML documentation explaining:

  • The purpose of this component
  • Its relationship with HolosignProjectorComponent
  • When it's attached/detached
 namespace Content.Server._White.Holosign;

+/// <summary>
+/// Component attached to holosign entities that are created by a <see cref="HolosignProjectorComponent"/>.
+/// Tracks the projector that created this holosign for cleanup and management purposes.
+/// </summary>
 [RegisterComponent]
 public sealed partial class HolosignComponent : Component
Content.Server/Holosign/HolosignSystem.cs (2)

Line range hint 67-73: Add validation for SignProto before spawning.

The code attempts to spawn an entity without validating if the prototype exists.

Add prototype validation:

+        if (!_prototypeManager.HasIndex<EntityPrototype>(component.SignProto))
+        {
+            Log.Error($"Invalid SignProto '{component.SignProto}' in HolosignProjectorComponent on {ToPrettyString(uid)}");
+            return;
+        }
+
         var holoUid = EntityManager.SpawnEntity(component.SignProto, args.ClickLocation.SnapToGrid(EntityManager));

Line range hint 1-100: Consider separating sign management into a dedicated service.

The current design combines sign projection, tracking, and cleanup in a single system. Consider extracting sign management into a dedicated service to improve maintainability and testability.

This would:

  1. Simplify the HolosignSystem
  2. Make sign tracking more robust
  3. Enable better testing of sign management logic
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 570f13b and dc40677.

📒 Files selected for processing (4)
  • Content.Server/Holosign/HolosignSystem.cs (2 hunks)
  • Content.Server/_White/Holosign/HolosignComponent.cs (1 hunks)
  • Content.Server/_White/Holosign/HolosignSystem.cs (1 hunks)
  • Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/holoprojectors.yml (0 hunks)
💤 Files with no reviewable changes (1)
  • Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/holoprojectors.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Server/_White/Holosign/HolosignSystem.cs
🧰 Additional context used
📓 Learnings (1)
Content.Server/_White/Holosign/HolosignComponent.cs (1)
Learnt from: Remuchi
PR: WWhiteDreamProject/wwdpublic#112
File: Content.Server/Holosign/HolosignProjectorComponent.cs:20-21
Timestamp: 2024-10-31T02:46:05.354Z
Learning: In `HolosignProjectorComponent`, the `Signs` list does not need the `DataField` attribute as it doesn't need to be serialized.
🔇 Additional comments (1)
Content.Server/Holosign/HolosignSystem.cs (1)

1-23: LGTM!

The dependencies and initialization logic are properly structured.

@Remuchi Remuchi merged commit 5c5d109 into master Nov 6, 2024
10 of 11 checks passed
@Remuchi Remuchi deleted the holofan branch November 6, 2024 03:48
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.

2 participants