Skip to content

Distributed pathfinding & misc. file improvements#4

Merged
Egezenn merged 7 commits into
Silkroad-Developer-Community:mainfrom
Egezenn:distributed-pathfinding
Apr 28, 2026
Merged

Distributed pathfinding & misc. file improvements#4
Egezenn merged 7 commits into
Silkroad-Developer-Community:mainfrom
Egezenn:distributed-pathfinding

Conversation

@Egezenn
Copy link
Copy Markdown
Member

@Egezenn Egezenn commented Apr 22, 2026

Implements a lightweight, graph-based navigation system using semantic node mapping and A* pathfinding when there's no walkscript to work with.

Creates a timestamped .rbs file as Data/Scripts/Dynamic/yyyy-mm-dd_hh-mm-ss.rbs. Shoots a linear line towards the Training target from the closest node (might collide. as the data isn't complete and there's no functionality to ignore objects, yet).

https://github.com/Egezenn/Silkroad-NavLink/blob/main/navigation_linkage.json

image

Thanks to Jelly's xSROMap, @kis1yi 's fork that has the necessary scripts to work with and @Day4Date 's Python API making the development of this much easier.

  "changelogs": {
    "0.1": {
      "description": "A very early initial release where most of the world map is incorporated & navigable. Dungeons, special areas, Alexandria and Baghdad aren't supported yet.",
      "date": "2026-04-23"
    }

A button is available on Training tabs Back to training subsection to refetch the data.

TODO:

  • Load function&button for the script recorder to easily extend on created scripts.
  • Cleaned up xSROMap for further development that can connect to RSBot via a Python plugin.

FURTHER:

  • Usage in other botbases?
  • Other areas
  • Dungeon workarounds

Summary by CodeRabbit

  • New Features

    • Dynamic walkback route generation when no manual walkback script is set.
    • "Update NavLink" button to refresh navigation data from the UI.
  • Chores

    • Build process now fetches and validates navigation data; improved build logging/behavior.
    • CI now enforces C# formatting checks.
  • Localization

    • Updated translations across many modules (Alchemy, Chat, General, Items, Party, Protection, Skills, Training, etc.) in multiple languages.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

Note

Reviews paused

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a NavigationManager subsystem for loading navigation linkage JSON, fetching remote updates, computing A*-style routes to training areas, and emitting dynamic .rbs walkback scripts; integrates generation into walkback checks, adds a UI “Update NavLink” button, and updates build/CI/editor configs plus many localization files.

Changes

Cohort / File(s) Summary
Configuration & CI
\.gitignore, .vscode/tasks.json, scripts/build.ps1, .github/workflows/pull_request.yml
Removes .vscode/ from .gitignore, adds a VS Code build task, streams MSBuild output and gates post-build actions on success, downloads navigation_linkage.json during build, and adds a csharpier formatting check in PR workflow.
Navigation Data Models
Library/RSBot.Core/Objects/NavigationLinkage.cs
Adds serializable models: NavigationLinkage, LinkageNode, and LinkageEdge for node/edge metadata used by runtime navigation.
Navigation System Core
Botbases/RSBot.Training/Bot/NavigationManager.cs
New internal NavigationManager with methods to load local linkage, fetch remote linkage safely, compute cached A*-like paths (region-aware heuristic, adjacency graph), and generate timestamped .rbs scripts from computed paths.
Integration & Workflow
Botbases/RSBot.Training/Bundle/Loop/LoopBundle.cs, Botbases/RSBot.Training/Views/Main.cs
LoopBundle: when walkback script is missing, attempts to compute/generate a dynamic RBS and assign it to config before invoking scripts. Main form: adds an “Update NavLink” button that calls remote fetch and shows temporary UI state.
Localization updates
Dependencies/Languages/... (multiple RSBot.*/*.rsl files)
Wide set of localization string additions and translations across modules (Alchemy, Chat, General, Items, Map, Party, Protection, Skills, Statistics, Training, etc.)—mostly UI text updates, new keys for fatigue/validation/messages, and added training-related labels.

Sequence Diagram

sequenceDiagram
    participant LoopBundle as LoopBundle
    participant NavMgr as NavigationManager
    participant Linkage as LinkageData
    participant RBSGen as RBSGenerator
    participant ScriptMgr as ScriptManager

    LoopBundle->>NavMgr: LoadLinkageData()
    NavMgr->>Linkage: Read/Deserialize navigation_linkage.json (local)
    alt remote update requested
        NavMgr->>Linkage: Fetch remote JSON -> atomic replace
    end
    LoopBundle->>NavMgr: CalculatePathToTrainingArea()
    Note over NavMgr: Map positions to semantic nodes\nBuild adjacency graph (add reverse walk edges)\nRun A*-like search (region-aware heuristic)
    NavMgr-->>LoopBundle: Ordered NodePathSteps (cached)
    LoopBundle->>RBSGen: GenerateRBSFile(cached path)
    RBSGen-->>LoopBundle: Timestamped .rbs file path
    LoopBundle->>ScriptMgr: Load & run .rbs script
    ScriptMgr-->>LoopBundle: Script executed / running
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 A little rabbit hops the map tonight,

Nodes and edges glimmer in soft light,
I fetch the links, I chart the way,
And script the path for bots to play,
Hooray — the training trail is bright!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Distributed pathfinding & misc. file improvements' accurately reflects the main changes: introduces a new NavigationManager for distributed pathfinding and updates numerous localization/configuration files.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

Copy link
Copy Markdown

@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

🧹 Nitpick comments (1)
Botbases/RSBot.Training/Bot/NavigationManager.cs (1)

30-49: Use the built-in PriorityQueue here.

The project targets net8.0-windows, so System.Collections.Generic.PriorityQueue is already available. This implementation re-sorts the entire list on every Enqueue, which makes A* slower on large maps for no real benefit.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 30 - 49,
Replace the custom inner PriorityQueue<TElement,TPriority> in
NavigationManager.cs with the BCL
System.Collections.Generic.PriorityQueue<TElement,TPriority>: remove the private
class and its backing List and Sort-based Enqueue/Dequeue, add a using for
System.Collections.Generic if missing, instantiate a PriorityQueue where the
custom type was used, and update uses of Count, Enqueue(element, priority) and
Dequeue() to call the built-in Count property, Enqueue, and Dequeue methods
(preserving the same generic element/priority types) so A* uses the efficient
heap-backed implementation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.vscode/tasks.json:
- Around line 5-17: The Build task uses the "Build" label and runs powershell
with "${workspaceFolder}/scripts/build.ps1" but the script redirects full output
to build.log and only echoes the last 100 lines, so the problemMatcher
"$msCompile" cannot see most compiler errors; either modify scripts/build.ps1 to
stream full stdout/stderr to the task (e.g., mirror output to both console and
build.log / implement a tee-style write) so VS Code receives the complete
compiler output, or remove/disable the "$msCompile" problemMatcher in the task
and document that users must inspect build.log; update the "Build" task args or
the script accordingly to ensure full output is emitted to the task runner for
parsing.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs`:
- Around line 18-20: The NavigationManager class has shared mutable state
(_linkage, _activePath and related metadata) accessed from multiple threads; add
thread synchronization by introducing a private static readonly object (e.g.,
_sync) and wrap all reads and writes to _linkage, _activePath and the metadata
fields inside lock(_sync) blocks (including in FetchRemoteLinkageData(), any
pathfinding/generate script methods, and public accessors) to prevent races and
NullReferenceExceptions; ensure any public methods that return these objects
either copy/clone the data while under lock or return read-only snapshots to
avoid exposing internal state without synchronization.
- Around line 73-90: LoadLinkageData currently only checks _linkage and
_linkage.Nodes but later accesses _linkage.Edges, causing crashes for payloads
missing edges; update LoadLinkageData to also validate _linkage.Edges (ensure
it's not null) before persisting metadata or calling Log.Notify, and if null log
an error (similar to the Nodes check) and return false so the malformed payload
fails cleanly; also guard any later uses of _linkage.Edges.Count or
_linkage.Edges.Values in this method (and in LogLinkageMetadata if it assumes
Edges exist) to avoid dereferencing a null collection.
- Around line 134-142: The current flow writes the downloaded JSON to
LinkagePath before validating it, risking loss of the last-good file; change the
flow in the method that updates linkage data so you first parse/validate the
downloaded json (e.g., attempt to deserialize into the expected model or use
JsonDocument.Parse) into a temporary variable, only on successful validation
write the json to LinkagePath, then set _linkage = null and return
LoadLinkageData(); if parsing/validation fails, log the error and do not
overwrite the existing file.

---

Nitpick comments:
In `@Botbases/RSBot.Training/Bot/NavigationManager.cs`:
- Around line 30-49: Replace the custom inner PriorityQueue<TElement,TPriority>
in NavigationManager.cs with the BCL
System.Collections.Generic.PriorityQueue<TElement,TPriority>: remove the private
class and its backing List and Sort-based Enqueue/Dequeue, add a using for
System.Collections.Generic if missing, instantiate a PriorityQueue where the
custom type was used, and update uses of Count, Enqueue(element, priority) and
Dequeue() to call the built-in Count property, Enqueue, and Dequeue methods
(preserving the same generic element/priority types) so A* uses the efficient
heap-backed implementation.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 27c9d36a-3799-4bc9-87ed-09aebfa132e0

📥 Commits

Reviewing files that changed from the base of the PR and between 5c2e47b and 0d3483f.

📒 Files selected for processing (7)
  • .gitignore
  • .vscode/tasks.json
  • Botbases/RSBot.Training/Bot/NavigationManager.cs
  • Botbases/RSBot.Training/Bundle/Loop/LoopBundle.cs
  • Botbases/RSBot.Training/Views/Main.cs
  • Library/RSBot.Core/Objects/NavigationLinkage.cs
  • scripts/build.ps1
💤 Files with no reviewable changes (1)
  • .gitignore

Comment thread .vscode/tasks.json
Comment thread Botbases/RSBot.Training/Bot/NavigationManager.cs Outdated
Comment thread Botbases/RSBot.Training/Bot/NavigationManager.cs Outdated
Comment thread Botbases/RSBot.Training/Bot/NavigationManager.cs
internal static class NavigationManager
{
private const string LinkageUrl =
"https://raw.githubusercontent.com/Egezenn/Silkroad-NavLink/refs/heads/main/navigation_linkage.json";
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

It is necessary to include the latest version of navigation_linkage.json in the release build so that users without access to GitHub can use this feature. It would be best to download the latest version automatically when the process starts, so that users don’t have to remember to click a button. Also, move the Egezenn repository to the organization so that we are not dependent on external sources.

Comment on lines +458 to +463
Text = "Update NavLink",
Size = new System.Drawing.Size(110, 23),
Location = new System.Drawing.Point(232, 27),
Color = System.Drawing.Color.Transparent,
Radius = 6,
ShadowDepth = 4F
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

The text does not fit within the button on screens set to 125% scale; the button itself does not fit within the interface; it needs to be added to the language packs.
Image

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Just did that via text, didn't go into VS preview cuz didn't have time / UI is going to get a refactor anyway.

Comment thread .gitignore

# Visual Studio 2015/2017 cache/options directory
.vs/
.vscode/
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

No need to add this folder to the repository

Comment thread .vscode/tasks.json
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

What is the purpose of this file? Local environment settings should not be included in the repository.

Copy link
Copy Markdown
Member Author

@Egezenn Egezenn Apr 28, 2026

Choose a reason for hiding this comment

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

It allows building via Ctrl+Shift+B just like in Visual Studio. Allows to just use a simple task runner interface where you don't need to remember commands etc. Works on any vscode fork.

Example:
Image
https://github.com/Egezenn/dota2-minify/tree/main/.vscode <- Also can configure LSPs and formatters recommend extensions debugger configs aswell. It lowers the barrier for entry significantly via being editor agnostic.
https://github.com/Egezenn/dota2-minify/blob/main/.vscode/tasks.json

This folder is nothing like .vs where Visual Studio dumps its index onto.

Egezenn added a commit to Silkroad-Developer-Community/GOVERNANCE that referenced this pull request Apr 28, 2026
- Also run formatter check on PRs
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (3)
Botbases/RSBot.Training/Bot/NavigationManager.cs (3)

138-142: ⚠️ Potential issue | 🟠 Major

Don't overwrite the last good linkage with unvalidated content.

This still persists whatever GitHub returns before checking that it parses and matches the expected schema. One HTML error page or truncated download replaces the working cache and breaks every later path calculation until the file is repaired.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 138 - 142, The
current logic writes GitHub's response straight to LinkagePath before
validating, risking corrupting the cached file; change the flow in the method
that writes the download (remove the direct File.WriteAllText(LinkagePath, json)
step) to first parse/validate the JSON against the expected schema (use the same
parsing/validation used by LoadLinkageData or a temporary parse routine), and
only after successful parse/validation atomically replace the existing file
(e.g., write to a temp file then move/replace LinkagePath) and then clear
_linkage and call LoadLinkageData(); ensure any parse/validation failures do not
touch the original LinkagePath.

73-89: ⚠️ Potential issue | 🟠 Major

Validate the payload before caching it.

Deserialize is assigned straight into _linkage, and only Nodes is checked. A payload with missing edges still blows up at Line 89, and any failed validation leaves _linkage non-null so the next call returns true at Line 57 with an invalid cache.

💾 Minimal fix
-            _linkage = JsonSerializer.Deserialize<NavigationLinkage>(json, options);
-
-            if (_linkage == null || _linkage.Nodes == null)
+            var linkage = JsonSerializer.Deserialize<NavigationLinkage>(json, options);
+
+            if (linkage?.Nodes == null || linkage.Edges == null)
             {
                 Log.Error("Failed to parse navigation linkage data.");
                 return false;
             }
+
+            _linkage = linkage;
 
             // Persist metadata
-            _linkageVersion = _linkage.Version;
-            _linkageDate = _linkage.Date;
-            _linkageCopyright = _linkage.Copyright;
-            _linkageLicense = _linkage.License;
-            _linkageMaintainer = _linkage.Maintainer;
-            _linkageContributors = _linkage.Contributors;
+            _linkageVersion = linkage.Version;
+            _linkageDate = linkage.Date;
+            _linkageCopyright = linkage.Copyright;
+            _linkageLicense = linkage.License;
+            _linkageMaintainer = linkage.Maintainer;
+            _linkageContributors = linkage.Contributors;
 
-            Log.Notify($"Loaded {_linkage.Nodes.Count} nodes and {_linkage.Edges.Count} edges.");
+            Log.Notify($"Loaded {linkage.Nodes.Count} nodes and {linkage.Edges.Count} edges.");
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 73 - 89,
Deserialize currently writes directly into _linkage and only checks Nodes, which
can leave _linkage populated with invalid data (missing Edges) and cause later
calls to treat the cache as valid; instead, deserialize into a local variable
(e.g., var linkage = JsonSerializer.Deserialize<NavigationLinkage>(...)) and
validate both linkage.Nodes and linkage.Edges (and null-check linkage itself)
before assigning to the field _linkage, only then persist metadata
(_linkageVersion, _linkageDate, _linkageCopyright, _linkageLicense,
_linkageMaintainer, _linkageContributors) and log the loaded counts; on
validation failure return false (and ensure _linkage remains null or unchanged).

19-28: ⚠️ Potential issue | 🔴 Critical

Synchronize the shared navigation state.

_linkage, _activePath, and the metadata fields are still mutated from multiple public methods without any locking. The refresh path can race with path calculation or RBS generation and leave another thread reading null or partially updated state.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 19 - 28, The
shared navigation state (_linkage, _activePath and metadata fields like
_linkageVersion/_linkageDate/_linkageCopyright/_linkageLicense/_linkageMaintainer/_linkageContributors)
is accessed and mutated from multiple public methods without synchronization;
add a dedicated static sync object (e.g., private static readonly object
_linkageLock or a ReaderWriterLockSlim) and wrap all reads and writes to those
fields in that lock so updates (in methods such as RefreshPath, CalculatePath,
GenerateRBS, ClearLinkage, and any getters) are atomic; when returning
_activePath return a defensive copy or a ReadOnlyCollection to avoid exposing
internal mutable state, and ensure any code that swaps _linkage or clears
metadata does so inside the same lock to prevent race conditions.
🧹 Nitpick comments (2)
.github/workflows/pull_request.yml (1)

30-33: Pin the CSharpier version to ensure deterministic CI formatting checks.

Line 32 installs csharpier without a version constraint, making CI non-deterministic. Upstream formatter updates can fail unrelated PRs. No .config/dotnet-tools.json manifest exists to override this.

Suggested fix
       - name: Run CSharpier
+        env:
+          CSHARPIER_VERSION: 0.28.7  # replace with your preferred stable version
         run: |
-          dotnet tool install -g csharpier
+          dotnet tool install -g csharpier --version $env:CSHARPIER_VERSION
           dotnet csharpier . --check
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/pull_request.yml around lines 30 - 33, The workflow step
"Run CSharpier" currently installs csharpier without a version (the line "dotnet
tool install -g csharpier") making CI non-deterministic; update this step to pin
a specific CSharpier version (e.g., add "--version <x.y.z>" to the "dotnet tool
install -g csharpier" invocation or ensure a dotnet-tools.json manifest is
committed and referenced) so that the subsequent "dotnet csharpier . --check"
runs a fixed formatter version.
Botbases/RSBot.Training/Bot/NavigationManager.cs (1)

30-49: Use System.Collections.Generic.PriorityQueue instead of the custom implementation.

The project targets net8.0-windows, where System.Collections.Generic.PriorityQueue<TElement, TPriority> is available in the base class library. The current custom implementation sorts the entire list on every Enqueue call, adding unnecessary O(n log n) overhead in the A* pathfinding hot path. Replace with the framework's implementation, which uses a more efficient heap-based approach.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 30 - 49,
Replace the custom PriorityQueue<TElement, TPriority> class with the built-in
System.Collections.Generic.PriorityQueue<TElement, TPriority>; update any usages
of the custom class (constructors, Count property, Enqueue, Dequeue) to use the
framework type and its API (Enqueue(element, priority), TryDequeue/Dequeue, and
Count) so the A* hot path uses the heap-based implementation instead of sorting
the list on every Enqueue; remove the custom class definition from
NavigationManager.cs and add a using for System.Collections.Generic if missing.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@scripts/build.ps1`:
- Around line 42-50: The script currently downloads navigation linkage directly
into $linkagePath without validating it; change the logic to treat the download
as best-effort by downloading to a temporary file (e.g., "$linkagePath.tmp")
inside a try/catch around Invoke-WebRequest, then attempt to parse the temp file
with ConvertFrom-Json to validate JSON; only replace/move the temp file to
$linkagePath if parsing succeeds, otherwise log a warning (Write-Warning) and
keep the existing file; ensure errors from Invoke-WebRequest are caught and
handled so a transient network failure does not overwrite or corrupt
.\Build\Data\navigation_linkage.json.

---

Duplicate comments:
In `@Botbases/RSBot.Training/Bot/NavigationManager.cs`:
- Around line 138-142: The current logic writes GitHub's response straight to
LinkagePath before validating, risking corrupting the cached file; change the
flow in the method that writes the download (remove the direct
File.WriteAllText(LinkagePath, json) step) to first parse/validate the JSON
against the expected schema (use the same parsing/validation used by
LoadLinkageData or a temporary parse routine), and only after successful
parse/validation atomically replace the existing file (e.g., write to a temp
file then move/replace LinkagePath) and then clear _linkage and call
LoadLinkageData(); ensure any parse/validation failures do not touch the
original LinkagePath.
- Around line 73-89: Deserialize currently writes directly into _linkage and
only checks Nodes, which can leave _linkage populated with invalid data (missing
Edges) and cause later calls to treat the cache as valid; instead, deserialize
into a local variable (e.g., var linkage =
JsonSerializer.Deserialize<NavigationLinkage>(...)) and validate both
linkage.Nodes and linkage.Edges (and null-check linkage itself) before assigning
to the field _linkage, only then persist metadata (_linkageVersion,
_linkageDate, _linkageCopyright, _linkageLicense, _linkageMaintainer,
_linkageContributors) and log the loaded counts; on validation failure return
false (and ensure _linkage remains null or unchanged).
- Around line 19-28: The shared navigation state (_linkage, _activePath and
metadata fields like
_linkageVersion/_linkageDate/_linkageCopyright/_linkageLicense/_linkageMaintainer/_linkageContributors)
is accessed and mutated from multiple public methods without synchronization;
add a dedicated static sync object (e.g., private static readonly object
_linkageLock or a ReaderWriterLockSlim) and wrap all reads and writes to those
fields in that lock so updates (in methods such as RefreshPath, CalculatePath,
GenerateRBS, ClearLinkage, and any getters) are atomic; when returning
_activePath return a defensive copy or a ReadOnlyCollection to avoid exposing
internal mutable state, and ensure any code that swaps _linkage or clears
metadata does so inside the same lock to prevent race conditions.

---

Nitpick comments:
In @.github/workflows/pull_request.yml:
- Around line 30-33: The workflow step "Run CSharpier" currently installs
csharpier without a version (the line "dotnet tool install -g csharpier") making
CI non-deterministic; update this step to pin a specific CSharpier version
(e.g., add "--version <x.y.z>" to the "dotnet tool install -g csharpier"
invocation or ensure a dotnet-tools.json manifest is committed and referenced)
so that the subsequent "dotnet csharpier . --check" runs a fixed formatter
version.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs`:
- Around line 30-49: Replace the custom PriorityQueue<TElement, TPriority> class
with the built-in System.Collections.Generic.PriorityQueue<TElement, TPriority>;
update any usages of the custom class (constructors, Count property, Enqueue,
Dequeue) to use the framework type and its API (Enqueue(element, priority),
TryDequeue/Dequeue, and Count) so the A* hot path uses the heap-based
implementation instead of sorting the list on every Enqueue; remove the custom
class definition from NavigationManager.cs and add a using for
System.Collections.Generic if missing.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c6d4eea5-ce12-42a1-8f7c-e2223fe1cb36

📥 Commits

Reviewing files that changed from the base of the PR and between 0d3483f and f09d2d9.

📒 Files selected for processing (3)
  • .github/workflows/pull_request.yml
  • Botbases/RSBot.Training/Bot/NavigationManager.cs
  • scripts/build.ps1

Comment thread scripts/build.ps1
Egezenn added 2 commits April 28, 2026 20:21
- Some were just literally copypasted and then never translated
- Some are hardcoded and don't even have a base english lang file
- Locks
- Safe downloads/memory
@Egezenn Egezenn changed the title Distributed pathfinding Distributed pathfinding & misc. file improvements Apr 28, 2026
Copy link
Copy Markdown

@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

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Dependencies/Languages/RSBot/de_DE.rsl (1)

47-53: ⚠️ Potential issue | 🟡 Minor

Translate the remaining training prompt.

ConfigureTrainingAreaBeforeStartBot is still in English, so German users will hit a mixed-language prompt in the training flow. Please localize that string too.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot/de_DE.rsl` around lines 47 - 53, The string
ConfigureTrainingAreaBeforeStartBot is still in English; replace its value with
a German translation (e.g., "Bitte konfiguriere den Trainingsbereich, bevor du
den Bot startest!") so the key ConfigureTrainingAreaBeforeStartBot is fully
localized like the other entries in the file.
🟡 Minor comments (24)
Dependencies/Languages/RSBot.Alchemy/es_ES.rsl-17-21 (1)

17-21: ⚠️ Potential issue | 🟡 Minor

Keep the enhancement/item terminology consistent.

These labels mix “Realce” and “Artículo”, while other strings in this file use “Mejorar” and “Artículo”/“Objeto”-style wording. That inconsistency makes the UI feel uneven; I’d normalize the terminology here.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Alchemy/es_ES.rsl` around lines 17 - 21, The
labels in the Alchemy Spanish resource are inconsistent: keys
RSBot.Alchemy.Main.GroupBox.lblOptLevelText,
RSBot.Alchemy.Main.GroupBox.lblItemSelection,
RSBot.Alchemy.Main.GroupBox.lblDegree,
RSBot.Alchemy.Main.GroupBox.lblDegreeText, and RSBot.Alchemy.Main.groupItem mix
“Realce” with “Artículo”; update these values to use the same terminology used
elsewhere in the file (e.g., replace “Realce” with “Mejorar” and standardize
“Artículo”/“Objeto” according to the project's chosen term) so all five entries
use the normalized wording and match other strings in the file.
Dependencies/Languages/RSBot.Alchemy/es_ES.rsl-3-3 (1)

3-3: ⚠️ Potential issue | 🟡 Minor

Tighten this translation for natural Spanish.

“Detente si 0 polvo de la suerte” reads awkwardly and may confuse users. Consider a clearer phrasing such as “Detente cuando el polvo de la suerte llegue a 0.”

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Alchemy/es_ES.rsl` at line 3, The translation
for the key
RSBot.Alchemy.Main.Panel.Panel.EnhanceSettingsView.checkStopLuckyPowder is
awkward; replace the current string "Detente si 0 polvo de la suerte" with a
clearer, natural Spanish phrase such as "Detente cuando el polvo de la suerte
llegue a 0." to improve readability and user understanding.
Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl-10-21 (1)

10-21: ⚠️ Potential issue | 🟡 Minor

Normalize the Arabic terminology for the magic/item labels.

البلوز on the magic tab/radio labels reads unclear in Arabic, and غرض is not the usual UI term for an item selector. Please align these with a consistent glossary term such as خيارات سحرية and عنصر/صنف so the panel labels feel native.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl` around lines 10 - 21, Replace
the non-native Arabic terms: change occurrences of "البلوز" used in
RSBot.Alchemy.Main.Panel.Panel.radioMagicOptions and
RSBot.Alchemy.Main.GroupBox.TabControl.tabMagicOptions to a normalized label
like "خيارات سحرية", and replace the item selector term "غرض" used in
RSBot.Alchemy.Main.GroupBox.lblItemSelection and RSBot.Alchemy.Main.groupItem
with the preferred UI term "عنصر" (or "صنف" if product uses that glossary).
Update the corresponding keys (radioMagicOptions, tabMagicOptions,
lblItemSelection, groupItem) so all panel/radio/tab/group labels are consistent
with the chosen glossary.
Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl-3-8 (1)

3-8: ⚠️ Potential issue | 🟡 Minor

Tighten the checkUseLuckyStones wording.

Most of these translations read fine, but استخدم الأحجار الكريمة لجلب الحظ is a bit too literal for UI copy. A shorter, more idiomatic term like أحجار الحظ would read cleaner.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl` around lines 3 - 8, Update
the Arabic string for
RSBot.Alchemy.Main.Panel.Panel.EnhanceSettingsView.checkUseLuckyStones to a
shorter, more idiomatic UI term (replace "استخدم الأحجار الكريمة لجلب الحظ" with
"أحجار الحظ") so the label reads cleaner and matches the style of the other keys
in the same block.
Dependencies/Languages/RSBot.Items/ar_AR.rsl-64-64 (1)

64-64: ⚠️ Potential issue | 🟡 Minor

Localize the remaining English weapon labels.

checkBow and checkAxe are still exposed in English, so the Arabic Items tab will render mixed-language filters.

Suggested translation updates
-RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBow="Bow"
+RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBow="قوس"
...
-RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkAxe="Axe"
+RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkAxe="فأس"

Also applies to: 73-73

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/ar_AR.rsl` at line 64, The Arabic
localization still contains English labels for the weapon filters: update the
values for the keys RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBow
and RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkAxe to their Arabic
translations so the Items tab displays consistently; locate those keys (and the
duplicate occurrence noted further down) in the ar_AR.rsl resource entries and
replace "Bow" and "Axe" with the appropriate Arabic strings, preserving the
exact key names and file encoding.
Dependencies/Languages/RSBot.Items/de_DE.rsl-24-29 (1)

24-29: ⚠️ Potential issue | 🟡 Minor

Use the in-game terms rather than literal translations.

A few of the new German labels read like generic phrasing instead of the UI terms the filter panel expects, especially for quest items, rare items, light armor, staff, and the “everything” toggle.

Suggested replacements
- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkQuest="Suche"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkQuest="Quest"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="Drucken (Sox)"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="Seltene Gegenstände (Sox)"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Licht"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Leicht"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Personal"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Stab"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkEverything="Packen Sie alles ein"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkEverything="Alles aufheben"

Also applies to: 42-67

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/de_DE.rsl` around lines 24 - 29, Replace
the literal German phrasing with the in-game UI terminology for the item filter
labels: update the resource keys
RSBot.Items.Main.TabControl.TabPage.GroupBox.checkQuestItems, .checkEverything,
.checkAllEquips, .checkPickupBlue (and similar keys in lines 42-67) to use the
established German game terms for "Questgegenstände", the in-game toggle text
for "Alles aufheben"/"Alles", the term for "Rarität"/"Seltene Gegenstände" or
the exact in-game word for rare items, and the correct wording for light
armor/staff as used elsewhere in the UI; keep the key names the same but change
the string values to match the canonical in-game German labels used across the
localization files so the filter panel recognizes them.
Dependencies/Languages/RSBot.Items/tr_TR.rsl-66-68 (1)

66-68: ⚠️ Potential issue | 🟡 Minor

Correct the staff weapon label.

checkStaff="Kadro" uses the wrong noun for a weapon filter. That will read as “staff/cadre” rather than the actual weapon type.

Suggested replacement
- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Kadro"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Asa"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/tr_TR.rsl` around lines 66 - 68, The
localization entry for the staff weapon filter is incorrect: update the value of
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff from "Kadro" to
the correct Turkish noun for staff (e.g., "Asa") so the weapon filter reads
properly; modify the string value in the RSBot.Items/tr_TR.rsl file where
checkStaff is defined.
Dependencies/Languages/RSBot.Items/es_ES.rsl-40-50 (1)

40-50: ⚠️ Potential issue | 🟡 Minor

Fix the mistranslated filter labels before merging.

Several updated strings are the wrong Spanish term for the underlying game concept, which will make the item filters misleading in the UI.

Suggested replacements
- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkChinese="Porcelana"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkChinese="China"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="Imprimir (Sox)"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="Artículos raros (Sox)"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Luz"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Ligero"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Personal"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Bastón"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkShield="Blindaje"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkShield="Escudo"

Also applies to: 68-75

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/es_ES.rsl` around lines 40 - 50, Several
filter labels are mistranslated; update the strings for the keys in this diff so
the UI shows correct Spanish terms: change
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkChinese from "Porcelana"
to "Chino" (or the agreed game-term for Chinese-origin items),
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkQuest from "Búsqueda" to
"Misión" (or "De misión"),
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems from
"Imprimir (Sox)" to a clear Spanish phrase like "Imprimible (SOX)" or the agreed
SOX wording, and RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight
from "Luz" to "Ligero" (if it denotes light-weight items); verify and correct
the same keys in the other block mentioned (lines 68-75) so both sections use
the consistent, game-accurate Spanish terms.
Dependencies/Languages/RSBot.Items/vn_VN.rsl-45-67 (1)

45-67: ⚠️ Potential issue | 🟡 Minor

Tighten the Vietnamese terminology for the filter labels.

A few of these strings are literal or incorrect translations and will look odd in the item/category filters, especially the rare-items, grade, light armor, head, and staff labels.

Suggested replacements
- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="In (Sox)"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems="Vật phẩm hiếm (Sox)"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.label3="Bằng cấp"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.label3="Cấp"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Ánh sáng"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight="Nhẹ"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkHead="Cái đầu"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkHead="Đầu"

- RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Nhân viên"
+ RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff="Trượng"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/vn_VN.rsl` around lines 45 - 67, The
Vietnamese labels contain awkward or literal translations; update the strings
for the listed keys to natural Vietnamese (replace label3 "Bằng cấp" -> "Cấp độ"
or "Hạng", checkBoxRareItems "In (Sox)" -> "Hiếm (SOX)", checkLight "Ánh sáng"
-> "Giáp nhẹ" or "Nhẹ", checkHead "Cái đầu" -> "Đầu" or "Mũ", checkStaff "Nhân
viên" -> "Gậy/Trượng", checkBow "Bow" -> "Cung", and consider improving
checkClothes "Quần áo" -> "Trang phục" for consistency). Edit the values for the
unique resource keys (e.g.,
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.label3, checkBoxRareItems,
checkLight, checkHead, checkStaff, checkBow, checkClothes) to these suggested
replacements so the filter UI reads naturally in Vietnamese.
Dependencies/Languages/RSBot.Protection/ar_AR.rsl-21-21 (1)

21-21: ⚠️ Potential issue | 🟡 Minor

Rephrase the attack-pet checkbox text.

The Arabic translation نمو الاستدعاء التلقائي والحيوانات الأليفة الأخرى has awkward word order and reads as a noun phrase rather than an action. Unlike the English ("Auto summon growth & fellow pet") and other languages (German: "Automatisch angreifendes Haustier beschwören", Spanish: "Invocar Mascota de Attack / Fellow"), the Arabic phrasing fails to convey that this checkbox controls an action the user can enable or disable.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Protection/ar_AR.rsl` at line 21, Replace the
awkward noun-phrase translation for
RSBot.Protection.Main.GroupBox.checkAutoSummonAttackPet with an actionable
Arabic phrasing that clearly indicates a toggle for auto-summoning the attack
and fellow pet; e.g., change to something like "تفعيل الاستدعاء التلقائي للحيوان
الهجومي والحيوان المرافق" or "استدعِ تلقائياً الحيوان الهجومي والحيوان المرافق"
to match the original intent and match wording used in other locales.
Dependencies/Languages/RSBot.Protection/es_ES.rsl-50-50 (1)

50-50: ⚠️ Potential issue | 🟡 Minor

Improve Spanish terminology for the run button.

The Spanish translation "Correr" (which literally means "to run" physically) is ambiguous for a UI button action. Use "Ejecutar" (a standard Spanish term for executing commands) or "Iniciar" (for starting actions) to match the button's actual function more clearly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Protection/es_ES.rsl` at line 50, The
translation for RSBot.Protection.Main.GroupBox.buttonRun uses "Correr", which is
ambiguous; update the string value to a more appropriate Spanish UI term such as
"Ejecutar" (or "Iniciar" if the action is a start) by replacing "Correr" with
the chosen term so the button label reads e.g.
RSBot.Protection.Main.GroupBox.buttonRun="Ejecutar".
Dependencies/Languages/RSBot.Protection/de_DE.rsl-44-50 (1)

44-50: ⚠️ Potential issue | 🟡 Minor

Resolve the duplicate key entry and adjust the button translation.

The key RSBot.Protection.Main.GroupBox.checkUseHPPotionsPlayer duplicates an earlier entry under RSBot.Protection.Main.groupHPMP.checkUseHPPotionsPlayer. Since the UI control is bound to groupHPMP, ensure only one localization key exists for this control. Additionally, Laufen (literal motion) is inappropriate for this action button; use Starten or Ausführen instead to match the button's function of launching stat point increases.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Protection/de_DE.rsl` around lines 44 - 50,
Remove the duplicate localization key by deleting
RSBot.Protection.Main.GroupBox.checkUseHPPotionsPlayer and ensure the UI uses
the existing RSBot.Protection.Main.groupHPMP.checkUseHPPotionsPlayer entry (keep
only the groupHPMP key); also update the button label
RSBot.Protection.Main.GroupBox.buttonRun value from "Laufen" to a more
appropriate action word such as "Starten" or "Ausführen" to reflect the
launch/start action.
Dependencies/Languages/RSBot.Protection/ar_AR.rsl-45-45 (1)

45-45: ⚠️ Potential issue | 🟡 Minor

Change button label from present tense to action form.

يجري (present tense: "is running") is inconsistent with button label conventions across the codebase. Use تشغيل (starting/running) or ابدأ (start) to match the action-oriented style of other button labels like استخدام (use).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Protection/ar_AR.rsl` at line 45, Update the
Arabic localization key RSBot.Protection.Main.GroupBox.buttonRun to an
action-oriented label instead of the present-tense "يجري"; replace its value
with "تشغيل" or "ابدأ" to match other button labels (e.g., "استخدام") so the UI
uses consistent imperative/action form for buttons.
Dependencies/Languages/RSBot.General/tr_TR.rsl-92-92 (1)

92-92: ⚠️ Potential issue | 🟡 Minor

Use the correct Turkish term for “clientless”.

Müşterisiz means “customerless,” which is not the intended UI label.

💬 Suggested fix
-GoClientlessMsgBoxTitle="Müşterisiz"
+GoClientlessMsgBoxTitle="İstemcisiz"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.General/tr_TR.rsl` at line 92, The translation
key GoClientlessMsgBoxTitle currently uses the incorrect term "Müşterisiz";
update its value to the correct Turkish computing term "İstemcisiz" (or
"İstemcisiz" without accent if your locale prefers) so the UI label means
"clientless" rather than "customerless"—locate GoClientlessMsgBoxTitle in the
RSBot.General tr_TR.rsl resource and replace the string value accordingly.
Dependencies/Languages/RSBot.General/es_ES.rsl-9-9 (1)

9-9: ⚠️ Potential issue | 🟡 Minor

Use a real Spanish action label here.

Opta por la prescindible is not a meaningful button label for this action.

💬 Suggested fix
-RSBot.General.Main.GroupBox.btnGoClientless="Opta por la prescindible"
+RSBot.General.Main.GroupBox.btnGoClientless="Cambiar a Clientless"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.General/es_ES.rsl` at line 9, The button label
RSBot.General.Main.GroupBox.btnGoClientless contains a non-meaningful Spanish
string; replace "Opta por la prescindible" with a clear, natural Spanish action
label such as "Iniciar sin cliente" or "Usar modo sin cliente" by updating the
value of RSBot.General.Main.GroupBox.btnGoClientless to the chosen phrase so the
UI shows a correct, user-friendly action name.
Dependencies/Languages/RSBot.General/vn_VN.rsl-92-92 (1)

92-92: ⚠️ Potential issue | 🟡 Minor

Fix the Vietnamese title translation.

Không có khách hàng means “without customers,” which is not the intended UI concept.

💬 Suggested fix
-GoClientlessMsgBoxTitle="Không có khách hàng"
+GoClientlessMsgBoxTitle="Clientless"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.General/vn_VN.rsl` at line 92, The Vietnamese UI
title string GoClientlessMsgBoxTitle currently reads "Không có khách hàng"
(means “without customers”); change its value to a correct translation for the
UI concept "No client" (for example replace with "Không có client" or "Không có
kết nối client") so the label reflects absence of a client/connection rather
than customers.
Dependencies/Languages/RSBot.Skills/vn_VN.rsl-35-36 (1)

35-36: ⚠️ Potential issue | 🟡 Minor

Replace placeholder-like remove button labels.

Using "r" for both remove buttons is hard to read in UI and looks accidental.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Skills/vn_VN.rsl` around lines 35 - 36, The two
entries RSBot.Skills.Main.TabControl.TabPage.GroupBox.btnRemoveAttackSkill and
RSBot.Skills.Main.TabControl.TabPage.GroupBox.btnRemoveBuffSkill currently use
the placeholder value "r"; update both to meaningful Vietnamese button labels
(e.g., "Xóa" or "Loại bỏ") so the UI is readable and not accidental, and ensure
the text matches the app's localization style and casing.
Dependencies/Languages/RSBot.Party/vn_VN.rsl-52-55 (1)

52-55: ⚠️ Potential issue | 🟡 Minor

Localize the command-help block to Vietnamese.

This section is still English, so the UI becomes mixed-language in this locale.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/vn_VN.rsl` around lines 52 - 55, Replace
the English help text in the resource key
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo with a Vietnamese
localization; update the value so the UI reads fully in Vietnamese (e.g., a
suggested translation: "Các lệnh chỉ dùng trong cửa sổ chat trong
game!\n\ntraceme: Gửi yêu cầu theo dõi đến người chơi\nsitdown: Gửi yêu cầu ngồi
xuống đến người chơi").
Dependencies/Languages/RSBot.Party/de_DE.rsl-52-55 (1)

52-55: ⚠️ Potential issue | 🟡 Minor

Translate remaining English strings in German locale.

These values are still English, resulting in inconsistent language presentation for de_DE users.

Also applies to: 104-104

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/de_DE.rsl` around lines 52 - 55, The
German locale still contains English text for
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo (and the similar
untranslated string referenced at the same file further down), so replace the
English value with a proper German translation; locate the resource key
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo and update its
value to a German string that conveys the same meaning (e.g., explain that these
commands are only for the in-game chat and translate the examples "traceme" and
"sitdown" to German descriptions), then search the file for any other
occurrences of the same English phrases (the other untranslated entry noted in
the comment) and translate them consistently as well.
Dependencies/Languages/RSBot.Party/tr_TR.rsl-62-63 (1)

62-63: ⚠️ Potential issue | 🟡 Minor

Fix min/max label consistency in level restriction group.

label1 as "Dakika" does not match the level-range context and reads as a unit mismatch.

💡 Suggested correction
 RSBot.Party.AutoFormParty.GroupBox.label2="Maks."
-RSBot.Party.AutoFormParty.GroupBox.label1="Dakika"
+RSBot.Party.AutoFormParty.GroupBox.label1="Min."
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/tr_TR.rsl` around lines 62 - 63, label1 is
incorrectly set to a time unit ("Dakika") while label2 is "Maks." for level
restrictions; update RSBot.Party.AutoFormParty.GroupBox.label1 to a matching
min/level term (e.g., "Min." or "Seviye Min.") so both labels are consistent
with the level-range context (refer to RSBot.Party.AutoFormParty.GroupBox.label1
and RSBot.Party.AutoFormParty.GroupBox.label2).
Botbases/RSBot.Training/Bot/NavigationManager.cs-421-423 (1)

421-423: ⚠️ Potential issue | 🟡 Minor

Timestamp precision can overwrite dynamic scripts generated in the same second.

Using second-level precision for filenames risks collisions and silent overwrite.

💡 Suggested change
-        var timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss");
+        var timestamp = DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss-fff");
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 421 - 423, The
current filename generation (variables timestamp, fileName, dynamicScriptsDir
using ScriptManager.InitialDirectory) uses second-level precision and can
collide; update the timestamp generation to use higher precision (e.g.,
DateTime.UtcNow with milliseconds or ticks) or append a short Guid
(Guid.NewGuid()) to the fileName to guarantee uniqueness (e.g., include ".fff"
or ticks or a GUID) while still writing to dynamicScriptsDir; keep using
ScriptManager.InitialDirectory and ensure the created filename preserves the
".rbs" extension.
Botbases/RSBot.Training/Bot/NavigationManager.cs-258-264 (1)

258-264: ⚠️ Potential issue | 🟡 Minor

Remove explicit GC.Collect() after path calculation.

While this operation is infrequent (only triggered during initialization when no walkback script exists), explicit garbage collection is generally discouraged. The .NET GC is designed to handle collection automatically, and the code already nulls _linkage to signal cleanup. Forcing a collection can introduce unnecessary pauses.

Suggested change
         lock (_linkageLock)
         {
             _activePath = path;
             _linkage = null; // Clear linkage data once path is cached to save memory
         }
-        GC.Collect();
 
         return true;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Botbases/RSBot.Training/Bot/NavigationManager.cs` around lines 258 - 264,
Remove the forced GC.Collect() call that follows setting _activePath and nulling
_linkage in NavigationManager; the GC should run automatically and nulling
_linkage already signals cleanup. Locate the block that locks on _linkageLock
and assigns _activePath = path and _linkage = null (look for variables
_activePath, _linkage, and _linkageLock) and delete the GC.Collect() invocation
that comes immediately after it; ensure no other code depends on an immediate
collection before merging.
Dependencies/Languages/RSBot.Party/ar_AR.rsl-1-1 (1)

1-1: ⚠️ Potential issue | 🟡 Minor

Use a group/party term here.

حزب reads as a political party in Arabic, so the module title will be misleading in the game UI. مجموعة or فريق would fit this screen better.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl` at line 1, The DisplayName
value "حزب" is misleading in Arabic; replace it with a game-appropriate group
term such as "مجموعة" or "فريق" by updating the DisplayName attribute
(DisplayName="حزب") to one of those alternatives so the UI shows a correct
group/party label.
Dependencies/Languages/RSBot.Skills/es_ES.rsl-44-44 (1)

44-44: ⚠️ Potential issue | 🟡 Minor

Use the buff term here, not “búfer.”

búfer reads as a technical buffer, not the Skills buffs section. This should match the rest of the locale and use mejoras or buffs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Skills/es_ES.rsl` at line 44, The translation
key RSBot.Skills.Main.TabControl.TabPage.groupBoxAdvancedBuff uses the incorrect
term "búfer"; update its value to use the game-appropriate term (e.g., "mejoras"
or "buffs") so it matches the rest of the locale — replace "Configuración
avanzada de búfer" with "Configuración avanzada de mejoras" (or "Configuración
avanzada de buffs") in the RSBot.Skills/es_ES.rsl resource.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Dependencies/Languages/RSBot.Items/ar_AR.rsl`:
- Around line 35-36: The "InputDialogContent" value currently contains a literal
newline which breaks the line-based .rsl parser; replace the multiline string
with a single-line string using the escape sequence \n (e.g., set
InputDialogContent="يرجى إدخال الكمية التى يجب ان يشتريها البوت\n للعنصر
المحدد") so the value is parsed correctly, and also provide Arabic translations
for the keys checkBow and checkAxe (replace their English labels with the
appropriate Arabic text) so those entries are not left untranslated.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl`:
- Around line 19-20: The translation for
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoExpAutoShare is incorrect
(it currently reads as “automatic sharing of expiration date”); update that
value to a correct Arabic phrase describing EXP (experience) sharing, for
example "مشاركة الخبرة تلقائيًا" or "مشاركة الخبرة (EXP) تلقائيًا", leaving
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoItemAutoShare untouched.
- Around line 45-47: The three Arabic captions are using off-domain words;
replace the values for RSBot.Party.Main.TabControl.tpAutoParty,
RSBot.Party.Main.TabControl.tpPartyMatching, and
RSBot.Party.Main.TabControl.tpPartyBuffing with consistent party/group
terminology used elsewhere (e.g., use "إدارة الفرقة" or "الفرقة التلقائية" for
auto party, "مطابقة الفرق" for party matching, and "تعزيز الفرقة" or "تدعيم
الفرقة" for party buffing) so they match the file's existing vocabulary and are
semantically correct.
- Around line 58-74: The Arabic translations in the AutoFormParty block are
incorrect; update the specific keys with proper game-localized terminology:
change RSBot.Party.AutoFormParty.GroupBox.cb_AutoReform from "إصلاح السيارات" to
"إصلاح تلقائي", change RSBot.Party.AutoFormParty.GroupBox.rbtn_Trade from "نقابة
العمال" to "نقابة التجار" (or "تجارة" if shorter), change
RSBot.Party.AutoFormParty.groupBox3 from "نوع الحفلة" to "نوع المجموعة", and
change RSBot.Party.AutoFormParty.gbObjective from "هدف الحزب" to "هدف المجموعة";
review nearby labels (e.g., label1/label2) for context and adjust wording to
natural Arabic where needed.

---

Outside diff comments:
In `@Dependencies/Languages/RSBot/de_DE.rsl`:
- Around line 47-53: The string ConfigureTrainingAreaBeforeStartBot is still in
English; replace its value with a German translation (e.g., "Bitte konfiguriere
den Trainingsbereich, bevor du den Bot startest!") so the key
ConfigureTrainingAreaBeforeStartBot is fully localized like the other entries in
the file.

---

Minor comments:
In `@Botbases/RSBot.Training/Bot/NavigationManager.cs`:
- Around line 421-423: The current filename generation (variables timestamp,
fileName, dynamicScriptsDir using ScriptManager.InitialDirectory) uses
second-level precision and can collide; update the timestamp generation to use
higher precision (e.g., DateTime.UtcNow with milliseconds or ticks) or append a
short Guid (Guid.NewGuid()) to the fileName to guarantee uniqueness (e.g.,
include ".fff" or ticks or a GUID) while still writing to dynamicScriptsDir;
keep using ScriptManager.InitialDirectory and ensure the created filename
preserves the ".rbs" extension.
- Around line 258-264: Remove the forced GC.Collect() call that follows setting
_activePath and nulling _linkage in NavigationManager; the GC should run
automatically and nulling _linkage already signals cleanup. Locate the block
that locks on _linkageLock and assigns _activePath = path and _linkage = null
(look for variables _activePath, _linkage, and _linkageLock) and delete the
GC.Collect() invocation that comes immediately after it; ensure no other code
depends on an immediate collection before merging.

In `@Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl`:
- Around line 10-21: Replace the non-native Arabic terms: change occurrences of
"البلوز" used in RSBot.Alchemy.Main.Panel.Panel.radioMagicOptions and
RSBot.Alchemy.Main.GroupBox.TabControl.tabMagicOptions to a normalized label
like "خيارات سحرية", and replace the item selector term "غرض" used in
RSBot.Alchemy.Main.GroupBox.lblItemSelection and RSBot.Alchemy.Main.groupItem
with the preferred UI term "عنصر" (or "صنف" if product uses that glossary).
Update the corresponding keys (radioMagicOptions, tabMagicOptions,
lblItemSelection, groupItem) so all panel/radio/tab/group labels are consistent
with the chosen glossary.
- Around line 3-8: Update the Arabic string for
RSBot.Alchemy.Main.Panel.Panel.EnhanceSettingsView.checkUseLuckyStones to a
shorter, more idiomatic UI term (replace "استخدم الأحجار الكريمة لجلب الحظ" with
"أحجار الحظ") so the label reads cleaner and matches the style of the other keys
in the same block.

In `@Dependencies/Languages/RSBot.Alchemy/es_ES.rsl`:
- Around line 17-21: The labels in the Alchemy Spanish resource are
inconsistent: keys RSBot.Alchemy.Main.GroupBox.lblOptLevelText,
RSBot.Alchemy.Main.GroupBox.lblItemSelection,
RSBot.Alchemy.Main.GroupBox.lblDegree,
RSBot.Alchemy.Main.GroupBox.lblDegreeText, and RSBot.Alchemy.Main.groupItem mix
“Realce” with “Artículo”; update these values to use the same terminology used
elsewhere in the file (e.g., replace “Realce” with “Mejorar” and standardize
“Artículo”/“Objeto” according to the project's chosen term) so all five entries
use the normalized wording and match other strings in the file.
- Line 3: The translation for the key
RSBot.Alchemy.Main.Panel.Panel.EnhanceSettingsView.checkStopLuckyPowder is
awkward; replace the current string "Detente si 0 polvo de la suerte" with a
clearer, natural Spanish phrase such as "Detente cuando el polvo de la suerte
llegue a 0." to improve readability and user understanding.

In `@Dependencies/Languages/RSBot.General/es_ES.rsl`:
- Line 9: The button label RSBot.General.Main.GroupBox.btnGoClientless contains
a non-meaningful Spanish string; replace "Opta por la prescindible" with a
clear, natural Spanish action label such as "Iniciar sin cliente" or "Usar modo
sin cliente" by updating the value of
RSBot.General.Main.GroupBox.btnGoClientless to the chosen phrase so the UI shows
a correct, user-friendly action name.

In `@Dependencies/Languages/RSBot.General/tr_TR.rsl`:
- Line 92: The translation key GoClientlessMsgBoxTitle currently uses the
incorrect term "Müşterisiz"; update its value to the correct Turkish computing
term "İstemcisiz" (or "İstemcisiz" without accent if your locale prefers) so the
UI label means "clientless" rather than "customerless"—locate
GoClientlessMsgBoxTitle in the RSBot.General tr_TR.rsl resource and replace the
string value accordingly.

In `@Dependencies/Languages/RSBot.General/vn_VN.rsl`:
- Line 92: The Vietnamese UI title string GoClientlessMsgBoxTitle currently
reads "Không có khách hàng" (means “without customers”); change its value to a
correct translation for the UI concept "No client" (for example replace with
"Không có client" or "Không có kết nối client") so the label reflects absence of
a client/connection rather than customers.

In `@Dependencies/Languages/RSBot.Items/ar_AR.rsl`:
- Line 64: The Arabic localization still contains English labels for the weapon
filters: update the values for the keys
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBow and
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkAxe to their Arabic
translations so the Items tab displays consistently; locate those keys (and the
duplicate occurrence noted further down) in the ar_AR.rsl resource entries and
replace "Bow" and "Axe" with the appropriate Arabic strings, preserving the
exact key names and file encoding.

In `@Dependencies/Languages/RSBot.Items/de_DE.rsl`:
- Around line 24-29: Replace the literal German phrasing with the in-game UI
terminology for the item filter labels: update the resource keys
RSBot.Items.Main.TabControl.TabPage.GroupBox.checkQuestItems, .checkEverything,
.checkAllEquips, .checkPickupBlue (and similar keys in lines 42-67) to use the
established German game terms for "Questgegenstände", the in-game toggle text
for "Alles aufheben"/"Alles", the term for "Rarität"/"Seltene Gegenstände" or
the exact in-game word for rare items, and the correct wording for light
armor/staff as used elsewhere in the UI; keep the key names the same but change
the string values to match the canonical in-game German labels used across the
localization files so the filter panel recognizes them.

In `@Dependencies/Languages/RSBot.Items/es_ES.rsl`:
- Around line 40-50: Several filter labels are mistranslated; update the strings
for the keys in this diff so the UI shows correct Spanish terms: change
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkChinese from "Porcelana"
to "Chino" (or the agreed game-term for Chinese-origin items),
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkQuest from "Búsqueda" to
"Misión" (or "De misión"),
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkBoxRareItems from
"Imprimir (Sox)" to a clear Spanish phrase like "Imprimible (SOX)" or the agreed
SOX wording, and RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkLight
from "Luz" to "Ligero" (if it denotes light-weight items); verify and correct
the same keys in the other block mentioned (lines 68-75) so both sections use
the consistent, game-accurate Spanish terms.

In `@Dependencies/Languages/RSBot.Items/tr_TR.rsl`:
- Around line 66-68: The localization entry for the staff weapon filter is
incorrect: update the value of
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.checkStaff from "Kadro" to
the correct Turkish noun for staff (e.g., "Asa") so the weapon filter reads
properly; modify the string value in the RSBot.Items/tr_TR.rsl file where
checkStaff is defined.

In `@Dependencies/Languages/RSBot.Items/vn_VN.rsl`:
- Around line 45-67: The Vietnamese labels contain awkward or literal
translations; update the strings for the listed keys to natural Vietnamese
(replace label3 "Bằng cấp" -> "Cấp độ" or "Hạng", checkBoxRareItems "In (Sox)"
-> "Hiếm (SOX)", checkLight "Ánh sáng" -> "Giáp nhẹ" or "Nhẹ", checkHead "Cái
đầu" -> "Đầu" or "Mũ", checkStaff "Nhân viên" -> "Gậy/Trượng", checkBow "Bow" ->
"Cung", and consider improving checkClothes "Quần áo" -> "Trang phục" for
consistency). Edit the values for the unique resource keys (e.g.,
RSBot.Items.Main.TabControl.TabPage.Panel.GroupBox.label3, checkBoxRareItems,
checkLight, checkHead, checkStaff, checkBow, checkClothes) to these suggested
replacements so the filter UI reads naturally in Vietnamese.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl`:
- Line 1: The DisplayName value "حزب" is misleading in Arabic; replace it with a
game-appropriate group term such as "مجموعة" or "فريق" by updating the
DisplayName attribute (DisplayName="حزب") to one of those alternatives so the UI
shows a correct group/party label.

In `@Dependencies/Languages/RSBot.Party/de_DE.rsl`:
- Around line 52-55: The German locale still contains English text for
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo (and the similar
untranslated string referenced at the same file further down), so replace the
English value with a proper German translation; locate the resource key
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo and update its
value to a German string that conveys the same meaning (e.g., explain that these
commands are only for the in-game chat and translate the examples "traceme" and
"sitdown" to German descriptions), then search the file for any other
occurrences of the same English phrases (the other untranslated entry noted in
the comment) and translate them consistently as well.

In `@Dependencies/Languages/RSBot.Party/tr_TR.rsl`:
- Around line 62-63: label1 is incorrectly set to a time unit ("Dakika") while
label2 is "Maks." for level restrictions; update
RSBot.Party.AutoFormParty.GroupBox.label1 to a matching min/level term (e.g.,
"Min." or "Seviye Min.") so both labels are consistent with the level-range
context (refer to RSBot.Party.AutoFormParty.GroupBox.label1 and
RSBot.Party.AutoFormParty.GroupBox.label2).

In `@Dependencies/Languages/RSBot.Party/vn_VN.rsl`:
- Around line 52-55: Replace the English help text in the resource key
RSBot.Party.Main.TabControl.TabPage.GroupBox.labelCommandsInfo with a Vietnamese
localization; update the value so the UI reads fully in Vietnamese (e.g., a
suggested translation: "Các lệnh chỉ dùng trong cửa sổ chat trong
game!\n\ntraceme: Gửi yêu cầu theo dõi đến người chơi\nsitdown: Gửi yêu cầu ngồi
xuống đến người chơi").

In `@Dependencies/Languages/RSBot.Protection/ar_AR.rsl`:
- Line 21: Replace the awkward noun-phrase translation for
RSBot.Protection.Main.GroupBox.checkAutoSummonAttackPet with an actionable
Arabic phrasing that clearly indicates a toggle for auto-summoning the attack
and fellow pet; e.g., change to something like "تفعيل الاستدعاء التلقائي للحيوان
الهجومي والحيوان المرافق" or "استدعِ تلقائياً الحيوان الهجومي والحيوان المرافق"
to match the original intent and match wording used in other locales.
- Line 45: Update the Arabic localization key
RSBot.Protection.Main.GroupBox.buttonRun to an action-oriented label instead of
the present-tense "يجري"; replace its value with "تشغيل" or "ابدأ" to match
other button labels (e.g., "استخدام") so the UI uses consistent
imperative/action form for buttons.

In `@Dependencies/Languages/RSBot.Protection/de_DE.rsl`:
- Around line 44-50: Remove the duplicate localization key by deleting
RSBot.Protection.Main.GroupBox.checkUseHPPotionsPlayer and ensure the UI uses
the existing RSBot.Protection.Main.groupHPMP.checkUseHPPotionsPlayer entry (keep
only the groupHPMP key); also update the button label
RSBot.Protection.Main.GroupBox.buttonRun value from "Laufen" to a more
appropriate action word such as "Starten" or "Ausführen" to reflect the
launch/start action.

In `@Dependencies/Languages/RSBot.Protection/es_ES.rsl`:
- Line 50: The translation for RSBot.Protection.Main.GroupBox.buttonRun uses
"Correr", which is ambiguous; update the string value to a more appropriate
Spanish UI term such as "Ejecutar" (or "Iniciar" if the action is a start) by
replacing "Correr" with the chosen term so the button label reads e.g.
RSBot.Protection.Main.GroupBox.buttonRun="Ejecutar".

In `@Dependencies/Languages/RSBot.Skills/es_ES.rsl`:
- Line 44: The translation key
RSBot.Skills.Main.TabControl.TabPage.groupBoxAdvancedBuff uses the incorrect
term "búfer"; update its value to use the game-appropriate term (e.g., "mejoras"
or "buffs") so it matches the rest of the locale — replace "Configuración
avanzada de búfer" with "Configuración avanzada de mejoras" (or "Configuración
avanzada de buffs") in the RSBot.Skills/es_ES.rsl resource.

In `@Dependencies/Languages/RSBot.Skills/vn_VN.rsl`:
- Around line 35-36: The two entries
RSBot.Skills.Main.TabControl.TabPage.GroupBox.btnRemoveAttackSkill and
RSBot.Skills.Main.TabControl.TabPage.GroupBox.btnRemoveBuffSkill currently use
the placeholder value "r"; update both to meaningful Vietnamese button labels
(e.g., "Xóa" or "Loại bỏ") so the UI is readable and not accidental, and ensure
the text matches the app's localization style and casing.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 5d9902cc-1f33-46ed-abd6-f5495393e0e2

📥 Commits

Reviewing files that changed from the base of the PR and between f09d2d9 and 95e6dc9.

📒 Files selected for processing (55)
  • .github/workflows/pull_request.yml
  • Botbases/RSBot.Training/Bot/NavigationManager.cs
  • Dependencies/Languages/RSBot.Alchemy/ar_AR.rsl
  • Dependencies/Languages/RSBot.Alchemy/de_DE.rsl
  • Dependencies/Languages/RSBot.Alchemy/es_ES.rsl
  • Dependencies/Languages/RSBot.Alchemy/tr_TR.rsl
  • Dependencies/Languages/RSBot.Alchemy/vn_VN.rsl
  • Dependencies/Languages/RSBot.Chat/ar_AR.rsl
  • Dependencies/Languages/RSBot.Chat/de_DE.rsl
  • Dependencies/Languages/RSBot.Chat/es_ES.rsl
  • Dependencies/Languages/RSBot.Chat/tr_TR.rsl
  • Dependencies/Languages/RSBot.General/ar_AR.rsl
  • Dependencies/Languages/RSBot.General/de_DE.rsl
  • Dependencies/Languages/RSBot.General/es_ES.rsl
  • Dependencies/Languages/RSBot.General/tr_TR.rsl
  • Dependencies/Languages/RSBot.General/vn_VN.rsl
  • Dependencies/Languages/RSBot.Inventory/ar_AR.rsl
  • Dependencies/Languages/RSBot.Items/ar_AR.rsl
  • Dependencies/Languages/RSBot.Items/de_DE.rsl
  • Dependencies/Languages/RSBot.Items/es_ES.rsl
  • Dependencies/Languages/RSBot.Items/tr_TR.rsl
  • Dependencies/Languages/RSBot.Items/vn_VN.rsl
  • Dependencies/Languages/RSBot.Log/de_DE.rsl
  • Dependencies/Languages/RSBot.Log/es_ES.rsl
  • Dependencies/Languages/RSBot.Log/tr_TR.rsl
  • Dependencies/Languages/RSBot.Log/vn_VN.rsl
  • Dependencies/Languages/RSBot.Map/ar_AR.rsl
  • Dependencies/Languages/RSBot.Map/es_ES.rsl
  • Dependencies/Languages/RSBot.Map/tr_TR.rsl
  • Dependencies/Languages/RSBot.Party/ar_AR.rsl
  • Dependencies/Languages/RSBot.Party/de_DE.rsl
  • Dependencies/Languages/RSBot.Party/es_ES.rsl
  • Dependencies/Languages/RSBot.Party/tr_TR.rsl
  • Dependencies/Languages/RSBot.Party/vn_VN.rsl
  • Dependencies/Languages/RSBot.Protection/ar_AR.rsl
  • Dependencies/Languages/RSBot.Protection/de_DE.rsl
  • Dependencies/Languages/RSBot.Protection/es_ES.rsl
  • Dependencies/Languages/RSBot.Protection/tr_TR.rsl
  • Dependencies/Languages/RSBot.Protection/vn_VN.rsl
  • Dependencies/Languages/RSBot.Skills/ar_AR.rsl
  • Dependencies/Languages/RSBot.Skills/de_DE.rsl
  • Dependencies/Languages/RSBot.Skills/es_ES.rsl
  • Dependencies/Languages/RSBot.Skills/tr_TR.rsl
  • Dependencies/Languages/RSBot.Skills/vn_VN.rsl
  • Dependencies/Languages/RSBot.Statistics/ar_AR.rsl
  • Dependencies/Languages/RSBot.Statistics/de_DE.rsl
  • Dependencies/Languages/RSBot.Training/ar_AR.rsl
  • Dependencies/Languages/RSBot.Training/de_DE.rsl
  • Dependencies/Languages/RSBot.Training/es_ES.rsl
  • Dependencies/Languages/RSBot.Training/tr_TR.rsl
  • Dependencies/Languages/RSBot.Training/vn_VN.rsl
  • Dependencies/Languages/RSBot/de_DE.rsl
  • Dependencies/Languages/RSBot/es_ES.rsl
  • Dependencies/Languages/RSBot/vn_VN.rsl
  • scripts/build.ps1
✅ Files skipped from review due to trivial changes (26)
  • Dependencies/Languages/RSBot.Log/es_ES.rsl
  • Dependencies/Languages/RSBot.Map/es_ES.rsl
  • Dependencies/Languages/RSBot.Map/ar_AR.rsl
  • Dependencies/Languages/RSBot.Log/vn_VN.rsl
  • Dependencies/Languages/RSBot.Training/es_ES.rsl
  • Dependencies/Languages/RSBot.Map/tr_TR.rsl
  • Dependencies/Languages/RSBot.Chat/de_DE.rsl
  • Dependencies/Languages/RSBot/vn_VN.rsl
  • Dependencies/Languages/RSBot.Chat/tr_TR.rsl
  • Dependencies/Languages/RSBot.Training/tr_TR.rsl
  • Dependencies/Languages/RSBot.Inventory/ar_AR.rsl
  • Dependencies/Languages/RSBot.Statistics/de_DE.rsl
  • Dependencies/Languages/RSBot.Training/vn_VN.rsl
  • Dependencies/Languages/RSBot.Log/de_DE.rsl
  • Dependencies/Languages/RSBot.Skills/de_DE.rsl
  • Dependencies/Languages/RSBot.Chat/es_ES.rsl
  • Dependencies/Languages/RSBot.Alchemy/vn_VN.rsl
  • Dependencies/Languages/RSBot.Alchemy/de_DE.rsl
  • Dependencies/Languages/RSBot/es_ES.rsl
  • Dependencies/Languages/RSBot.Statistics/ar_AR.rsl
  • Dependencies/Languages/RSBot.Alchemy/tr_TR.rsl
  • Dependencies/Languages/RSBot.Training/de_DE.rsl
  • Dependencies/Languages/RSBot.Training/ar_AR.rsl
  • Dependencies/Languages/RSBot.Chat/ar_AR.rsl
  • Dependencies/Languages/RSBot.Protection/tr_TR.rsl
  • Dependencies/Languages/RSBot.Log/tr_TR.rsl
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/pull_request.yml

Comment on lines +35 to 36
InputDialogContent="يرجى إدخال الكمية التى يجب ان يشتريها البوت
للعنصر المحدد"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

git ls-files | head -20

Repository: Silkroad-Developer-Community/RSBot

Length of output: 696


🏁 Script executed:

find . -name "*.rsl" -type f | head -10

Repository: Silkroad-Developer-Community/RSBot

Length of output: 559


🏁 Script executed:

cat -n "Dependencies/Languages/RSBot.Items/ar_AR.rsl" | head -80

Repository: Silkroad-Developer-Community/RSBot

Length of output: 5902


🏁 Script executed:

# Search for .rsl file parsing code or documentation
rg -i "\.rsl" --type-list | head -20

Repository: Silkroad-Developer-Community/RSBot

Length of output: 468


🏁 Script executed:

# Look for how multiline values are handled in resource files
rg "InputDialogContent" --type-list

Repository: Silkroad-Developer-Community/RSBot

Length of output: 468


🏁 Script executed:

# Search for other .rsl files and check their format
find . -name "*.rsl" -exec wc -l {} \;

Repository: Silkroad-Developer-Community/RSBot

Length of output: 4946


🏁 Script executed:

find . -name "*.cs" -o -name "*.cpp" -o -name "*.h" | xargs rg -l "\.rsl" | head -10

Repository: Silkroad-Developer-Community/RSBot

Length of output: 129


🏁 Script executed:

# Search for code that loads or parses .rsl files
rg -i "rsl|resource" --type cs | grep -i "load\|parse\|read" | head -20

Repository: Silkroad-Developer-Community/RSBot

Length of output: 940


🏁 Script executed:

# Look at the English version of the same file to see if multiline format is used there
cat -n "Dependencies/Languages/RSBot.Items/en_US.rsl" | grep -A 1 "InputDialogContent"

Repository: Silkroad-Developer-Community/RSBot

Length of output: 181


🏁 Script executed:

# Check other language versions to see if they use multiline format
for file in Dependencies/Languages/RSBot.Items/*.rsl; do
  echo "=== $file ==="
  grep -A 1 "InputDialogContent" "$file" || echo "Not found"
done

Repository: Silkroad-Developer-Community/RSBot

Length of output: 1152


🏁 Script executed:

# Search for any .rsl or resource loading code in the entire codebase
find . -type f \( -name "*.cs" -o -name "*.xaml" -o -name "*.xml" \) -exec grep -l "rsl\|ResourceManager\|XmlDocument" {} \; | head -20

Repository: Silkroad-Developer-Community/RSBot

Length of output: 609


🏁 Script executed:

cat -n "Library/RSBot.Core/Components/LanguageManager.cs"

Repository: Silkroad-Developer-Community/RSBot

Length of output: 10123


Use escape sequences for line breaks instead of literal newlines.

The .rsl parser is line-based and doesn't support multiline string values. Line 36 will be skipped entirely because it doesn't contain "=", resulting in an incomplete value. Use \n to preserve the intended formatting:

Suggested fix
InputDialogContent="يرجى إدخال الكمية التى يجب ان يشتريها البوت\n للعنصر المحدد"

Also translate the untranslated English labels at lines 64 (checkBow) and 73 (checkAxe).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Items/ar_AR.rsl` around lines 35 - 36, The
"InputDialogContent" value currently contains a literal newline which breaks the
line-based .rsl parser; replace the multiline string with a single-line string
using the escape sequence \n (e.g., set InputDialogContent="يرجى إدخال الكمية
التى يجب ان يشتريها البوت\n للعنصر المحدد") so the value is parsed correctly,
and also provide Arabic translations for the keys checkBow and checkAxe (replace
their English labels with the appropriate Arabic text) so those entries are not
left untranslated.

Comment on lines +19 to +20
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoItemAutoShare="مشاركة العنصر تلقائيًا"
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoExpAutoShare="مشاركة تلقائية لتاريخ انتهاء الصلاحية"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Fix the EXP-share translation.

مشاركة تلقائية لتاريخ انتهاء الصلاحية says “automatic sharing of expiration date,” which is unrelated to the EXP option. It should describe EXP sharing instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl` around lines 19 - 20, The
translation for
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoExpAutoShare is incorrect
(it currently reads as “automatic sharing of expiration date”); update that
value to a correct Arabic phrase describing EXP (experience) sharing, for
example "مشاركة الخبرة تلقائيًا" or "مشاركة الخبرة (EXP) تلقائيًا", leaving
RSBot.Party.Main.TabControl.TabPage.GroupBox.checkAutoItemAutoShare untouched.

Comment on lines +45 to +47
RSBot.Party.Main.TabControl.tpAutoParty="حفلة سيارات"
RSBot.Party.Main.TabControl.tpPartyMatching="التوفيق بين الأحزاب"
RSBot.Party.Main.TabControl.tpPartyBuffing="التلميع"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

These tab captions are off-domain.

حفلة سيارات, التوفيق بين الأحزاب, and التلميع are not understandable as party/buffing labels. Please rewrite them with the same group/party terminology used elsewhere in the file.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl` around lines 45 - 47, The three
Arabic captions are using off-domain words; replace the values for
RSBot.Party.Main.TabControl.tpAutoParty,
RSBot.Party.Main.TabControl.tpPartyMatching, and
RSBot.Party.Main.TabControl.tpPartyBuffing with consistent party/group
terminology used elsewhere (e.g., use "إدارة الفرقة" or "الفرقة التلقائية" for
auto party, "مطابقة الفرق" for party matching, and "تعزيز الفرقة" or "تدعيم
الفرقة" for party buffing) so they match the file's existing vocabulary and are
semantically correct.

Comment on lines +58 to +74
RSBot.Party.AutoFormParty.GroupBox.cb_AutoReform="إصلاح السيارات"
RSBot.Party.AutoFormParty.GroupBox.cb_AutoAccept="قبول تلقائي"
RSBot.Party.AutoFormParty.GroupBox.label_partytype2="مشاركة العناصر تلقائيًا"
RSBot.Party.AutoFormParty.GroupBox.label_partytype="مشاركة تلقائية"
RSBot.Party.AutoFormParty.GroupBox.label2="الأعلى."
RSBot.Party.AutoFormParty.GroupBox.label1="دقيقة."
RSBot.Party.AutoFormParty.GroupBox.rbtn_Thief="نقابة اللصوص"
RSBot.Party.AutoFormParty.GroupBox.rbtn_Trade="نقابة العمال"
RSBot.Party.AutoFormParty.GroupBox.rbtn_Quest="مهمة"
RSBot.Party.AutoFormParty.GroupBox.rbtn_Hunting="الصيد"
RSBot.Party.AutoFormParty.groupBox5="التكوين"
RSBot.Party.AutoFormParty.groupBox4="عنوان"
RSBot.Party.AutoFormParty.groupBox3="نوع الحفلة"
RSBot.Party.AutoFormParty.groupBox2="تقييد المستوى"
RSBot.Party.AutoFormParty.gbObjective="هدف الحزب"
RSBot.Party.AutoFormParty.btnCancel="يلغي"
RSBot.Party.AutoFormParty.btnAccept="يقبل"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

This AutoFormParty block needs a translation pass.

Several values are clearly mistranslated (إصلاح السيارات, نقابة العمال, نوع الحفلة, هدف الحزب), which will make the configuration page hard to understand.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dependencies/Languages/RSBot.Party/ar_AR.rsl` around lines 58 - 74, The
Arabic translations in the AutoFormParty block are incorrect; update the
specific keys with proper game-localized terminology: change
RSBot.Party.AutoFormParty.GroupBox.cb_AutoReform from "إصلاح السيارات" to "إصلاح
تلقائي", change RSBot.Party.AutoFormParty.GroupBox.rbtn_Trade from "نقابة
العمال" to "نقابة التجار" (or "تجارة" if shorter), change
RSBot.Party.AutoFormParty.groupBox3 from "نوع الحفلة" to "نوع المجموعة", and
change RSBot.Party.AutoFormParty.gbObjective from "هدف الحزب" to "هدف المجموعة";
review nearby labels (e.g., label1/label2) for context and adjust wording to
natural Arabic where needed.

@Egezenn
Copy link
Copy Markdown
Member Author

Egezenn commented Apr 28, 2026

@CodeRabbit pause

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 28, 2026

✅ Actions performed

Reviews paused.

@Egezenn Egezenn merged commit 7e10d01 into Silkroad-Developer-Community:main Apr 28, 2026
1 of 2 checks passed
This was referenced Apr 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants