Add a Metas tab that lists remote .met/.nav files, checks update status, and downloads with .bak backups on overwrite. Add an Auto Install Updates setting (default on) and guard settings usage during early startup to avoid initialization errors.
5.2 KiB
5.2 KiB
AGENTS.md
Guidance for coding agents working in MosswartMassacre (DECAL plugin).
See shared cross-repo guidance first: ../AGENTS.md.
Scope and architecture
- This repo is a C# plugin for Asheron's Call using DECAL + VirindiViewService.
- Main projects in solution
mossy.sln: MosswartMassacre/MosswartMassacre.csproj(primary plugin)MosswartMassacre.Loader/MosswartMassacre.Loader.csproj(loader)- Target framework is
.NET Framework 4.8(net48), x86 runtime expectations. - The plugin emits WebSocket events consumed by
MosswartOverlord.
Rule sources discovered
- Cursor rules: none found (
.cursor/rules/missing,.cursorrulesmissing). - Copilot rules: none found (
.github/copilot-instructions.mdmissing). - Follow cross-repo protocol rules in
../AGENTS.mdfor payload compatibility.
Build commands
Solution build
- Build Debug solution (recommended during development):
msbuild "mossy.sln" /p:Configuration=Debug /p:Platform="Any CPU"- Build Release solution:
msbuild "mossy.sln" /p:Configuration=Release /p:Platform="Any CPU"
Project build
- Build primary plugin project:
msbuild "MosswartMassacre/MosswartMassacre.csproj" /p:Configuration=Debug /p:Platform="AnyCPU"- Build loader project:
msbuild "MosswartMassacre.Loader/MosswartMassacre.Loader.csproj" /p:Configuration=Debug /p:Platform="AnyCPU"
Restore dependencies
- Legacy packages restore (when needed):
nuget restore "mossy.sln"- If package restore issues appear, verify
packages/andpackages.configstate.
Lint/format/test status
- No repository-wide C# linter/formatter config was found (
.editorconfig, StyleCop, dotnet-format config not present). - No automated unit/integration test project was found in this repo.
- Validation is primarily build + in-game runtime verification.
Single-test guidance (practical)
- Because no automated test suite exists, "single test" means targeted manual verification.
- Preferred single-scenario checks:
- Toggle one plugin command and validate behavior (example:
/mm telemetry on). - Trigger one event path (example: spawn or chat) and verify backend receives it.
- For backend-coupled checks, also tail backend logs in
MosswartOverlord.
Runtime/integration quick checks
- Verify plugin loads in DECAL and opens the VVS tabbed UI.
- Confirm settings persist per character via YAML file.
- Confirm WebSocket registration and periodic telemetry emission.
- Confirm one inventory/full-inventory or delta message reaches backend.
- Confirm no repeated event handler subscriptions after hot reload.
Important coupling points
- WebSocket endpoint currently defined in
MosswartMassacre/WebSocket.cs. - Shared secret header logic also in
MosswartMassacre/WebSocket.cs. - Event envelope fields and
typevalues must stay backend-compatible. - Avoid unilateral changes to JSON keys (
character_name, coords, timestamps, etc.).
Code style conventions observed
Language and formatting
- Use C# 8-compatible syntax; do not rely on newer language-only features.
- Use 4-space indentation and braces on new lines (existing style).
- Keep files UTF-8 and preserve existing BOM behavior where present.
- Keep methods focused; prefer extracting helpers over deeply nested blocks.
Imports/usings
- Group
usingstatements at top of file. - Order with
System*namespaces first, then third-party, then project namespaces. - Remove unused
usingdirectives when touching a file.
Naming and structure
- Public types/methods/properties:
PascalCase. - Local variables/private fields:
camelCase; private static fields commonly_prefixed. - Constants:
UPPER_SNAKE_CASEorPascalCaseaccording to existing file style. - Keep event handler names descriptive (
OnX,HandleX,..._LoginComplete).
Error handling and logging
- Guard plugin startup/shutdown with robust exception handling.
- For external boundaries (WebSocket, file I/O, DECAL hooks), catch and log failures.
- Prefer non-crashing failure behavior with clear in-chat or logger diagnostics.
- Preserve existing logging patterns (
IPluginLogger, plugin chat output) in touched files.
Concurrency and event safety
- Be careful with timers, event subscriptions, and hot-reload lifecycle.
- Always unsubscribe handlers during cleanup to prevent duplicate callbacks.
- Avoid blocking calls on game/UI event threads.
- Keep thread-affinity concerns explicit when interacting with UI/game APIs.
Settings and persistence
- Settings are YAML-backed and character-specific (
PluginSettings). - Preserve atomic save behavior (temp file + replace/move pattern).
- Add new settings as optional with safe defaults to keep backward compatibility.
Payload and API conventions
- Emit JSON with stable, snake_case field names expected by backend.
- Include ISO8601 timestamps and parseable coordinate values.
- Keep envelope
typevalues stable unless backend changes in same task. - Prefer additive changes (new optional fields) over renames/removals.
Repo hygiene for agents
- Keep edits minimal and task-scoped.
- Do not mass-reformat unrelated files.
- Document behavior changes in README or relevant docs when needed.
- If introducing new build/test tooling, add command docs to this file.