diff --git a/Ananta.Server/Ananta.App/DebugPanel/index.html b/Ananta.Server/Ananta.App/DebugPanel/index.html
index 31d7309..640de78 100644
--- a/Ananta.Server/Ananta.App/DebugPanel/index.html
+++ b/Ananta.Server/Ananta.App/DebugPanel/index.html
@@ -44,9 +44,10 @@
⚡ Quick Spawn Special Vehicles:
-
+
+
💡 หมายเหตุ: รถล้อเดียวของ Taffy (塔菲独轮车) เป็นสกิลกดขี่ของตัวละคร Taffy (กด E / Active Skill) ให้สลับเป็นตัวละคร Taffy แล้วกด E เพื่อแปลงค้อนเป็นรถล้อเดียวขี่ได้ทันที
Category:
Vehicle:
diff --git a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Profiles.cs b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Profiles.cs
index 81acb81..cb4ccaa 100644
--- a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Profiles.cs
+++ b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Profiles.cs
@@ -18,6 +18,24 @@ internal sealed partial class GameRouter
CombatWeaponDefinition weapon,
CombatStyleDefinition style)
{
+ if (weapon.SpiritTemplateId == 15020992) // Taffy (塔菲)
+ {
+ // Taffy signature skills:
+ // 51935209: 塔菲普攻1 (Hammer strikes)
+ // 51935213: 塔菲重击 (Heavy slam)
+ // 51935207: 通用闪避 (Dodge)
+ // 51935230: 塔菲主动技_上车A (Taffy Monowheel Mount!)
+ // 51935224: 塔菲大招 (超次元神速连打)
+ await ctx.NotifyAsync(MethodId.SyncChangeCommonSkill, WorldCodec.SkillBinding(unitId, 51935209));
+ await ctx.NotifyAsync(MethodId.SyncChangeHeavyAttack, WorldCodec.SkillBinding(unitId, 51935213));
+ await ctx.NotifyAsync(MethodId.SyncChangeDodgeSkill, WorldCodec.SkillBinding(unitId, 51935207));
+ await ctx.NotifyAsync(MethodId.SyncChangeControlSkill, CombatCodec.ControlBinding(unitId, style));
+ await ctx.NotifyAsync(MethodId.SyncChangeActiveSkill, WorldCodec.SkillBinding(unitId, 51935230));
+ await ctx.NotifyAsync(MethodId.SyncChangeUniqueSkill, WorldCodec.SkillBinding(unitId, 51935224));
+ ctx.Session.Log.Info($"[COMBAT] bound signature Taffy Monowheel skill profile for unit={unitId}");
+ return;
+ }
+
await ctx.NotifyAsync(MethodId.SyncChangeCommonSkill, CombatCodec.CommonBinding(unitId, style));
await ctx.NotifyAsync(MethodId.SyncChangeHeavyAttack, CombatCodec.HeavyAttackBinding(unitId, style));
await ctx.NotifyAsync(MethodId.SyncChangeDodgeSkill, CombatCodec.DodgeBinding(unitId, style));
diff --git a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs
index d509ddd..61e1d1e 100644
--- a/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs
+++ b/Ananta.Server/Ananta.Handlers/Game/GameRouter.Vehicles.cs
@@ -566,31 +566,35 @@ internal sealed partial class GameRouter
// Taffy Moto / Monowheel Handlers
[Handler(MethodId.AskTaffyMotoEnterRush, HandlerPacketKind.Invoke)]
+ [Handler(MethodId.AskTaffyMotoEnterRush, HandlerPacketKind.Notify)]
private Task AskTaffyMotoEnterRush(Connection conn, UxRpcMessage msg)
{
conn.Log.Info("[TAFFY_MOTO] AskTaffyMotoEnterRush");
- return conn.ReturnEmptyOkAsync(msg);
+ return msg.IsInvoke ? conn.ReturnEmptyOkAsync(msg) : Task.CompletedTask;
}
[Handler(MethodId.AskTaffyMotoLeaveRush, HandlerPacketKind.Invoke)]
+ [Handler(MethodId.AskTaffyMotoLeaveRush, HandlerPacketKind.Notify)]
private Task AskTaffyMotoLeaveRush(Connection conn, UxRpcMessage msg)
{
conn.Log.Info("[TAFFY_MOTO] AskTaffyMotoLeaveRush");
- return conn.ReturnEmptyOkAsync(msg);
+ return msg.IsInvoke ? conn.ReturnEmptyOkAsync(msg) : Task.CompletedTask;
}
[Handler(MethodId.OnTafeiMotorColliding, HandlerPacketKind.Invoke)]
+ [Handler(MethodId.OnTafeiMotorColliding, HandlerPacketKind.Notify)]
private Task OnTafeiMotorColliding(Connection conn, UxRpcMessage msg)
{
conn.Log.Info("[TAFFY_MOTO] OnTafeiMotorColliding");
- return conn.ReturnEmptyOkAsync(msg);
+ return msg.IsInvoke ? conn.ReturnEmptyOkAsync(msg) : Task.CompletedTask;
}
[Handler(MethodId.AskGetOffMotor, HandlerPacketKind.Invoke)]
+ [Handler(MethodId.AskGetOffMotor, HandlerPacketKind.Notify)]
private Task AskGetOffMotor(Connection conn, UxRpcMessage msg)
{
conn.Log.Info("[TAFFY_MOTO] AskGetOffMotor");
- return conn.ReturnEmptyOkAsync(msg);
+ return msg.IsInvoke ? conn.ReturnEmptyOkAsync(msg) : Task.CompletedTask;
}
}
diff --git a/README.md b/README.md
index e13f0a5..b07a449 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@
| **Safe Fastpatch Loader** | 🟢 ใช้งานได้สมบูรณ์ | ตัวสร้าง `fastpatch_4229938.zip` อัตโนมัติ ทุกคำสั่งถูกครอบด้วย `pcall` ป้องกันข้อความคำสั่งรั่วขึ้นหน้าจอ และหมดปัญหาเกมค้างหน้า Initialize Client |
| **Monster Spawning (เสกมอนเตอร์)** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | เสกได้ผ่าน GM Console (`Alt+F1`) และ Debug Panel (`CMD:SPAWN_ENEMY`) ส่งคำสั่งเข้า `gCS.LuaUtils.AddEnemy` โดยตรงไม่ขึ้นเป็นตัวหนังสือบนจอ แต่การเกิดจะขึ้นอยู่กับ NavMesh ใน Chunk นั้นๆ |
| **Cutscene & Video Player** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | คำสั่ง `CMD:PLAY_CUTSCENE` สั่งเปิดหน้าต่าง `S_VIDEO_PLAYER_PANEL` และ Timeline ได้ถูกต้อง ไม่ขึ้นเป็นตัวหนังสือบนจอ แต่ Cutscene ID บางตัวอาจไม่มีไฟล์วิดีโอใน Client Leak |
-| **Taffy Monowheel (塔菲摩托)** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | ลงทะเบียน RPC การขับขี่พื้นฐาน (`AskTaffyMotoEnterRush`, `AskGetOffMotor`, `OnTafeiMotorColliding`) ไว้แล้ว แต่ระบบฟิสิกส์การชนยังไม่สมบูรณ์เท่าตัวเอก |
+| **Taffy Monowheel (塔菲独轮车)** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | รถล้อเดียวของ Taffy ไม่ใช่เอนทิตีรถโรงรถ แต่เป็นสกิลกดขี่ของตัวละคร Taffy (Active Skill: `51935230` แปลงค้อนเป็นรถล้อเดียว) เซิร์ฟเวอร์ผูกสกิลเฉพาะตัวของ Taffy และลงทะเบียน RPC รองรับการเร่งความเร็ว ชน และลงจากรถไว้เรียบร้อยแล้ว |
| **Gacha System (ตู้สุ่มตัวละคร)** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | หน้าร้านค้าเปิดตู้ได้และบายพาสวันหมดอายุ CBT แล้ว แต่ผลการสุ่มยังเป็นการให้ไอเทมแบบสุ่มตายตัว (ยังไม่มี Database เรทกาชาแบบเต็มระบบ) |
| **Phone Customization (ตกแต่งมือถือ)** | 🟡 กำลังพัฒนา / มีข้อจำกัด / บัค | ปลดล็อกไอเทมเคสมือถือ วอลเปเปอร์ จี้ห้อย (`1..200`) ในหน่วยความจำ แต่ยังไม่บันทึกความเปลี่ยนแปลงข้าม Session แบบถาวร |
| **Monster Combat AI & Aggro** | 🔴 ยังทำไม่ได้ / วางแผนไว้ | มอนเตอร์ที่เสกออกมาจะยืนนิ่งหรือเคลื่อนที่พื้นฐาน ยังไม่มี Behavior Tree เชิงรุกเข้าโจมตีผู้เล่น (ต้องรอเขียน Combat AI Loop ฝั่งเซิร์ฟเวอร์) |