Package server.specialitem
package server.specialitem
特殊道具子系統:以
itemId 為鍵的可設定加成道具,玩家持有(穿戴/背包/倉庫)即生效、離身即移除。
SpecialItemFactory 為單例總管,自資料表 special_items 載入所有
SpecialItemConfig(道具編號、三個生效旗標、寵吸範圍、額外經驗/楓幣百分比、
力/敏/智/幸/攻擊/魔攻加成)。設定快照以 volatile 不可變 Map 持有,重載時原子換上,供
client.PlayerStats#recalcLocalStats 等熱路徑無鎖查詢。
生效機制:重算角色數值時,依各設定的生效旗標掃描玩家當前的穿戴/背包/倉庫,命中即累加加成
(多道具相加)。因重算每次都「先歸零再依當前持有重建」,故道具一旦離身(脫裝/丟棄/交易/過期/
倉庫取出)下次重算即自動移除。數值加成存於角色的獨立欄位(不進 effects buff 表),確保
與同名藥水各自獨立相加、且不被怪物淨化技能清除;右上角圖示則以純視覺 buff 封包呈現。
資料讀取透過 DatabaseConnection 取得共用連線。後台「特殊道具」頁的增刪改只寫入
資料庫、不自動生效,需經 !reloadspecialitems
(SpecialItemFactory.reload())或後台「刷新」鈕重載才採用新設定。
-
ClassesClassDescription單筆「特殊道具」設定的不可變資料模型,對應資料表
special_items的一列。SpecialItemConfig.describeEffects()的離線單元測試:驗證各非零加成的中文格式、零值略過、 百分比項加%、負值符號、欄位順序與標籤,以及全零回空字串。特殊道具加成的週期安全網:每隔數秒掃一遍線上玩家,對「目前持有特殊道具」或「目前有特殊道具加成生效」者 觸發一次數值重算(recalcLocalStats),涵蓋沒有即時觸發點的生效/移除情況——尤其是 道具時間到自然消失(無任何背包異動事件),以及撿取/交易取得/倉庫取出等「取得即生效」的情況。