Class MapleMonsterInformationProvider

java.lang.Object
server.life.MapleMonsterInformationProvider

public class MapleMonsterInformationProvider extends Object
怪物掉寶資訊的單例提供者,負責從資料庫載入並快取每隻怪物的掉落表。

主要職責:

  • load() — 啟動時從 drop_datadrop_data_global 資料表批次載入個別掉落(MonsterDropEntry)與全域掉落(MonsterGlobalDropEntry)。
  • addExtra() — 補充 WZ MonsterBook.img 的 reward 節點、 怪物圖鑑道具,以及移除資料庫中不存在於 MapleItemInformationProvider 的無效道具。
  • addMeso — 依怪物等級與 Boss 標記計算金幣掉落條目。
  • clearDrops() — 支援 GM 指令 !reloaddrops,清除並重新載入所有掉落資料。
透過 DatabaseConnection 存取資料庫; 掉落表在擊殺流程由 MapleMonsterKillManager 透過此類別查詢後執行道具投擲。
  • Constructor Details

    • MapleMonsterInformationProvider

      public MapleMonsterInformationProvider()
  • Method Details

    • getInstance

      public static MapleMonsterInformationProvider getInstance()
    • getGlobalDrop

      public List<MonsterGlobalDropEntry> getGlobalDrop()
    • load

      public void load()
    • retrieveDrop

      public ArrayList<MonsterDropEntry> retrieveDrop(int monsterId)
    • addExtra

      public void addExtra()
    • addMeso

      public void addMeso(MapleMonsterStats mons, ArrayList<MonsterDropEntry> ret)
    • clearDrops

      public void clearDrops()
    • startEventDropScheduler

      public void startEventDropScheduler()
      啟動「活動限定掉落」的時間邊界自動偵測排程。

      server.Start 於開服流程(掉落資料載入完畢、Timer.WorldTimer 已啟動後)呼叫一次。 之後每分鐘檢查一次:若任一活動限定掉落(MonsterGlobalDropEntry.eventOnly)的開始或結束時間自上次檢查以來 已被跨越,即自動重新載入掉落資料(等同 GM 指令 !reloaddrops 的全域掉落部分),讓活動掉落即時生效或失效。

      注意:掉落是否生效的「真值來源」是擊殺當下對 MonsterGlobalDropEntry.isActiveAt(long) 的即時判定 (零延遲),本排程的重載主要用於與資料庫重新同步(撿拾活動期間的手動編輯)並留下日誌,屬輔助性質。

    • contains

      public boolean contains(ArrayList<MonsterDropEntry> e, int toAdd)
    • chanceLogic

      public int chanceLogic(int itemId)
    • getAllMonsters

      public Map<Integer,String> getAllMonsters()
      取得所有怪物 id → 名稱對照表(首次呼叫時自 WZ String.wz/Mob.img 延遲載入並快取)。

      必須 synchronizedmobCache 是普通 HashMap, 若多執行緒(如 GUI HTTP 執行緒池)在「尚未載入」時同時進入下方 put 迴圈,並行寫入會在 HashMap 內部 resize 時破壞桶結構,導致之後 keySet().toArray() 夾帶 null 元素而排序時 NPE。序列化首次載入後即唯讀,故僅此處需同步。

    • getDrops

      public Map<Integer, ArrayList<MonsterDropEntry>> getDrops()