Class SpecialItemFactory

java.lang.Object
server.specialitem.SpecialItemFactory

public final class SpecialItemFactory extends Object
特殊道具設定總管(單例),以 itemId 為鍵持有所有 SpecialItemConfig, 供 client.PlayerStats#recalcLocalStats 在角色數值重算時查詢加成。

啟動時(或 !reloadspecialitems / 後台「刷新特殊道具」)自資料表 special_items 讀入全部設定。對外查詢入口 getByItemId(int)isSpecialItem(int) 位於極熱路徑 (recalc 每次換裝/加退 buff/升級皆呼叫,以及背包異動的守門判斷),故採無鎖讀取: 設定快照存於 volatile 不可變 Map,重載時於背景建好新快照後原子換上, 讀取端只讀 volatile 參考、不取鎖、不阻塞。無任何設定時 Map 為空,isSpecialItem(int) 立即回傳 false,對未使用本功能的伺服器零額外負擔。

後台增刪改只寫入資料庫、自動生效,需經重載才採用新設定(與轉蛋機相同的維護模型)。

  • Method Details

    • getInstance

      public static SpecialItemFactory getInstance()
      取得單例。採雙重檢查鎖定;首次建立時執行一次全量重載,最後才把建立完成的實例指派給 instance(確保其他執行緒看不到尚未載入完成的半成品)。
      Returns:
      特殊道具設定總管單例
    • reload

      public void reload()
      全量重載所有特殊道具設定。

      先在背景把 special_items 每一列讀進暫存 Map,再把它包成不可變 Map 後原子指派volatileconfigs(讀取端無鎖、永遠看到完整快照)。讀取失敗只記錄錯誤、保留原有快取。

    • isEmpty

      public boolean isEmpty()
      目前是否沒有任何特殊道具設定(供熱路徑提前略過)。
      Returns:
      無任何設定時回傳 true
    • isSpecialItem

      public boolean isSpecialItem(int itemId)
      指定道具是否為特殊道具(快速集合判斷,供背包異動的守門用)。
      Parameters:
      itemId - 道具編號
      Returns:
      已設定為特殊道具時回傳 true
    • getByItemId

      public SpecialItemConfig getByItemId(int itemId)
      依道具編號取得設定。
      Parameters:
      itemId - 道具編號
      Returns:
      對應設定,或在未設定時回傳 null
    • getAll

      public Collection<SpecialItemConfig> getAll()
      取得目前全部設定的快照(不可變視圖),供後台清單與重算時遍歷。
      Returns:
      所有 SpecialItemConfig 的集合