32 KiB
รายงานการวิเคราะห์สถาปัตยกรรมและการทำงานของ Reference C# AOT Server (Deep-Dive Technical Specification)
เอกสารอ้างอิงทางเทคนิคระดับลึกสำหรับวิศวกรซอฟต์แวร์และโมเดลปัญญาประดิษฐ์ (AI Systems)
วิเคราะห์จากซอร์สโค้ดของโครงการ: โครงสร้างสถาปัตยกรรมอ้างอิง C# .NET 10 (Reference Architecture)
ครอบคลุมสถาปัตยกรรม .NET 10, Roslyn Source Generators (NativeAOT), KcpSharp, SQLite/MySQL Storage Pipeline, Lua Client Injection, Calyx/FreeSR Scenario Injection, Muip GM API และโหมดเกมเวอร์ชันใหม่ (Apocalyptic Shadow, Divergent Universe, Currency War)
สารบัญ (Table of Contents)
- ภาพรวมสถาปัตยกรรมระดับสูง (High-Level Architecture & Tech Stack)
- การออกแบบ NativeAOT และ Roslyn Source Generators
- เลเยอร์เครือข่ายและการเข้ารหัสขั้นสูง (Network, KcpSharp & Crypto)
- 3.1 KcpSharp Transport และการจัดการบัฟเฟอร์ ArrayPool
- 3.2 Binary Packet Framing & Buffer Overflow Protection
- 3.3 Ec2b Key Derivation และ MT19937 XOR Key Pipeline
- กลไกการฉีดสคริปต์เข้าไคลเอนต์ (Client Lua Script Injection Engine)
- ระบบจัดเก็บข้อมูลและการจำลองฐานข้อมูล (Persistence & Database Pipeline)
- 5.1 Dual-Engine: SQLite & MySQL
- 5.2 In-Memory Dirty Cache & Asynchronous Periodic Flusher
- ระบบแคชทรัพยากรเกมความเร็วสูง (High-Speed Binary Resource Cache)
- ระบบการต่อสู้และการแทรกแซงสถานการณ์ (Battle & Calyx Override Engine)
- 7.1 ลูปการต่อสู้หลัก
- 7.2 Calyx Override & FreeSR JSON Scenario Injection
- ระบบโหมดการเล่นขั้นสูง (Modern End-Game Modes)
- 8.1 ChallengePeak (Apocalyptic Shadow & Anomaly Arbitration)
- 8.2 Divergent Universe & Unknowable Domain
- 8.3 Currency War & GridFight (Aetherium Wars)
- การจัดการระยะไกลและหน้าต่างควบคุม (Muip Protocol & Admin Dashboard)
- 9.1 Muip GM Protocol (RSA-Encrypted Remote Command Execution)
- 9.2 Built-in Embedded Web Admin & Registration Portal
- 9.3 Cluster Deployment via ServerExchange Secret
- [ตารางเปรียบเทียบเชิงลึก: LunarCore vs Reference C# AOT Server](#10-ตารางเปรียบเทียบเชิงลึก-lunarcore-vs-Reference C# AOT Server)
- คู่มือการต่อยอดเชิงวิศวกรรมสำหรับ AI (AI Implementation Guidelines)
1. ภาพรวมสถาปัตยกรรมระดับสูง (High-Level Architecture & Tech Stack)
Reference C# AOT Server เป็นโครงการ Server Reimplementation สำหรับเกม Honkai: Star Rail ที่เขียนขึ้นใหม่ทั้งหมดด้วยภาษา C# บน .NET 10 โดยมุ่งเน้นที่:
- ประสิทธิภาพสูงสุด (Extreme Performance): ลด Allocation ของหน่วยความจำผ่าน
Span<T>,Memory<T>,ArrayPool<byte>, และหลีกเลี่ยง Reflection - NativeAOT Readiness: คอมไพล์เป็นเนทีฟไบนารีเบ็ดเสร็จ (Single self-contained binary) ได้โดยไม่ต้องใช้ JIT Runtime
- ฟีเจอร์เวอร์ชันใหม่ (Modern Game Modes): รองรับคอนเทนต์เวอร์ชันใหม่ (2.x ถึง 4.x) เช่น Apocalyptic Shadow, Divergent Universe, Currency War, Penacony Clockie Dial, Critter Pick (Cat Cake Catch)
- ความสามารถในการปรับแต่ง (Developer & Testing Friendly): สามารถแทรกแซงการต่อสู้ผ่านไฟล์สคริปต์ FreeSR JSON (
CalyxOverrideManager) และมีระบบเว็บแอดมิน Dashboard ในตัว
โครงสร้างโมดูลย่อย (Solution Structure):
Program/: จุดเริ่มต้นเซิร์ฟเวอร์ (EntryPoint.cs), LifeCycle Management, CLI Console, การจัดการล็อกGameServer/: บริการเกม KCP, GameSession/Connection, ตัวจัดการเกม (50+ Game Managers), ตัวถอดรหัสแพ็กเก็ต (51 หมวดหมู่)WebServer/: ASP.NET Core Kestrel (Dispatch, Gateway, Muip API, Web Admin, Registration, SDK Shop)Command/: เครื่องมือคำสั่งเซิร์ฟเวอร์แบบ Compile-time RegistryCommon/: ตัวแบบข้อมูลหลัก, คอนฟิก, โมเดลฐานข้อมูล, รหัสข้อผิดพลาด และเครื่องมือยูทิลิตีKcpSharp/: ไคลเอนต์/เซิร์ฟเวอร์ KCP แบบ Pure C# Zero-allocationProto/: Google Protobuf C# Generated ClassesSourceGen/: C# Roslyn Incremental Source Generators สำหรับสร้างโค้ดแบบไร้ Reflection
flowchart TB
subgraph Client["HSR Game Client (PC / Android / iOS)"]
HTTPClient["HTTP/HTTPS Requests"]
KCPClient["KCP/UDP Traffic"]
end
subgraph Reference C# AOT Server[".NET 10 Server Architecture"]
subgraph WebServerModule["WebServer (ASP.NET Core Kestrel)"]
DispatchCtrl["DispatchRoutes (/query_dispatch)"]
GatewayCtrl["GateServerRoutes (/query_gateway)"]
AdminCtrl["AdminRoutes (Embedded Dashboard)"]
MuipCtrl["MuipServerRoutes (/muip/*)"]
ClusterCtrl["ServerExchangeRoutes (Distributed Sync)"]
end
subgraph KcpNetworkLayer["KCP Transport (KcpSharp)"]
KcpListener["Reference C# AOT ServerListener"]
Connection["Connection (ArrayPool & MT19937 Xor)"]
HandlerMgr["HandlerManager (Generated Registry)"]
end
subgraph GameplayEngine["Gameplay Engine & Services"]
PlayerInst["PlayerInstance"]
subgraph Managers["Player Subsystem Managers"]
AvatarMgr["AvatarManager & MultiPath"]
InvMgr["InventoryManager & Relic Generator"]
BattleMgr["BattleManager & FreeSR CalyxOverride"]
EndgameMgr["ChallengePeak (Apocalyptic Shadow)"]
RogueMgr["Divergent Universe / ChessRogue"]
end
end
subgraph StorageLayer["Data & Persistence Layer"]
ResCache["ResourceCache (MemoryPack + GZip)"]
DbHelper["DatabaseHelper (In-Memory Dirty Cache)"]
SQLite[("SQLite (.db)")]
MySQL[("MySQL Server")]
end
end
HTTPClient <-->|"REST / JSON"| WebServerModule
KCPClient <-->|"KCP UDP / Ec2b Framed Packets"| KcpListener
KcpListener --> Connection
Connection --> HandlerMgr
HandlerMgr --> PlayerInst
PlayerInst --> Managers
Managers --> DbHelper
DbHelper --> SQLite
DbHelper --> MySQL
Managers --> ResCache
2. การออกแบบ NativeAOT และ Roslyn Source Generators
หนึ่งในปัญหาใหญ่ของเซิร์ฟเวอร์เกมที่เขียนด้วย Java หรือ C# ทั่วไปคือการพึ่งพา Reflection อย่างหนัก (เช่น การสแกนหา @Opcodes, การสร้าง ORM mapping) ซึ่งทำให้:
- การบูตช้า
- กินแรมมาก
- คอมไพล์ NativeAOT ไม่ได้ เพราะ Reflection รันไทม์ถูกตัดทิ้ง (Trimmed)
Reference C# AOT Server แก้ปัญหานี้โดยสร้างคอมไพลเลอร์เสริม Roslyn Source Generator (SourceGen/):
flowchart LR
SourceCode["C# Entity & Handler Classes<br/>[Handler(CmdIds.PlayerLoginCsReq)]"] --> Roslyn["Roslyn Source Generator"]
Roslyn --> GeneratedCode["Generated C# Partial Classes<br/>- HandlerRegistry.g.cs<br/>- DatabaseStores.g.cs<br/>- CommandRegistry.g.cs"]
GeneratedCode --> NativeCompiler[".NET 10 NativeAOT Compiler"]
NativeCompiler --> NativeBinary["Single Native Executable<br/>(Zero Reflection / Instant Boot)"]
HandlerRegistryGenerator.cs:- ตรวจจับคลาสที่มีแอตทริบิวต์
[Handler(CmdIds....)]ในขณะคอมไพล์ - สร้างสวิตช์เคสหรืออาร์เรย์ Lookup โดยตรง (
HandlerRegistry.g.cs) เพื่อแมป Opcode เข้ากับ Concrete Handler Instance แบบ Zero-reflection
- ตรวจจับคลาสที่มีแอตทริบิวต์
DatabaseStoreGenerator.cs:- สร้างคลาส
EntityStores.g.csเพื่อจัดการ Table Creation, Insert, Update, Select สำหรับทั้ง SQLite และ MySQL ของแต่ละ Entity โดยตรง
- สร้างคลาส
CommandRegistryGenerator.cs:- ตรวจจับคำสั่งในโฟลเดอร์
Cmd/แล้วสร้างตารางแมปชื่อคำสั่ง (Labels & Aliases) ตอนคอมไพล์
- ตรวจจับคำสั่งในโฟลเดอร์
MemoryPackRegistrarGenerator.cs:- ลงทะเบียน Type Formatter ล่วงหน้าสำหรับ MemoryPack Binary Serializer
3. เลเยอร์เครือข่ายและการเข้ารหัสขั้นสูง (Network, KcpSharp & Crypto)
3.1 KcpSharp Transport และการจัดการบัฟเฟอร์ ArrayPool
Reference C# AOT Server ใช้ KcpSharp ซึ่งถูกปรับแต่งให้รันบน .NET 10:
- ในลูปรับข้อมูล
ReceiveLoop()มีการใช้ArrayPool<byte>.Shared.Rent(result.BytesReceived) - ข้อมูลที่ประมวลผลเสร็จแล้วจะถูก
ArrayPool<byte>.Shared.Return(buffer)คืนสู่พูลทันทีเพื่อป้องกันการจัดสรรแรมซ้ำซ้อน (Zero-Garbage Collection Pressure)
3.2 Binary Packet Framing & Buffer Overflow Protection
โครงสร้างแพ็กเก็ตอิงตามข้อกำหนดของตัวเกมจริง:
+-----------------------------------------------------------------------------------+
| Offset (Bytes) | Type | Field Name | Value / Description |
+-----------------------------------------------------------------------------------+
| 0x00 - 0x03 | uint32 BE | HEADER_CONST | 0x9D74C714 (Magic 1) |
| 0x04 - 0x05 | uint16 BE | Opcode / CmdId | เลขรหัสคำสั่ง (ushort) |
| 0x06 - 0x07 | uint16 BE | Header Length | ขนาดส่วนหัว (ushort) |
| 0x08 - 0x0B | uint32 BE | Payload Length | ขนาด Protobuf Payload (uint) |
| 0x0C - ... | byte[] | Header Bytes | ส่วนหัวแพ็กเก็ต |
| ... - ... | byte[] | Payload Bytes | ข้อมูล Protobuf |
| End - 4 | uint32 BE | TAIL_CONST | 0xD7A152C8 (Magic 2) |
+-----------------------------------------------------------------------------------+
Caution
การป้องกัน Memory Exhaustion Attack ใน BinaryReader (
Connection.cs):
BinaryReader.ReadBytes(n)ใน .NET จะจัดสรร Memory ตามค่าnที่อ่านได้ทันที หากไคลเอนต์ประสงค์ร้ายส่งค่าpayloadLengthสูงผิดปกติ (เช่น 2 GB) เซิร์ฟเวอร์จะเกิด Out-Of-Memory Crash ทันที
Reference C# AOT Server จึงเพิ่มระบบป้องกัน:var remaining = br.BaseStream.Length - br.BaseStream.Position; if (headerLength + (long)payloadLength > remaining) { Logger.Error("Bad Data Package: payloadLength exceeds remaining buffer"); return; }
3.3 Ec2b Key Derivation และ MT19937 XOR Key Pipeline
หากเปิดตัวเลือก UsePacketEncryption = true ในคอนฟิก:
- เซิร์ฟเวอร์จะโหลดหรือสร้างไฟล์คีย์
ClientSecretKey.ec2b(HEAD_MAGIC = 1647469381หรือ ASCII"Ec2b") - ตัวคีย์บรรจุ:
- 16 ไบต์คีย์หลัก (
Key) - 2048 ไบต์เวกเตอร์การถอดรหัส (
Data)
- 16 ไบต์คีย์หลัก (
- ตัวสร้างสุ่ม Mersenne Twister MT19937 (64-bit) ถูกนำมาใช้สร้างตาราง XOR Key ขนาด 4,096 ไบต์ (
Crypto.GenerateXorKey(seed)) - ทุกแพ็กเก็ตที่รับเข้าหรือส่งออกจะถูกทำการ XOR ด้วยตารางคีย์นี้
4. กลไกการฉีดสคริปต์เข้าไคลเอนต์ (Client Lua Script Injection Engine)
ฟีเจอร์เด่นของ Reference C# AOT Server คือการสื่อสารกับ Unity Client โดยตรงผ่านการส่งโค้ดภาษา Lua ผ่าน HandshakePacket ซึ่งไคลเอนต์เกมจะรันสคริปต์นี้บนตัวเครื่องโดยอัตโนมัติ:
1. ระบบ Watermark (BuildWatermarkLua):
เซิร์ฟเวอร์ส่งโค้ด Lua ไปค้นหา GameObject ของ Unity ในหน้าต่างเกม:
local function modify_texts()
local vGo = CS.UnityEngine.GameObject.Find("VersionText")
if vGo == nil then return end
local vt = vGo:GetComponent("Text")
vt.supportRichText = true
vt.text = "<color=#FEC6DF>Reference C# AOT Server</color> | UID: 10001"
vt.fontSize = 18
end
pcall(modify_texts)
ทำให้หน้าจอเกมแสดงชื่อเซิร์ฟเวอร์, UID, เวอร์ชัน หรือข้อความไล่เฉดสี (Color Gradient) โดยไม่ต้องแก้ไขไฟล์ตัวเกมของไคลเอนต์
2. ระบบจำลองสถานะเครือข่าย (NetStatusLua):
ส่งโค้ด Lua ไปควบคุมไอคอน Ping และแสดงค่า Latency คงที่ตามที่ตั้งไว้ในคอนฟิก
5. ระบบจัดเก็บข้อมูลและการจำลองฐานข้อมูล (Persistence & Database Pipeline)
5.1 Dual-Engine: SQLite & MySQL
Reference C# AOT Server รองรับทั้งฐานข้อมูลเดี่ยว (SQLite สำหรับ Local/Single-player) และฐานข้อมูลเซิร์ฟเวอร์ (MySQL สำหรับ Production):
- กำหนดใน
config.json\rightarrowDatabase.DatabaseType:"sqlite"หรือ"mysql" - ตารางทั้งหมดถูกสร้างขึ้นอัตโนมัติเมื่อเริ่มระบบผ่าน
EntityStores.Map.Values.EnsureTable(conn)
5.2 In-Memory Dirty Cache & Asynchronous Periodic Flusher
เพื่อลด I/O คอขวด Reference C# AOT Server ไม่เขียนข้อมูลลงดิสก์ทุกครั้งที่มีการเปลี่ยนไอเทม แต่ใช้สถาปัตยกรรม In-Memory Cache ร่วมกับ Dirty Tracking:
sequenceDiagram
autonumber
participant GameAction as Game Action (e.g. Add Item)
participant MemoryMap as UidInstanceMap (In-Memory)
participant DirtySet as DirtyUids (HashSet)
participant Flusher as SaveThread (Background Task)
participant Disk as SQLite / MySQL Database
GameAction->>MemoryMap: Update Entity Object in Memory
GameAction->>DirtySet: DatabaseHelper.MarkDirty(playerUid)
Note over MemoryMap,DirtySet: ผู้เล่นเล่นเกมต่อได้ทันที โดยไม่มี I/O Latency
loop ทุกๆ 1 วินาที (CalcSaveDatabase)
Flusher->>DirtySet: ดึงรายการ UIDs ที่มีการแก้ไข (DirtyLock)
Flusher->>MemoryMap: อ่าน Snapshot ข้อมูลของ UID นั้นๆ
Flusher->>Disk: ทำ Batch Transaction บันทึกลงฐานข้อมูล
Flusher->>DirtySet: ลบ UID ออกจาก DirtySet
end
Tip
NativeAOT Thread Safepoint Fix (
DatabaseHelper.cs):
ใน .NET 10 โค้ดที่รันวนลูปแน่น (Tight Loop) ภายใต้ NativeAOT จะไม่มีจุด Safepoint สำหรับ Garbage Collector ทำให้เกิดสภาวะ Deadlock
Reference C# AOT Server จึงใส่Thread.Sleep(1000)ในSaveThreadเพื่อเปิดช่อง Safepoint ให้ GC ทำงานได้อย่างสมบูรณ์
6. ระบบแคชทรัพยากรเกมความเร็วสูง (High-Speed Binary Resource Cache)
โดยทั่วไป เซิร์ฟเวอร์เกมต้องอ่านไฟล์ JSON นับร้อยไฟล์จาก ExcelOutput/ ซึ่งใช้เวลา 30 ถึง 60 วินาทีในทุกครั้งที่เปิดเครื่อง
Reference C# AOT Server แก้ปัญหานี้ด้วย ResourceCache.cs:
- First Boot (สร้างแคชครั้งแรก):
- อ่าน JSON จาก
Resources/ExcelOutput/และResources/ExcelOutputGameCore/ - รวบรวมข้อมูลลงใน
GameDataSnapshot - ทำ Serialization ด้วย
MemoryPackซึ่งเป็น Zero-allocation Binary Serializer - บีบอัดข้อมูลด้วย
GZipStream(CompressionLevel.Optimal)บันทึกเป็นไฟล์Config/Resource.bin(ขนาดประมาณ 20-30 MB)
- อ่าน JSON จาก
- Subsequent Boots (การบูตครั้งถัดไป):
- ตรวจสอบความถูกต้องของ Magic Header GZip (
0x1F 0x8B) - คลายการบีบอัดและคืนค่าเข้า
GameDataภายใน ไม่เกิน 1 วินาที
- ตรวจสอบความถูกต้องของ Magic Header GZip (
- Operator Hot-Reload สำหรับ Banners:
- ไฟล์
Banners.json(ตู้กาชาที่ผู้ดูแลปรับแต่งได้เอง) จะไม่ถูกรวมเข้าResource.binแต่จะถูกอ่านแยกสด เพื่อให้แก้ไขและเปิด/ปิดตู้กาชาได้ทันทีโดยไม่ต้องล้างแคชเกมใหม่
- ไฟล์
7. ระบบการต่อสู้และการแทรกแซงสถานการณ์ (Battle & Calyx Override Engine)
7.1 ลูปการต่อสู้หลัก
- เริ่มต้นจาก
BattleManager.StartBattle()เมื่อมี Technique Cast หรือมอนสเตอร์โจมตี - สร้าง
BattleInstanceซึ่งรวบรวม Wave มอนสเตอร์, เลเวลตัวละคร, MazeBuff (บัฟจุดอ่อนของธาตุที่โจมตี) - รองรับด่านหลากหลายรูปแบบ: Mainline, Cocoon (ฟาร์มของ), FarmElement, BattleCollege (บทเรียนการต่อสู้)
7.2 Calyx Override & FreeSR JSON Scenario Injection
ฟีเจอร์ระดับสูงที่สำคัญที่สุดใน Reference C# AOT Server คือ CalyxOverrideManager.cs และ FreesrShared.cs:
- ผู้พัฒนาสามารถใส่ไฟล์สถานการณ์จำลองในรูปแบบ FreeSR JSON ไว้ในไดเรกทอรี
Config/Json/*.json - เมื่อเปิดใช้งานผ่านคำสั่ง
/calyxหรือCalyxOverrideManager.Enable():- เซิร์ฟเวอร์จะดักจับการเข้าด่าน Calyx (ดอกไม้ฟาร์มเงิน/EXP) ในโลกเปิด
- แทนที่มอนสเตอร์และด่านเดิมของ Calyx ด้วยการต่อสู้ที่ระบุในไฟล์ FreeSR JSON ทันที
- สามารถสลับทีมตัวละคร (
TrySetLineupOverride), ปรับแต่งเลือดมอนสเตอร์เป็นรายตัวและรายเวฟ (TrySetMonsterHp) - ทำให้สามารถทดสอบบอสใหม่, มอนสเตอร์จากแพตช์ล่วงหน้า หรือจัด Challenge พิเศษได้โดยไม่ต้องแก้เกม
8. ระบบโหมดการเล่นขั้นสูง (Modern End-Game Modes)
Reference C# AOT Server เป็นหนึ่งในเซิร์ฟเวอร์ไม่กี่แห่งที่รองรับโหมดการเล่นระดับ Endgame ยุคใหม่ของ Honkai: Star Rail:
8.1 ChallengePeak (Apocalyptic Shadow & Anomaly Arbitration)
- ควบคุมผ่าน
ChallengePeakManager.cs - รองรับโหมด Apocalyptic Shadow (เงามายาแห่งกลียุค) และ Anomaly Arbitration
- จัดการบอสที่มีหลายเฟสและกลไกพิเศษ (เช่น บอสมีเกจ Toughness พิเศษ)
- รองรับการจัดทีมแบบ Tierce (ด่าน 3 เฟส/ทีมย่อย)
8.2 Divergent Universe & Unknowable Domain
- ควบคุมผ่าน
ChessRogueและRogueTourn(TournRoomGenerator) - จัดการระบบสมการ (Equations), ถ่วงน้ำหนักพร, Curio พิเศษ และวงล้อโชคชะตา
- รองรับห้องบันทึกการสังเคราะห์ (Archive Repository)
8.3 Currency War & GridFight (Aetherium Wars)
GridFightManager: จำลองระบบมินิเกมกระดานและการแข่งขันมอนสเตอร์ (Aetherium Wars)Currency War: จำลองเกมสงครามการเงิน มีระบบกระดาน, ซื้อ/ขายไอเทม และร้านค้าในมินิเกม
9. การจัดการระยะไกลและหน้าต่างควบคุม (Muip Protocol & Admin Dashboard)
9.1 Muip GM Protocol (RSA-Encrypted Remote Command Execution)
Reference C# AOT Server พัฒนาระบบ Muip (Management User Interface Protocol) เพื่อให้แอปพลิเคชันภายนอก, Bot Discord หรือเว็บแอดมิน ติดต่อสั่งการเซิร์ฟเวอร์ได้อย่างปลอดภัยผ่านการเข้ารหัส RSA Public/Private Key (PKCS#1):
POST /muip/create_session:- เซิร์ฟเวอร์สร้าง RSA Keypair และส่ง
rsaPublicKeyพร้อมsessionIdกลับมา (มีอายุจำกัด)
- เซิร์ฟเวอร์สร้าง RSA Keypair และส่ง
POST /muip/auth_admin:- ไคลเอนต์ส่ง
admin_keyที่ถูกเข้ารหัสด้วยrsaPublicKeyเพื่อยืนยันสิทธิ์ผู้ดูแล
- ไคลเอนต์ส่ง
POST /muip/exec_cmd:- ส่งคำสั่งเกม (เช่น
/give 1001 x1) ที่เข้ารหัสด้วย RSA พร้อมระบุTargetUidเซิร์ฟเวอร์ถอดรหัสและรันคำสั่งทันที
- ส่งคำสั่งเกม (เช่น
GET /muip/server_information&/muip/player_information:- ขอข้อมูลสถิติเซิร์ฟเวอร์ (RAM, ผู้เล่นออนไลน์) และข้อมูลไอดีผู้เล่น
9.2 Built-in Embedded Web Admin & Registration Portal
- ไม่จำเป็นต้องเปิด Web Server แยกต่างหาก เพราะ WebServer ของ Reference C# AOT Server มีเว็บ Dashboard ในตัว
- เขียนด้วย Embedded HTML/CSS/JS (
AdminPageRenderer.cs,AdminPageScripts.cs) - มีหน้าระบบลงทะเบียนผู้เล่น (
RegistrationPage.cs), หน้ารีเซ็ตรหัสผ่านผ่านอีเมล (PasswordForgotPage.cs,AccountEmailSender.cs), และหน้าจัดการไอดี
9.3 Cluster Deployment via ServerExchange Secret
- รองรับการแยกรัน Dispatch Server และ Game Server บนเครื่องเซิร์ฟเวอร์คนละเครื่อง
- สื่อสารระหว่างโหนดผ่าน
/get_account_infoและ/validate_account_tokenโดยยืนยันความปลอดภัยผ่าน HTTP HeaderX-Reference C# AOT Server-Server-Secretตรวจสอบความเท่ากันแบบคงเวลา (FixedTimeEquals) เพื่อป้องกัน Timing Attack
10. ตารางเปรียบเทียบเชิงลึก: LunarCore vs Reference C# AOT Server
| มิติการเปรียบเทียบ | LunarCore (Melledy) | Reference C# AOT Server (Reference Author) |
|---|---|---|
| ภาษาและรันไทม์ | Java 17+ (Gradle / JVM) | C# (.NET 10 SDK) |
| สถาปัตยกรรมประสิทธิภาพ | Reflection รันไทม์, Quickbuf Proto | Roslyn Source Generators, NativeAOT, MemoryPack |
| เครือข่าย UDP/KCP | Java KCP (Netty UDP Channel) | KcpSharp (Pure C# Zero-alloc + ArrayPool) |
| การเข้ารหัสทราฟฟิก | XOR แบบธรรมดา (ปิดไว้เป็นค่าตั้งต้น) | รองรับ Ec2b Key Derivation + MT19937 XOR 4KB |
| การเก็บข้อมูล (Storage) | MongoDB (ภายนอก) หรือ H2 Mongo (ภายใน) | SQLite และ MySQL (In-Memory Dirty Flusher) |
| การแคชทรัพยากรเกม | โหลดไฟล์ JSON สดทุกครั้งที่เปิด (~15-30 วิ) | Resource.bin (MemoryPack + GZip) บูต < 1 วินาที |
| การฉีดโค้ดสู่ไคลเอนต์ | ไม่มี | Server-Pushed Lua Injection (Watermark, Ping UI) |
| เครื่องมือทดสอบการต่อสู้ | ผ่านคำสั่ง /spawn และ Stage IDs ปกติ |
Calyx Override + FreeSR JSON Scenario Injection |
| โหมดเกมที่รองรับ | พื้นฐาน: MoC, Pure Fiction, SU ปกติ | ขั้นสูง: Apocalyptic Shadow, Divergent Universe, Currency War, Aetherium Wars |
| ระบบบริหารจัดการ (GM/Web) | คอนโซล และ แชตในเกมผ่านบอท UID 99 | Muip RSA API, Web Admin Dashboard, Web Registration |
11. คู่มือการต่อยอดเชิงวิศวกรรมสำหรับ AI (AI Implementation Guidelines)
หากโมเดล AI อื่นต้องการสร้างส่วนต่อขยาย, แก้บั๊ก หรือเขียนตัวแปลงโปรโตคอลสำหรับ Reference C# AOT Server:
- อย่าใช้ Reflection สำหรับ Handler และ Database Store:
ต้องใช้ระบบ Source Generator เสมอ หากเพิ่ม Entity ใหม่ ให้สร้างคลาสที่สืบทอดจากBaseDatabaseDataHelperเพื่อให้DatabaseStoreGeneratorสร้างโค้ด SQL ตารางและการแมปให้อัตโนมัติ เพื่อรักษาคุณสมบัติ NativeAOT - การจัดการ Entity ในหน่วยความจำ:
เมื่อแก้ไขข้อมูล Entity ของผู้เล่น ต้องเรียกDatabaseHelper.MarkDirty(player.Uid)เสมอ เพื่อให้ Background Flusher รับรู้และนำไปบันทึกลง SQLite/MySQL - การทดสอบฉากต่อสู้แบบกำหนดเอง:
ใช้โครงสร้าง FreeSR JSON ในโฟลเดอร์Config/Json/ร่วมกับCalyxOverrideManagerจะช่วยให้จำลองการต่อสู้กับบอสใดๆ ได้ทันทีโดยไม่ต้องรื้อ Resource Excel - ความปลอดภัยของ Buffer:
ในส่วนการอ่าน Binary Packets ให้คงการตรวจสอบremaining bufferไว้เสมอ เพื่อป้องกันช่องโหว่ Buffer Overflow และการจัดสรรหน่วยความจำเกินขนาด