Skip to content

Adição para Exploradores#848

Open
Struater wants to merge 10 commits into
Project-Dumont:dumontfrom
Struater:salvage5
Open

Adição para Exploradores#848
Struater wants to merge 10 commits into
Project-Dumont:dumontfrom
Struater:salvage5

Conversation

@Struater

Copy link
Copy Markdown
Contributor

Sobre a PR

Nova dungeon e inimigo para os exploradores

Por quê? / Balanceamento

Conteúdo

porta:
Far-Horizons-SS14/Far-Horizons-SS14#1412

Detalhes Técnicos

Anexos

image image

Requerimentos

Changelog

🆑

  • add: Adicionada nova dungeon para os Explorador, A Fabrica.
  • add: Nova missão para os Exploradores, Desarme. É uma missão rara no qual terão que achar os códigos de desativação e inserir nos computadores certos para evitar a autodestruição da instalação.
  • add: Novo inimigo, as Carne.
  • tweak: Traduzido as falas do sílicios

@Dumont-Station

Copy link
Copy Markdown
Member

This pull request has conflicts, please resolve those before we can evaluate the pull request.

@github-actions

github-actions Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

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

Resources/Textures/_Starlight/Structures/Machines/desktop_computers.rsi

State Old New Status
computer Added
explosive Added
generic Added

Edit: diff updated after a444e41

@coderabbitai

coderabbitai Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

O PR adiciona uma missão de desarme com UI cliente, validação de códigos e consoles interativos, além da dungeon Factory, novos mobs de carne com divisão após a morte e respectivas configurações, mapas, protótipos e localizações.

Changes

Salvage: desarme, Factory e novos mobs

Layer / File(s) Summary
Fluxo de desarme
Content.Shared/_FarHorizons/Salvage/..., Content.Client/_FarHorizons/Salvage/..., Resources/Prototypes/_FarHorizons/Salvage/..., Resources/Locale/en-US/_FarHorizons/salvage/..., Resources/Textures/...
Define o componente, a mensagem de submissão, o sistema de validação, a janela cliente, o console prototipado e os recursos visuais/localizados.
Objetivo e geração da missão
Content.Server/_FarHorizons/Salvage/Objectives/..., Resources/Prototypes/_FarHorizons/Salvage/mission_objectives.yml, Resources/Prototypes/_FarHorizons/Salvage/objective_handlers.yml, Resources/Locale/*/procedural/mission_salvages.ftl
Gera corpos, papéis e códigos, configura consoles, anuncia e resolve a missão e registra seus parâmetros.
Dungeon Factory e salas
Resources/Maps/_FarHorizons/Dungeon/Factory/*, Resources/Prototypes/_FarHorizons/Procedural/Factory/*, Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml, Resources/Prototypes/_FarHorizons/Procedural/salvage_mods.yml, Resources/Prototypes/_FarHorizons/tags.yml
Adiciona mapas, salas, camadas procedurais, tabelas de entidades, seleção de biomas/dificuldades e tags da Factory.
Mobs de carne e divisão
Content.Shared/_FarHorizons/Mobs/*, Resources/Prototypes/_FarHorizons/Entities/Mobs/NPCs/dungeon_meat.yml, Resources/Prototypes/_FarHorizons/Procedural/salvage_factions.yml, Resources/Locale/en-US/_FarHorizons/salvage/dungeon_mob.ftl, Resources/Locale/pt-BR/_FarHorizons/salvage/misc/dungeon_mob_borg.ftl
Adiciona a configuração e o sistema de divisão de mobs, quatro protótipos de criaturas e a facção Meat.

Estimated code review effort: 5 (Critical) | ~120 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Player
  participant SalvageMissionDisarmWindow
  participant SalvageMissionDisarmBUI
  participant SalvageMissionDisarmConsoleSystem
  participant SalvageMissionDisarm
  Player->>SalvageMissionDisarmWindow: insere e envia o código
  SalvageMissionDisarmWindow->>SalvageMissionDisarmBUI: SubmitCodeCallback(code)
  SalvageMissionDisarmBUI->>SalvageMissionDisarmConsoleSystem: envia a mensagem de UI
  SalvageMissionDisarmConsoleSystem->>SalvageMissionDisarmConsoleSystem: valida e desarma o console
  SalvageMissionDisarm->>SalvageMissionDisarmConsoleSystem: configura console e código durante a criação do mapa
Loading

Suggested reviewers: isthesupern0va

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive O título é genérico e não destaca claramente a principal mudança da PR. Use um título específico, como "Adiciona dungeon Fábrica, missão Desarme e novo inimigo para Exploradores".
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed A descrição está relacionada às mudanças, mencionando a nova dungeon, a missão, o inimigo e a tradução.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 13

🧹 Nitpick comments (3)
Resources/Locale/pt-BR/_FarHorizons/salvage/misc/dungeon_mob_borg.ftl (1)

5-5: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Melhore a tradução do erro de programação.

Na área de desenvolvimento e programação, o termo correto e natural em português para a ação de "throw an exception" é "lançou uma exceção" ou "gerou uma exceção", e não "realizou".

📝 Sugestão de correção
-lines-borg-dungeon-5 = Erro 597: Scream() realizou uma exceção inesperada: módulo vocalizador é nulo.
+lines-borg-dungeon-5 = Erro 597: Scream() lançou uma exceção inesperada: módulo vocalizador é nulo.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Locale/pt-BR/_FarHorizons/salvage/misc/dungeon_mob_borg.ftl` at
line 5, Atualize a tradução de lines-borg-dungeon-5 para substituir “realizou
uma exceção” por uma formulação natural de programação em português, como
“lançou uma exceção” ou “gerou uma exceção”, mantendo o restante da mensagem
inalterado.
Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml (1)

78-86: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Considere renomear os presets genéricos.

O uso de presets como ReactorBox para a dungeon Factory funciona do ponto de vista funcional, mas sugere que os layouts são específicos do Reactor. Considere renomear esses protótipos para nomes mais genéricos (ex: DungeonBox) caso eles passem a ser compartilhados por múltiplas dungeons.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml` around
lines 78 - 86, Renomeie os presets genéricos ReactorBox, ReactorLong,
ReactorStar e ReactorDouble usados em PrefabDunGen para nomes neutros, como
DungeonBox, DungeonLong, DungeonStar e DungeonDouble, e atualize todas as
referências correspondentes nos protótipos para preservar o comportamento atual.
Content.Shared/_FarHorizons/Salvage/SalvageMissionDisarmConsoleSystem.cs (1)

31-38: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Valide o estado antes de processar o código.

É recomendável verificar se o console está ativado e armado antes de processar mensagens da interface, prevenindo que clientes maliciosos ou com lag enviem solicitações repetidas para um console já desarmado (o que acionaria o som de sucesso múltiplas vezes e executaria a lógica de fechamento novamente).

🛡️ Melhoria proposta
     private void OnSubmitCode(Entity<SalvageMissionDisarmConsoleComponent> ent, ref SalvageMissionDisarmSubmitCodeMessage args)
     {
+        if (!ent.Comp.Enabled || !ent.Comp.Armed)
+            return;
+
         if (args.Code != ent.Comp.Code)
         {
             _audio.PlayPvs(ent.Comp.FailSound, ent.Owner);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_FarHorizons/Salvage/SalvageMissionDisarmConsoleSystem.cs`
around lines 31 - 38, Atualize OnSubmitCode para validar, antes de comparar
args.Code ou executar qualquer lógica, que o console ainda está ativado e
armado. Retorne imediatamente quando o estado não permitir processamento,
preservando o fluxo atual apenas para consoles válidos e evitando sons ou
fechamento repetidos.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Content.Client/_FarHorizons/Salvage/SalvageMissionDisarmWindow.xaml.cs`:
- Around line 24-25: Atualize o predicado de validação de Input para aceitar
strings vazias e continuar validando valores não vazios como inteiros,
permitindo que o jogador apague completamente o conteúdo do campo.

In `@Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs`:
- Line 111: Atualize o fluxo de definição do conteúdo em SalvageMissionDisarm
para formatar code como string com zeros à esquerda antes de passá-lo à
localização salvage-mission-objective-disarm-paper, preservando o comprimento
fixo definido por CodeLength.
- Around line 80-88: Substitua o loop baseado em mapTransform.ChildEnumerator no
método que coleta os consoles por um
EntityQueryEnumerator<SalvageMissionDisarmConsoleComponent,
TransformComponent>(), filtrando cada entidade por TransformComponent.MapUid ==
Map. Adicione apenas os consoles que atendem a esse filtro, preservando a coleta
do UID e do componente SalvageMissionDisarmConsoleComponent.

In `@Content.Shared/_FarHorizons/Mobs/MobSplittingComponent.cs`:
- Line 15: Inicialize o campo SplitInto da classe MobSplittingComponent com um
dicionário vazio padrão, preservando a obrigatoriedade durante a desserialização
e evitando que o SharedMobSplittingSystem encontre um valor nulo quando o
componente for criado programaticamente.

In `@Content.Shared/_FarHorizons/Mobs/SharedMobSplittingSystem.cs`:
- Line 34: Atualize a chamada a _audio.PlayPredicted em SharedMobSplittingSystem
para usar args.Origin como o parâmetro user, mantendo ent.Owner como a
entidade-alvo e preservando os demais argumentos.
- Around line 47-49: Atualize o cálculo de throwTarget no
SharedMobSplittingSystem para multiplicar a direção aleatória por uma distância
aleatória limitada por ThrowRadius. Ao chamar _throw.TryThrow para
spawned.Value, habilite também o parâmetro opcional compensateFriction,
preservando o espalhamento dentro do raio configurado.

In
`@Content.Shared/_FarHorizons/Salvage/Components/SalvageMissionDisarmConsoleComponent.cs`:
- Around line 10-15: Mark SalvageMissionDisarmConsoleComponent as a networked
component with auto-generated component state, and mark only Enabled and Armed
with auto-generated networked-field attributes so their values synchronize to
clients. Leave Code unnetworked to prevent the disarm password from being
replicated.

In `@Content.Shared/_FarHorizons/Salvage/SalvageMissionDisarmConsoleSystem.cs`:
- Around line 45-57: Atualize SetupConsole para configurar Enabled, Armed e Code
após validar apenas o componente SalvageMissionDisarmConsoleComponent, sem
retornar antecipadamente pela ausência de AppearanceComponent. Atualize os dados
visuais somente quando AppearanceComponent estiver disponível e chame Dirty()
para notificar os clientes sobre o novo estado do componente.
- Around line 39-43: Após definir ent.Comp.Armed como false no fluxo de desarme
do console, chame Dirty() no componente correspondente para replicar a alteração
aos clientes. Preserve as atualizações existentes de aparência, áudio e UI.

In `@Resources/Locale/pt-BR/procedural/mission_salvages.ftl`:
- Around line 32-34: Adicione a chave de tradução pt-BR
`salvage-mission-objective-disarm-paper` no arquivo de traduções de salvamento,
correspondendo à entrada existente em inglês para o papel com os códigos de
desarme.

In `@Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml`:
- Around line 625-634: Remova uma entidade de cada par sobreposto em
factory_side_rooms.yml: exclua um dos UIDs 1021/1022 associados a
CableApcExtension em (17.5,27.5) e um dos UIDs 217/218 associados a TableGlass
em (6.5,22.5), preservando apenas uma entidade de cada par.

In `@Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml`:
- Around line 145-151: Na tabela de entidades AirlockMaint, substitua a entrada
filha AirlockExternal por AirlockMaint para que o acesso interno use o protótipo
de manutenção correto, preservando o restante da configuração.
- Around line 131-135: Corrija os valores de SouthWest, SouthEast, NorthWest e
NorthEast em pocketDecals para usar IDs de protótipos de decal existentes no
repositório, substituindo as quatro referências thincorner* inválidas e
preservando o mapeamento direcional.

---

Nitpick comments:
In `@Content.Shared/_FarHorizons/Salvage/SalvageMissionDisarmConsoleSystem.cs`:
- Around line 31-38: Atualize OnSubmitCode para validar, antes de comparar
args.Code ou executar qualquer lógica, que o console ainda está ativado e
armado. Retorne imediatamente quando o estado não permitir processamento,
preservando o fluxo atual apenas para consoles válidos e evitando sons ou
fechamento repetidos.

In `@Resources/Locale/pt-BR/_FarHorizons/salvage/misc/dungeon_mob_borg.ftl`:
- Line 5: Atualize a tradução de lines-borg-dungeon-5 para substituir “realizou
uma exceção” por uma formulação natural de programação em português, como
“lançou uma exceção” ou “gerou uma exceção”, mantendo o restante da mensagem
inalterado.

In `@Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml`:
- Around line 78-86: Renomeie os presets genéricos ReactorBox, ReactorLong,
ReactorStar e ReactorDouble usados em PrefabDunGen para nomes neutros, como
DungeonBox, DungeonLong, DungeonStar e DungeonDouble, e atualize todas as
referências correspondentes nos protótipos para preservar o comportamento atual.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 42165d52-3bef-4f91-aec7-cb5170eccad0

📥 Commits

Reviewing files that changed from the base of the PR and between 086c99c and 2096b55.

⛔ Files ignored due to path filters (3)
  • Resources/Textures/_Starlight/Structures/Machines/desktop_computers.rsi/computer.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Structures/Machines/desktop_computers.rsi/explosive.png is excluded by !**/*.png
  • Resources/Textures/_Starlight/Structures/Machines/desktop_computers.rsi/generic.png is excluded by !**/*.png
📒 Files selected for processing (29)
  • Content.Client/_FarHorizons/Salvage/SalvageMissionDisarmBUI.cs
  • Content.Client/_FarHorizons/Salvage/SalvageMissionDisarmWindow.xaml
  • Content.Client/_FarHorizons/Salvage/SalvageMissionDisarmWindow.xaml.cs
  • Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs
  • Content.Shared/_FarHorizons/Mobs/MobSplittingComponent.cs
  • Content.Shared/_FarHorizons/Mobs/SharedMobSplittingSystem.cs
  • Content.Shared/_FarHorizons/Salvage/Components/SalvageMissionDisarmConsoleComponent.cs
  • Content.Shared/_FarHorizons/Salvage/SalvageMissionDisarmConsoleSystem.cs
  • Resources/Locale/en-US/_FarHorizons/procedural/expeditions.ftl
  • Resources/Locale/en-US/_FarHorizons/salvage/dungeon_mob.ftl
  • Resources/Locale/en-US/_FarHorizons/salvage/dungeon_mob_borg.ftl
  • Resources/Locale/en-US/_FarHorizons/salvage/mission_objectives.ftl
  • Resources/Locale/en-US/_FarHorizons/salvage/mission_targets.ftl
  • Resources/Locale/pt-BR/_FarHorizons/salvage/misc/dungeon_mob_borg.ftl
  • Resources/Locale/pt-BR/procedural/mission_salvages.ftl
  • Resources/Maps/_FarHorizons/Dungeon/Factory/factory_main_rooms.yml
  • Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml
  • Resources/Prototypes/Procedural/dungeon_configs.yml
  • Resources/Prototypes/_FarHorizons/Entities/Mobs/NPCs/dungeon_meat.yml
  • Resources/Prototypes/_FarHorizons/Procedural/Factory/rooms_main.yml
  • Resources/Prototypes/_FarHorizons/Procedural/Factory/rooms_side.yml
  • Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml
  • Resources/Prototypes/_FarHorizons/Procedural/salvage_factions.yml
  • Resources/Prototypes/_FarHorizons/Procedural/salvage_mods.yml
  • Resources/Prototypes/_FarHorizons/Salvage/mission_objective_targets.yml
  • Resources/Prototypes/_FarHorizons/Salvage/mission_objectives.yml
  • Resources/Prototypes/_FarHorizons/Salvage/objective_handlers.yml
  • Resources/Prototypes/_FarHorizons/tags.yml
  • Resources/Textures/_Starlight/Structures/Machines/desktop_computers.rsi/meta.json
💤 Files with no reviewable changes (1)
  • Resources/Locale/en-US/_FarHorizons/salvage/dungeon_mob_borg.ftl

Comment on lines +80 to +88
var enumerator = mapTransform.ChildEnumerator;

while (enumerator.MoveNext(out var uid))
{
if (!EntMan.TryGetComponent<SalvageMissionDisarmConsoleComponent>(uid, out var console))
continue;

consoles.Add((uid, console));
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
ast-grep run --pattern 'EntMan.EntityQueryEnumerator<$_,$_>()'

Repository: Project-Dumont/Dumont-Station

Length of output: 167


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Localizar a missão e referências aos consoles/objetivos relacionados
rg -n "SalvageMissionDisarm|SalvageMissionDisarmConsoleComponent|DisarmConsole|salvage.*disarm" Content.Server Content.Shared Content.Client Resources -g '!**/bin/**' -g '!**/obj/**' || true

Repository: Project-Dumont/Dumont-Station

Length of output: 7637


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspecionar o arquivo citado no comentário e arquivos de protótipos próximos, sem executar código do repositório
file="Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs"
wc -l "$file"
sed -n '1,220p' "$file"

# Procurar definições de protótipos/entidades que indiquem a hierarquia usada pelo objetivo
rg -n "SalvageMissionDisarmConsoleComponent|ChildEnumerator|MapUid == Map|EntityQueryEnumerator<.*TransformComponent>|Salvage" Content.Server Content.Shared Resources -g '!**/bin/**' -g '!**/obj/**' || true

Repository: Project-Dumont/Dumont-Station

Length of output: 50386


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Verificar se outros objetivos usam enumeração por mapa ou por filhos em arquivos correlatos
rg -n "ChildEnumerator|EntityQueryEnumerator<.*TransformComponent>|MapUid == Map" Content.Server/_FarHorizons Content.Server -g '!**/bin/**' -g '!**/obj/**' || true

Repository: Project-Dumont/Dumont-Station

Length of output: 18924


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ler exatamente o handler e o protótipo do alvo de desarme para entender onde o console é parentado
sed -n '1,180p' Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs
printf '\n--- mission_objective_targets.yml ---\n'
sed -n '110,165p' Resources/Prototypes/_FarHorizons/Salvage/mission_objective_targets.yml
printf '\n--- SalvageMissionObjectiveHandler.cs ---\n'
sed -n '160,255p' Content.Server/_FarHorizons/Salvage/SalvageMissionObjectiveHandler.cs

Repository: Project-Dumont/Dumont-Station

Length of output: 9526


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Procurar o uso do tipo de protótipo ComputerSalvageMissionObjective para ver se o console fica em grid/map
rg -n "ComputerSalvageMissionObjective|SalvageMissionDisarmConsole|proto: .*SalvageMissionObjective" Resources/Maps/_FarHorizons Resources/Prototypes/_FarHorizons -g '!**/bin/**' -g '!**/obj/**' || true

Repository: Project-Dumont/Dumont-Station

Length of output: 1030


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ler os trechos relevantes do arquivo e do protótipo sem gerar saída excessiva
file="Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs"
proto="Resources/Prototypes/_FarHorizons/Salvage/mission_objective_targets.yml"

nl -ba "$file" | sed -n '1,160p'
printf '\n--- %s ---\n' "$proto"
nl -ba "$proto" | sed -n '118,155p'

Repository: Project-Dumont/Dumont-Station

Length of output: 207


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspecionar a colocação do alvo na mapfile para ver se fica como filho de grid
mapfile="Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml"
nl -ba "$mapfile" | sed -n '4385,4415p'

Repository: Project-Dumont/Dumont-Station

Length of output: 207


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ler os trechos exatos para fechar a análise
nl -ba Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs | sed -n '70,95p'
printf '\n---\n'
nl -ba Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml | sed -n '4388,4410p'

Repository: Project-Dumont/Dumont-Station

Length of output: 207


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ver o trecho da mapfile onde o objetivo é colocado e a hierarquia em volta
sed -n '4388,4412p' Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml

# Ver também se existe alguma ancoragem explícita/parent no alvo
sed -n '111,155p' Resources/Prototypes/_FarHorizons/Salvage/mission_objective_targets.yml

Repository: Project-Dumont/Dumont-Station

Length of output: 1757


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ler a função que coleta entidades marcadas para entender se ela depende da mesma suposição de hierarquia
sed -n '220,320p' Content.Server/_FarHorizons/Salvage/SalvageMissionObjectiveHandler.cs

Repository: Project-Dumont/Dumont-Station

Length of output: 3124


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Checar se o console de desarme é um item/máquina ancorada que tende a ser filho do grid
sed -n '1,220p' Content.Shared/_FarHorizons/Salvage/Components/SalvageMissionDisarmConsoleComponent.cs

Repository: Project-Dumont/Dumont-Station

Length of output: 1165


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Procurar padrões de spawning/parenting semelhantes usados para objetivos que ficam em grids
rg -n "SpawnAtPosition\\(|ChildEnumerator|GridUid ==|MapUid == Map" Content.Server/_FarHorizons/Salvage Content.Server/_FarHorizons -g '!**/bin/**' -g '!**/obj/**' || true

Repository: Project-Dumont/Dumont-Station

Length of output: 3480


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Ler contexto imediatamente antes/depois do protótipo para inferir o pai 1
sed -n '4368,4420p' Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml

Repository: Project-Dumont/Dumont-Station

Length of output: 1195


ChildEnumerator do mapa não alcança consoles em grids Como ComputerSalvageMissionObjective é BaseMachine e os objetos do mapa aparecem com parent: 1, esses consoles podem ficar no grid e nunca ser encontrados por esse loop. Use uma EntityQueryEnumerator<SalvageMissionDisarmConsoleComponent, TransformComponent>() filtrando por MapUid == Map.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs`
around lines 80 - 88, Substitua o loop baseado em mapTransform.ChildEnumerator
no método que coleta os consoles por um
EntityQueryEnumerator<SalvageMissionDisarmConsoleComponent,
TransformComponent>(), filtrando cada entidade por TransformComponent.MapUid ==
Map. Adicione apenas os consoles que atendem a esse filtro, preservando a coleta
do UID e do componente SalvageMissionDisarmConsoleComponent.


var code = GenerateCode();

paper.SetContent(spawnedPaper, Loc.GetString("salvage-mission-objective-disarm-paper", ("code", code)));

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Formate o código com zeros à esquerda no papel.

Como o código é gerado e armazenado como um inteiro (int), números com zeros à esquerda perderão a formatação (ex: um código gerado como 007 será exibido como 7). Para manter o comprimento fixo definido por CodeLength na exibição, converta-o para string aplicando o preenchimento (padding) adequado antes de enviar para a localização.

💡 Correção proposta
-            paper.SetContent(spawnedPaper, Loc.GetString("salvage-mission-objective-disarm-paper", ("code", code)));
+            paper.SetContent(spawnedPaper, Loc.GetString("salvage-mission-objective-disarm-paper", ("code", code.ToString($"D{CodeLength}"))));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
paper.SetContent(spawnedPaper, Loc.GetString("salvage-mission-objective-disarm-paper", ("code", code)));
paper.SetContent(spawnedPaper, Loc.GetString("salvage-mission-objective-disarm-paper", ("code", code.ToString($"D{CodeLength}"))));
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_FarHorizons/Salvage/Objectives/SalvageMissionDisarm.cs` at
line 111, Atualize o fluxo de definição do conteúdo em SalvageMissionDisarm para
formatar code como string com zeros à esquerda antes de passá-lo à localização
salvage-mission-objective-disarm-paper, preservando o comprimento fixo definido
por CodeLength.

[RegisterComponent, NetworkedComponent]
public sealed partial class MobSplittingComponent : Component
{
[DataField(required: true)] public Dictionary<EntProtoId, MobSplittingConfig> SplitInto;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Inicialize o dicionário para evitar NRE.

Embora o campo seja exigido (required: true) durante a desserialização dos protótipos, adicionar este componente programaticamente em tempo de execução deixará o dicionário nulo, o que causará uma NullReferenceException no loop do SharedMobSplittingSystem.

🛡️ Sugestão de correção
-    [DataField(required: true)] public Dictionary<EntProtoId, MobSplittingConfig> SplitInto;
+    [DataField(required: true)] public Dictionary<EntProtoId, MobSplittingConfig> SplitInto = new();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
[DataField(required: true)] public Dictionary<EntProtoId, MobSplittingConfig> SplitInto;
[DataField(required: true)] public Dictionary<EntProtoId, MobSplittingConfig> SplitInto = new();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_FarHorizons/Mobs/MobSplittingComponent.cs` at line 15,
Inicialize o campo SplitInto da classe MobSplittingComponent com um dicionário
vazio padrão, preservando a obrigatoriedade durante a desserialização e evitando
que o SharedMobSplittingSystem encontre um valor nulo quando o componente for
criado programaticamente.

TerminatingOrDeleted(ent))
return;

_audio.PlayPredicted(ent.Comp.Sound, ent.Owner, ent.Owner);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Corrija o parâmetro user para evitar áudio duplicado.

Ao usar ent.Owner (um NPC) como o parâmetro user no PlayPredicted, o servidor não conseguirá excluir a reprodução duplicada para o cliente que efetivamente causou a ação. Com base nos trechos de código relevantes, o evento fornece args.Origin, que representa a entidade responsável pela mudança de estado (o atacante) e é a escolha correta para a predição.

🐛 Sugestão de correção
-        _audio.PlayPredicted(ent.Comp.Sound, ent.Owner, ent.Owner);
+        _audio.PlayPredicted(ent.Comp.Sound, ent.Owner, args.Origin);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
_audio.PlayPredicted(ent.Comp.Sound, ent.Owner, ent.Owner);
_audio.PlayPredicted(ent.Comp.Sound, ent.Owner, args.Origin);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Shared/_FarHorizons/Mobs/SharedMobSplittingSystem.cs` at line 34,
Atualize a chamada a _audio.PlayPredicted em SharedMobSplittingSystem para usar
args.Origin como o parâmetro user, mantendo ent.Owner como a entidade-alvo e
preservando os demais argumentos.

Comment thread Resources/Locale/pt-BR/procedural/mission_salvages.ftl
Comment thread Resources/Maps/_FarHorizons/Dungeon/Factory/factory_side_rooms.yml
Comment thread Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml
Comment thread Resources/Prototypes/_FarHorizons/Procedural/dungeon_configs.yml
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.

3 participants