希望新增玩家戰鬥狀態輸出(Player Combat Status via GMCP)
目前 GMCP 已提供相當完整的資訊,例如: Char.Vitals(氣血、內力、體力等) Char.Inventory Char.Skills Char.Stats Room.Entities(房間 NPC、玩家、物品) 但經過測試後,似乎沒有能直接判斷玩家是否處於戰鬥中的 GMCP 欄位。 對於使用 Mudlet 或其他支援 GMCP 客戶端的玩家而言,目前若要判斷戰鬥狀態,只能依賴文字觸發器解析戰鬥訊息,容易受到訊息格式變更影響,也增加腳本維護成本。 因此建議新增一個專門的戰鬥狀態欄位,例如: gmcp.Char.Status = { in_combat = true } 或 gmcp.Char.Combat = { active = true } 進一步若能提供戰鬥目標資訊會更有幫助,例如: gmcp.Char.Combat = { active = true, target = { key = "iceguard", ref = "#606262", name = "冰甲妖兵" } } 甚至可考慮未來擴充: gmcp.Char.Combat = { active = true, busy = false, target_ref = "#606262" } 新增此類 GMCP 資訊可讓玩家更穩定地開發 UI、戰鬥輔助、任務追蹤及自動化腳本,也能減少對文字輸出的依賴。
回覆(1)
這個建議已經做好上線了,謝謝你連欄位設計都一併想過——最後的成品跟你提的第三版幾乎一樣。 新封包:Char.Combat(webclient / GUI 端的 cmdname 是 char_combat) active 是否處於戰鬥中。有鎖定目標、或有人正在打你,都算 attacking 你自己有沒有鎖定目標。active 為真而這項為假 = 你正在單方面挨打 mode "fight"(點到為止) / "kill"(生死相搏) / "duel"(切磋);非戰鬥時為空字串 kill_mode 同上的布林版 duel_mode 同上的布林版 busy 施展招式後的 recovery 鎖(這一回合不會揮擊) queued 已排入下一回合的動作 {kind, windup};沒有則為 null interval 你目前的出手間隔(秒),會吃輕功與凍緩等修正 target 鎖定目標,沒有則為 null attackers 正在攻擊你的對象陣列(被圍毆時會超過一個) target 與 attackers 裡每一個對象的結構: { "name": "冰甲妖兵(Iceguard)", 完整顯示名(含稱號/門派前綴) "name_zh": "冰甲妖兵", 乾淨中文名 "key": "iceguard", "proto_key": "iceguard", 跨重生恆定,拿來配立繪/對照表用這個 "ref": "#606262", 精確指向這一隻實例 "is_player": false, "hp": 120, "hp_max": 300, "hp_percent": 40 } 幾點說明: 一、ref(#dbref)每次重生都會變,只適合當「這一場戰鬥的這一隻」用;要做穩定的 對照表(例如立繪、資料庫)請用 proto_key。這兩個欄位刻意跟 Room.Entities 裡的房間人物用同一套結構,你那邊可以共用同一份解析程式。 二、hp / hp_max 不是新開放的情報——戰鬥訊息每一擊本來就會印「(某某 剩 120/300)」, 這裡只是把同一份數字結構化。戰鬥外不會有 target,所以沒辦法拿來偷看路人的血量。 三、推送時機:開打與收兵當下立刻送一發;其餘一切變動(目標被打死、對方逃跑、 你走出房間拆對、被偷襲、轉換目標……)由伺服器每秒做一次差量偵測,內容有變才送。 所以你不會收到重複的封包,也不會漏掉狀態轉換。登入時也會送一發基準線 (通常是 active: false),客戶端開場就有值可用,不必等第一場戰鬥。 四、記得在 Core.Supports.Set 裡帶上 "Char 1"。 Mudlet 這樣接: -- 在 script 裡註冊 event handler:gmcp.Char.Combat function onCombatUpdate() local c = gmcp.Char.Combat if c.active then if c.target then local t = c.target cecho(string.format("<yellow>[戰鬥] %s %d/%d (%d%%)\n", t.name_zh, t.hp, t.hp_max, t.hp_percent)) end if not c.attacking then cecho("<red>[警告] 你正在挨打,卻沒有還手目標!\n") end end end registerAnonymousEventHandler("gmcp.Char.Combat", "onCombatUpdate") 你提到的 busy 我照著做成「施展招式後的僵直」——那正是你下了招式指令之後、 真正打出去之前那段不能揮擊的空檔,配合 queued 應該就能做出蓄勢/讀條的介面。 之後若還有想要的欄位,歡迎繼續開單。
請先登入才能回覆。