qq362946/fantasy/fantasy-net

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

This guide applies to development and code review for Fantasy / Fantasy.Net / Fantasy.Unity written in C#. Use it when a task involves Fantasy server code or Unity client code using Fantasy, ECS entities/components/systems, scenes and subscenes, FTask, network handlers/messages/protocols, Address or Roaming routing, Control Center and service discovery, Kubernetes deployment and Pod DNS binding, Namespace/WorldGroup/World isolation, dynamic Scene registration or routing, cross-server events and subscriptions, Fantasy.config, scene or database access, HTTP controllers/services, session or client connection logic, or distributed runtime architecture. It may also be used for Fantasy-related code review, troubleshooting, compliance checks, risk analysis, and best practices, even when the user does not explicitly mention Fantasy.

Install

npx vskill@latest install qq362946/fantasy/fantasy-net

SKILL.md

Fantasy-net

Fantasy is a high-performance C# distributed game server framework based on ECS architecture, using FTask for async operations.

Core Principles

Fantasy Technical Specifications
  • Use FTask for all async operations, not Task
  • Separate Entity data from logic (Handler/System); multi-assembly projects must separate to support hot reload
  • Name Component business extension classes {ComponentFullName}System; add a static {Domain}Helper only when other systems need a shared business entry point
  • All registration is done at compile-time by source generators; don't manually register, don't modify .g.cs
  • Entities, components, and Handlers use sealed class; all classes except structs must be created via Entity
  • Use file-scoped namespaces (namespace Fantasy;)
  • Use Log.Debug/Info/Error() for logging; return error codes via response.ErrorCode; business logic should not throw exceptions
  • Use Event system for module decoupling: publish events instead of direct calls; prefer Struct events (zero GC), use Entity events for complex logic; use EventSystem for sync, AsyncEventSystem for async
  • Name Event listeners {EventName}_{BusinessAction}, such as OnHpChange_ExitGame; never suffix them with System, Async, or Handler
  • When Control Center is enabled, use ServiceDiscovery for dynamic Root Scene and SubScene routing; keep strict account-to-node affinity in business storage rather than the service registry
  • Before planned Scene shutdown, call ServiceDiscovery.SetSceneOfflineAsync, reject new business allocations, wait one discovery cache cycle, then drain and close the Scene
  • Strictly follow SOLID principles
Development Behavioral Guidelines

Tradeoff: These guidelines bias toward caution over speed. For trivial tasks, use judgment.

See references/guidelines-examples.md for detailed Fantasy scenario examples.

1. Think Before Coding

Don't assume. Don't hide confusion. Surface tradeoffs.

Before implementing:

  • State your assumptions explicitly. If uncertain, ask.
  • If multiple interpretations exist, present them - don't pick silently.
  • If a simpler approach exists, say so. Push back when warranted.
  • If something is unclear, stop. Name what's confusing. Ask.

Fantasy Key Points: Before implementing, clarify: architecture pattern (single-server/distributed), Entity ownership (which Scene), communication method (Roaming/Address/SphereEvent), configuration source (local Fantasy.config or Control Center), and whether dynamic discovery or strict persistent affinity is required. When uncertain, ask; don't assume.

2. Simplicity First

Minimum code that solves the problem. Nothing speculative.

  • No features beyond what was asked.
  • No abstractions for single-use code.
  • No "flexibility" or "configurability" that wasn't requested.
  • No error handling for impossible scenarios.
  • If you write 200 lines and it could be 50, rewrite it.

Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.

Fantasy Key Points: Avoid premature abstraction of Entity/Component structures; don't design factory/strategy patterns for single scenarios. When users only need basic functionality, write Component + necessary AwakeSystem directly; refactor when extension is needed.

3. Surgical Changes

Touch only what you must. Clean up only your own mess.

When editing existing code:

  • Don't "improve" adjacent code, comments, or formatting.
  • Don't refactor things that aren't broken.
  • Match existing style, even if you'd do it differently.
  • If you notice unrelated dead code, mention it - don't delete it.

When your changes create orphans:

  • Remove imports/variables/functions that YOUR changes made unused.
  • Don't remove pre-existing dead code unless asked.

The test: Every changed line should trace directly to the user's request.

Fantasy Key Points: Never modify .g.cs generated files (if you find issues, modify source files and regenerate). Don't manually adjust source generator registration code. Don't "optimize" existing Entity/Component structures unless user explicitly requests refactoring.

4. Goal-Driven Execution

Define success criteria. Loop until verified.

Transform tasks into verifiable goals:

  • "Add validation" → "Write tests for invalid inputs, then make them pass"
  • "Fix the bug" → "Write a test that reproduces it, then make it pass"
  • "Refactor X" → "Ensure tests pass before and after"

For multi-step tasks, state a brief plan:

1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]

Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.

Fantasy Key Points: Define verifiable steps and criteria: protocol export (dotnet fantasy-export successfully generates .g.cs), compilation passes (dotnet build with no errors), Handler registration (check generated registration code), message flow (Log.Debug outputs key nodes, confirm request/response correctness).

Reference File Navigation

Read the corresponding file based on the requirement; for complex tasks, read multiple files.

FileWhen to Use
references/ecs/index.mdECS entry: routes to Scene / SubScene / Entity definition / component operations / object pool / lifecycle; shared by server and Unity; read this first when Entity definition, component management, or ECS mechanism selection is involved
references/review.mdFantasy code review entry: routes checks by ECS / Event / Timer / Protocol / Roaming / SphereEvent / HTTP / Database / Config; read this first when user wants review, code check, or Fantasy compliance verification
references/guidelines-examples.mdDevelopment behavioral guidelines Fantasy scenario examples: Think Before Coding (clarify assumptions), Simplicity First (avoid over-engineering), Surgical Changes (precise modifications), Goal-Driven Execution (verifiable goals) with detailed comparison cases; read when understanding guideline application in Fantasy, or when code review reveals guideline violations
references/ecs/scene.mdScene is the container and lifecycle boundary for all Entity/Component: cascade destruction when Scene disposes, OnCreateScene event, access system components via self.Scene (TimerComponent/EventComponent/NetworkMessagingComponent etc.); read when Scene concept, Scene initialization, OnCreateScene event, or Entity ownership is involved
references/ecs/ecs-check.mdECS review checklist: Entity / Component / System / Scene / object pool / lifecycle common issues; read when user wants to check ECS code for Fantasy compliance
references/ecs/entity-definition.mdEntity / Component definitions: fields, ComponentSystem naming, optional cross-system Helper, and lifecycle System selection; read when creating Entity / Component types
references/timer/index.mdTimer entry: routes to async wait / callback timers / event integration / best practices; read first when user needs delayed execution, repeated tasks, countdown, Wait, OnceTimer, RepeatedTimer
references/timer/implement.mdTimer implementation: FTask.Wait, WaitTill, WaitFrame, OnceTimer, RepeatedTimer, cancel timers; read only when directly writing Timer code
references/timer/event.mdTimer and Event integration: event-based timers, hot reload differences, when to use events instead of Action; read only when hot-reload-friendly Timer logic is needed
references/timer/best-practices.mdTimer best practices and troubleshooting: performance tips, common errors, Scene destruction, precision, cancel strategies; read only when optimizing or troubleshooting Timer code
references/ecs/subscene.mdSubScene dynamic child scenes: lightweight isolated spaces created at runtime from parent Scene, sharing parent Scene core components but with independent entity lists; Scene.CreateSubScene() callback and registration order, Control Center discovery by parent Address, Address messaging, and active offline on Close(); read when needing instances, match rooms, instanced maps, dynamic battlefields, player private spaces, or on-demand scene creation/destruction
references/ecs/lifecycle.mdECS lifecycle Systems: AwakeSystem, UpdateSystem, DestroySystem, DeserializeSystem, TransferOutSystem/TransferInSystem (cross-server transfer only) and trigger order; read when responding to Entity lifecycle events
references/event/index.mdEvent entry: determine whether to use EventAwaiter or Event, then follow Workflow to corresponding doc; read first when requirement involves "wait for result" or "publish event" mechanism selection
references/event/event-awaiter.mdEventAwaiter entry: routes to implementation / modeling / troubleshooting; read first when user needs to wait for a condition, wait for player action, do request-response async flow, or explicitly mentions EventAwaiter/EventAwaiterComponent
references/event/struct-event.mdStruct event full workflow: Step 1 define event → Step 2 create listener → Step 3 publish event; recommended for most scenarios, read when creating Struct events
references/event/entity-event.mdEntity event full workflow: Step 1 create listener → Step 2 publish existing Entity (note isDisposed param); read only when passing existing Entity
references/event/check-event.mdEvent system code review: Struct event checklist, Entity event checklist, listener naming, common error comparisons; read when checking existing event code
references/server/setup-server.mdCreate new Fantasy server project, integrate Fantasy into existing project (.NET/NuGet), three-layer structure setup, logging system quick config
references/server/entry-initialize-hook.mdEntry initialization hook: inject custom startup logic via IEntryInitializeHook after config loading but before serializer init; read when user needs pre-startup validation, additional config loading, environment-specific setup, or wants to execute logic before any Scene is created
references/server/entry-initialize-hook-check.mdEntry initialization hook review checklist: interface implementation, timing understanding, responsibility boundary, exception handling, Hook independence; read when user wants to check IEntryInitializeHook code
references/server/kubernetes.mdKubernetes deployment: StatefulSet Pod DNS, Headless Service, innerBindIP / outerBindIP, TCP/KCP protocol mapping, multi-replica and Control Center constraints; read first when Kubernetes, K8s, Pod, Service, container DNS, or cluster deployment is involved
references/unity/index.mdUnity client entry: routes to installation, connection, Session, receiving pushes; read first when Fantasy Unity client is involved
references/unity/unity-check.mdUnity review checklist: version consistency, compile macros, connection methods, Session usage, push Handler common issues; read when user wants to check Unity client code
references/unity/setup-unity.mdUnity client install Fantasy.Unity, configure compile symbols, import protocols; read only during installation or initial integration
references/unity/unity-connection.mdUnity client connect to server: FantasyRuntime component, scene.Connect, Runtime.Connect, protocol selection; read only during connection initialization
references/unity/unity-session.mdUnity client Session usage: send messages, RPC, connection holding, disconnect; read only for how to send messages after connection
references/logging.mdLogging system details: Fantasy.NLog setup, appId and per-Scene files, Develop/Release flush behavior, NLog.config, custom ILog implementation (Serilog etc.)
references/logging-check.mdLogging review c

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 95 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
1,297
Repository forks
201
7-day trend score
36

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/qq362946/fantasy/fantasy-net/badge)](https://verified-skill.com/skills/qq362946/fantasy/fantasy-net)

Something wrong with this skill or its page? Tell us.