【戰鬥時腳本錯誤回報】CombatTicker at_repeat() 資料庫交易/外鍵約束錯誤
錯誤情況說明(繁體中文) 觸發情境: 在遊戲中輸入指令 fight shen 與 NPC「蜀山派傳功長老『流雲子』沈清風」進行戰鬥時,戰鬥文字正常輸出,但同時在後台不斷出現腳本錯誤訊息。 錯誤訊息(節錄): Script combat_ticker(#155373) of type 'CombatTicker': at_repeat() error 'An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.' Script combat_ticker(#155373) of type 'CombatTicker': at_repeat() error 'FOREIGN KEY constraint failed.' 現象描述: 戰鬥流程可以繼續進行,角色攻擊與傷害數值正常顯示。 但每次戰鬥輪詢(ticker)觸發時,後台都會拋出上述錯誤。 錯誤內容顯示資料庫交易(transaction)處於 atomic 區塊中,無法執行查詢,並且有外鍵約束(FOREIGN KEY)失敗的情況。 可能相關模組/腳本: CombatTicker 類型腳本的 at_repeat() 函式 戰鬥記錄或戰鬥狀態寫入資料庫的部分(可能涉及外鍵關聯) 建議檢查方向: 交易控制: 確認 CombatTicker 在 at_repeat() 中是否於 atomic 區塊內執行了額外查詢或寫入,導致「current transaction」錯誤。 外鍵設定: 檢查戰鬥相關資料表的外鍵約束,確認插入/更新的資料是否缺少對應主鍵或使用了已刪除的關聯。 錯誤重現: 使用角色對「沈清風」輸入 fight shen。 持續觀察戰鬥過程中 combat_ticker 的輸出。 確認每次輪詢都出現相同錯誤。
回覆(3)
◆ 結論:確認是真的錯誤,感謝回報。我們在伺服器日誌裡找到同一批紀錄——今天總共七次,橫跨好幾位玩家的戰鬥,不只你那一場,所以跟沈長老本身沒有特別關係。戰鬥流程本身不受影響,你看到的命中、傷害與獎勵都是正確的。 ◆ 根因:問題出在「目標倒下、系統要收拾善後」那一段。清除流程前面串了一長列善後動作(重生排程、戰利品掉落、任務判定……),每一段都被包在「出錯就當沒事」的保護殼裡。其中某一步對資料庫寫入失敗時,錯誤被那層保護殼吃掉了,但那一筆資料庫交易已經壞掉——接下來同一輪心跳裡的任何讀寫都會連鎖失敗,於是就冒出你截到的那兩行。你貼的兩則訊息其實是同一件事的前後段:先是「交易已壞」,再來是「外鍵約束失敗」。 ◆ 影響:戰鬥不會中斷,你不會少拿東西。但那具本該被清掉的倒地目標可能沒清乾淨,長期累積會變成伺服器的負擔——這也是我們想把它修好的主因。 ◆ 為什麼今晚先不動手:這一段位在戰鬥引擎的死亡結算主幹上,牽一髮動全身,不適合無人看管的時段自行修改。已把日誌、呼叫堆疊與可疑的幾個善後步驟整理好交給站長評估。 ◆ 給你的建議:照常玩,不必迴避任何 NPC。若之後又撞到,麻煩順手記一下當時打的是誰、有沒有用召喚物或特殊招式、對方是不是一擊斃命——那對縮小範圍很有幫助。
◆ 已修好並上線。 上一則回覆說「這一段位在戰鬥引擎,先不動手」——那個判斷過於保守,今天補上了。 你的診斷方向完全正確,根因確實就在「目標倒下、系統收拾善後」那一段。 ◆ 具體是什麼 收尾流程最後有三個分支(召喚物撤離、拳尊決鬥、武鬥場對手),它們共同的特點是 「這個 hook 會自己把目標清掉,清完就該結束」。問題在於「結束」那一步被寫在保護殼 裡面——一旦 hook 在清掉目標之後才出錯,「結束」就跟著錯誤一起被吃掉了,流程於是 繼續往下跑。 而下面每一步都還在對那個已經不存在的目標寫資料。資料庫回「外鍵約束失敗」, 那一筆交易就此壞掉;再往後的任何讀寫都變成「交易已壞,不能再查詢」。 你截到的兩行正是這個順序的前後段。 ◆ 改了什麼 一、「結束」移出保護殼——分支條件成立就結束,不管 hook 有沒有出錯。 二、清除動作改成可以安全地被呼叫兩次(第二次直接跳過,而不是去碰已經消失的資料)。 三、這幾處的錯誤不再被靜靜吃掉,會寫進日誌。這類問題先前之所以能存在很久, 正是因為它只在後台留下兩行看似無關的訊息。 四、順手把武鬥場的「勝場結算」與「重生排程」拆開——舊寫法只要結算出錯, 整層武鬥場的對手就再也不會重生了。 ◆ 你提到的「倒地目標沒清乾淨」 確實會發生,也確實是我們想修它的主因。同一天另外查到的一件事可以佐證這類殘留的 代價:有角色行囊累積到上千件物品,導致伺服器讀取時卡住好幾秒,而那幾秒之內 線上所有人都動不了。細節寫在官網更新頁與討論區的維護公告裡。 ◆ 附帶 同批還修了「披甲猿將/雷鬼打死不掉東西」(掉落物設定寫法有誤,一直是擲骰成功但 東西生不出來),以及「有些主動攻擊的 NPC 該撲上來卻站著不動」(同房間若有 NPC 剛好在前一瞬間被打死,整輪撲殺判定會中斷)。 謝謝你把後台訊息原樣貼上來,還附了重現步驟——這則回報的資訊品質很高, 讓我們可以直接從日誌對上同一批紀錄,省掉大量猜測。
請先登入才能回覆。