Class World

java.lang.Object
handling.world.World

public class World extends Object
行程內的跨伺服器協調層,以全靜態 API 串接三個 Netty 伺服器與多個頻道。

單一行程同時跑 LoginServerChannelServerCashShopServer,本類別是它們之間共享狀態與廣播的中樞; 玩家換頻道或進出商城透過此處與 CharacterTransferPlayerBuffStorage 完成,而非重新連線。職責與主要協作者:

  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    公會聯盟子系統:集中保管所有 MapleGuildAlliance 並提供聯盟相關操作與封包廣播。
    static class 
    跨頻道訊息廣播子系統。
    static class 
    好友(Buddy)跨頻道協調子系統。
    static class 
    家族子系統:集中保管所有 MapleFamily 並提供家族成員與聲望相關操作。
    static class 
    角色定位子系統:依角色 ID 或名稱查出所在頻道與角色實例。
    static class 
    公會(Guild)跨頻道協調子系統。
    static class 
    密語視窗(Maple Messenger)跨頻道協調子系統。
    static class 
    組隊(Party)與遠征隊(Expedition)跨頻道協調子系統。
    static class 
    負責一組頻道之定時重生/維護的 Runnable 任務。
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static boolean
    全域關機旗標;於伺服器關閉流程啟動時置為 true,供各子系統判斷是否正在停機。
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static final void
    將指定帳號加入存檔鎖定清單(標記開始存檔)。
    static void
    依角色先前儲存的轉移暫存資料,將連線設回原頻道並登記待轉入。
    static void
    準備角色換頻道(前往指定頻道)所需的轉移暫存資料並登記待轉入。
    static void
    清除指定帳號殘留的換頻道/跨伺服器待處理玩家資料。
    蒐集全頻道的作弊嫌疑資料,排序後回傳分數最高的前 20 筆。
    回傳各頻道與全伺服器的線上連線數對應表。
    static int
    統計全伺服器目前處於「待轉入」狀態的角色總數。
    蒐集全頻道的玩家檢舉資料,排序後回傳分數最高的前 20 筆。
    static String
    彙整所有頻道目前的線上人數,組成可讀的多行狀態文字。
    getStorage(int channel)
    取得指定頻道(或商城特殊頻道)的玩家儲存區 PlayerStorage
    static void
    handleCooldowns(MapleCharacter chr, int numTimes, boolean hurt, long now)
    對單一角色執行一輪定時的冷卻、回復、異常狀態與寵物維護處理。
    static void
    handleMap(MapleMap map, int numTimes, int size, long now)
    對單一地圖執行一輪重生/維護處理。
    static boolean
    hasMerchant(int accountID, int characterID)
    判斷指定帳號/角色是否在任一頻道擁有開設中的雇傭商人。
    static void
    預熱(觸碰)各巢狀靜態子系統,強制其靜態初始化區塊先行執行。
    static boolean
    判斷指定頻道是否存在且仍有空位可供登入。
    static boolean
    判斷給定的角色名稱清單中,是否有任一角色目前在任一遊戲頻道上線。
    static boolean
    isConnected(String charName)
    判斷指定角色名稱目前是否在任一遊戲頻道上線。
    static final boolean
    查詢指定帳號是否正處於存檔鎖定中。
    static void
    註冊全頻道的重生/維護排程任務。
    static final void
    將指定帳號自存檔鎖定清單移除(標記存檔結束)。
    static void
    scheduleRateDelay(String type, long delay)
    排程於指定延遲後結束某種雙倍活動,將對應倍率重設為 1 並全頻道公告。
    static void
    切換全頻道的大聲公(喇叭)靜音狀態。
    static void
    註冊「在線時間」每分鐘排程:累計全頻道在線角色的在線時間。

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • isShutDown

      public static boolean isShutDown
      全域關機旗標;於伺服器關閉流程啟動時置為 true,供各子系統判斷是否正在停機。
  • Constructor Details

    • World

      public World()
  • Method Details

    • init

      public static void init()
      預熱(觸碰)各巢狀靜態子系統,強制其靜態初始化區塊先行執行。

      依序輕觸 World.FindWorld.AllianceWorld.MessengerWorld.Party, 使其 static 初始化(含 World.Party 開機時重置 characters.partyfatigue 的 DB 寫入) 在伺服器啟動時就完成,而非延遲到首次使用。

    • getStatus

      public static String getStatus()
      彙整所有頻道目前的線上人數,組成可讀的多行狀態文字。

      逐一走訪 ChannelServer.getAllInstances(),輸出每個頻道的連線數與全頻道線上總計。

      Returns:
      形如「Channel n: x users」逐行加上線上總人數的狀態字串
    • getConnected

      public static Map<Integer,Integer> getConnected()
      回傳各頻道與全伺服器的線上連線數對應表。

      鍵為頻道編號、值為該頻道連線數;額外以鍵 0 存放全頻道線上總計。

      Returns:
      頻道編號(0 代表總計)對應到線上人數的 Map
    • getCheaters

      public static List<CheaterData> getCheaters()
      蒐集全頻道的作弊嫌疑資料,排序後回傳分數最高的前 20 筆。

      合併所有 ChannelServergetCheaters() 結果並排序(依 CheaterData 自然順序), 再截取前 20 筆。

      Returns:
      至多 20 筆作弊嫌疑資料的清單
    • getReports

      public static List<CheaterData> getReports()
      蒐集全頻道的玩家檢舉資料,排序後回傳分數最高的前 20 筆。

      合併所有 ChannelServergetReports() 結果並排序,再截取前 20 筆。

      Returns:
      至多 20 筆檢舉資料的清單
    • isConnected

      public static boolean isConnected(String charName)
      判斷指定角色名稱目前是否在任一遊戲頻道上線。
      Parameters:
      charName - 角色名稱
      Returns:
      若該角色目前在線上(World.Find.findChannel(String) 回傳大於 0 的頻道)則為 true
    • toggleMegaphoneMuteState

      public static void toggleMegaphoneMuteState()
      切換全頻道的大聲公(喇叭)靜音狀態。

      對每個 ChannelServer 呼叫其 toggleMegaphoneMuteState(),副作用為改變各頻道喇叭禁用旗標。

    • ChannelChange_Data

      public static void ChannelChange_Data(MapleClient c, MapleCharacter chr, int toChannel)
      準備角色換頻道(前往指定頻道)所需的轉移暫存資料並登記待轉入。

      將來源連線的暫存 IP、帳號名、原頻道與轉移時間寫入角色的 Transfer 暫存欄位, 再向目標頻道的 PlayerStorage 登記為待轉入玩家(registerPendingPlayer)。 此為跨頻道移動流程的一環,具角色暫存狀態變更與目標頻道狀態登記副作用。

      Parameters:
      c - 來源用戶端連線
      chr - 欲轉移的角色
      toChannel - 目標頻道編號
    • ChannelChange_Data

      public static void ChannelChange_Data(MapleClient c, MapleCharacter chr)
      依角色先前儲存的轉移暫存資料,將連線設回原頻道並登記待轉入。

      由角色 Transfer 暫存欄位讀回原頻道編號,設定到連線後向該頻道的 PlayerStorage 登記為待轉入玩家。多用於返回原頻道(例如離開商城)的流程, 為前述三參數版本的對應反向操作。

      Parameters:
      c - 用戶端連線(其頻道會被改寫為暫存中的原頻道)
      chr - 欲轉回的角色
    • isCharacterListConnected

      public static boolean isCharacterListConnected(List<String> charName)
      判斷給定的角色名稱清單中,是否有任一角色目前在任一遊戲頻道上線。

      逐頻道、逐名稱比對 PlayerStorage.getCharacterByName(String),一旦命中即回傳。

      Parameters:
      charName - 欲檢查的角色名稱清單
      Returns:
      只要清單中任一角色在線即為 true,否則為 false
    • hasMerchant

      public static boolean hasMerchant(int accountID, int characterID)
      判斷指定帳號/角色是否在任一頻道擁有開設中的雇傭商人。
      Parameters:
      accountID - 帳號 ID
      characterID - 角色 ID
      Returns:
      任一 ChannelServer 含有該雇傭商人則為 true
    • getStorage

      public static PlayerStorage getStorage(int channel)
      取得指定頻道(或商城特殊頻道)的玩家儲存區 PlayerStorage

      頻道編號採用特殊哨兵值區分商城子系統:

      • -20:商城拍賣場(MTS)的玩家儲存區。
      • -10:一般商城(Cash Shop)的玩家儲存區。
      • 其他值:對應 ChannelServer 的玩家儲存區。
      一般遊戲頻道分支會以 ChannelServer.getInstance(int) 取得實例,傳入無效頻道時該呼叫可能回傳 null 並導致 NullPointerException;呼叫端須確保頻道有效。
      Parameters:
      channel - 頻道編號,或 -20(MTS)/-10(商城)特殊值
      Returns:
      對應的 PlayerStorage
    • getPendingCharacterSize

      public static int getPendingCharacterSize()
      統計全伺服器目前處於「待轉入」狀態的角色總數。

      加總商城、商城拍賣場(MTS)與所有 ChannelServer 玩家儲存區的待轉入角色數 (pendingCharacterSize())。

      Returns:
      待轉入角色總數
    • isChannelAvailable

      public static boolean isChannelAvailable(int ch)
      判斷指定頻道是否存在且仍有空位可供登入。

      若該頻道的 ChannelServer 或其 PlayerStoragenull 即視為不可用; 否則以連線數是否低於上限判斷——頻道 1 上限為 600、其餘頻道為 400。

      Parameters:
      ch - 頻道編號
      Returns:
      頻道存在且連線數低於上限則為 true
    • scheduleRateDelay

      public static void scheduleRateDelay(String type, long delay)
      排程於指定延遲後結束某種雙倍活動,將對應倍率重設為 1 並全頻道公告。

      透過 Timer.WorldTimerdelay 分鐘後執行:依活動類型("經驗""掉寶""楓幣") 將所有 ChannelServer 的對應額外倍率(setExExpRatesetExDropRatesetExMesoRate)歸 1, 並透過 World.Broadcast.broadcastMessage(byte[]) 向全頻道送出活動結束公告。具排程、跨頻道狀態變更與廣播副作用。

      Parameters:
      type - 活動類型字串,須為 "經驗""掉寶""楓幣"(其他值不調整倍率,但仍會公告)
      delay - 延遲時間,單位為分鐘
    • registerRespawn

      public static void registerRespawn()
      註冊全頻道的重生/維護排程任務。

      把所有頻道依每執行緒 CHANNELS_PER_THREAD(=3)個一組切分,為每組向 Timer.WorldTimer 註冊一個 每 4500 毫秒執行的 World.Respawn 任務(負責怪物重生、地上物到期、玩家冷卻/回復等定時處理)。於 Start.run() 啟動時呼叫一次。

    • handleMap

      public static void handleMap(MapleMap map, int numTimes, int size, long now)
      對單一地圖執行一輪重生/維護處理。

      處理三類週期性事務:地上物到期回收與轉為自由撿取(FFA);地圖可重生時觸發怪物重生並對地圖內每名角色呼叫 handleCooldowns(MapleCharacter, int, boolean, long);以及逐一檢查怪物是否該被清除、該掉落物品或該取消已到期的狀態效果。 含一處針對地圖 931000500 的特例(jaira hack)使其即使無玩家仍進行處理。由 World.Respawn.run() 在排程執行緒上呼叫; 具地圖怪物/地上物狀態變更與封包送出副作用。

      Parameters:
      map - 目標地圖
      numTimes - 目前累計執行次數(用於分頻處理)
      size - 呼叫時的地圖角色數(目前未使用)
      now - 本輪的時間戳(System.currentTimeMillis()
    • handleCooldowns

      public static void handleCooldowns(MapleCharacter chr, int numTimes, boolean hurt, long now)
      對單一角色執行一輪定時的冷卻、回復、異常狀態與寵物維護處理。

      涵蓋多項週期性事務:清除到期技能冷卻並送出 skillCooldown 封包;存活時處理龍之血、HP/MP/自然回復、妖精與 持續傷害(DOT);清除到期的異常狀態(disease)。另以 numTimes 分頻處理:每 7 次累加坐騎疲勞、每 100 次跑寵物排程 (飽食度遞減、到期收回寵物、特殊寵物倒數)。當 hurt 為真且角色存活時,依地圖設定(含 749040100 迷你地城特例、 HP 防護裝備與 HP_LOSS_GUARD buff)扣血。由 handleMap(MapleMap, int, int, long) 對地圖內每名角色呼叫;具角色狀態變更與封包送出副作用。

      Parameters:
      chr - 目標角色
      numTimes - 目前累計執行次數(用於分頻處理)
      hurt - 本輪該地圖是否進入扣血時點
      now - 本輪的時間戳(System.currentTimeMillis()
    • 線上時間排程

      public static void 線上時間排程()
      註冊「在線時間」每分鐘排程:累計全頻道在線角色的在線時間。

      Timer.WorldTimer 註冊一個每分鐘(延遲 10、間隔 10 分鐘)執行的任務,遍歷全頻道所有在線角色, 對存活者累加在線時間。具角色狀態變更副作用。

    • isPlayerSaving

      public static final boolean isPlayerSaving(Integer accountid)
      查詢指定帳號是否正處於存檔鎖定中。

      於讀鎖(saveLock.readLock())保護下查存檔鎖定清單;用於避免同一帳號的存檔與換頻道等操作競態。

      Parameters:
      accountid - 帳號 ID
      Returns:
      該帳號正在存檔則為 true,否則為 false
    • addPlayerSaving

      public static final void addPlayerSaving(Integer accountid)
      將指定帳號加入存檔鎖定清單(標記開始存檔)。

      於寫鎖(saveLock.writeLock())保護下加入;應與 removePlayerSaving(Integer) 成對使用。

      Parameters:
      accountid - 帳號 ID
    • removePlayerSaving

      public static final void removePlayerSaving(Integer accountid)
      將指定帳號自存檔鎖定清單移除(標記存檔結束)。

      於寫鎖(saveLock.writeLock())保護下移除;與 addPlayerSaving(Integer) 成對使用。

      Parameters:
      accountid - 帳號 ID
    • clearChannelChangeDataByAccountId

      public static void clearChannelChangeDataByAccountId(int accountid)
      清除指定帳號殘留的換頻道/跨伺服器待處理玩家資料。

      對所有 ChannelServer 及商城(-20)、登入轉接(-10)儲存區呼叫 deregisterPendingPlayerByAccountId,移除卡在轉移中途的待處理玩家項目;過程中的例外會被吞下並以 debug 等級記錄。 用於登入時清理同帳號的舊有換頻道狀態。具跨頻道狀態移除副作用。

      Parameters:
      accountid - 帳號 ID