Class World
單一行程同時跑 LoginServer/ChannelServer/CashShopServer,本類別是它們之間共享狀態與廣播的中樞;
玩家換頻道或進出商城透過此處與 CharacterTransfer/PlayerBuffStorage 完成,而非重新連線。職責與主要協作者:
- 巢狀靜態子系統
World.Find(依名稱/ID 查角色與其所在頻道)、World.Broadcast(跨頻道訊息廣播)、World.Party(組隊)、World.Messenger(密語視窗)、World.Buddy(好友)、World.Guild/World.Alliance/World.Family(公會/聯盟/家族)。 - 集中保管公會、家族與離線玩家 buff(
PlayerBuffStorage)等跨頻道狀態,並以World.Respawn驅動全頻道重生排程。
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic 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
FieldsModifier and TypeFieldDescriptionstatic boolean全域關機旗標;於伺服器關閉流程啟動時置為true,供各子系統判斷是否正在停機。 -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic final voidaddPlayerSaving(Integer accountid) 將指定帳號加入存檔鎖定清單(標記開始存檔)。static void依角色先前儲存的轉移暫存資料,將連線設回原頻道並登記待轉入。static voidChannelChange_Data(MapleClient c, MapleCharacter chr, int toChannel) 準備角色換頻道(前往指定頻道)所需的轉移暫存資料並登記待轉入。static voidclearChannelChangeDataByAccountId(int accountid) 清除指定帳號殘留的換頻道/跨伺服器待處理玩家資料。static List<CheaterData> 蒐集全頻道的作弊嫌疑資料,排序後回傳分數最高的前 20 筆。回傳各頻道與全伺服器的線上連線數對應表。static int統計全伺服器目前處於「待轉入」狀態的角色總數。static List<CheaterData> 蒐集全頻道的玩家檢舉資料,排序後回傳分數最高的前 20 筆。static String彙整所有頻道目前的線上人數,組成可讀的多行狀態文字。static PlayerStoragegetStorage(int channel) 取得指定頻道(或商城特殊頻道)的玩家儲存區PlayerStorage。static voidhandleCooldowns(MapleCharacter chr, int numTimes, boolean hurt, long now) 對單一角色執行一輪定時的冷卻、回復、異常狀態與寵物維護處理。static void對單一地圖執行一輪重生/維護處理。static booleanhasMerchant(int accountID, int characterID) 判斷指定帳號/角色是否在任一頻道擁有開設中的雇傭商人。static voidinit()預熱(觸碰)各巢狀靜態子系統,強制其靜態初始化區塊先行執行。static booleanisChannelAvailable(int ch) 判斷指定頻道是否存在且仍有空位可供登入。static booleanisCharacterListConnected(List<String> charName) 判斷給定的角色名稱清單中,是否有任一角色目前在任一遊戲頻道上線。static booleanisConnected(String charName) 判斷指定角色名稱目前是否在任一遊戲頻道上線。static final booleanisPlayerSaving(Integer accountid) 查詢指定帳號是否正處於存檔鎖定中。static void註冊全頻道的重生/維護排程任務。static final voidremovePlayerSaving(Integer accountid) 將指定帳號自存檔鎖定清單移除(標記存檔結束)。static voidscheduleRateDelay(String type, long delay) 排程於指定延遲後結束某種雙倍活動,將對應倍率重設為 1 並全頻道公告。static void切換全頻道的大聲公(喇叭)靜音狀態。static void線上時間排程()註冊「在線時間」每分鐘排程:累計全頻道在線角色的在線時間。
-
Field Details
-
isShutDown
public static boolean isShutDown全域關機旗標;於伺服器關閉流程啟動時置為true,供各子系統判斷是否正在停機。
-
-
Constructor Details
-
World
public World()
-
-
Method Details
-
init
public static void init()預熱(觸碰)各巢狀靜態子系統,強制其靜態初始化區塊先行執行。依序輕觸
World.Find、World.Alliance、World.Messenger與World.Party, 使其 static 初始化(含World.Party開機時重置characters.party/fatigue的 DB 寫入) 在伺服器啟動時就完成,而非延遲到首次使用。 -
getStatus
彙整所有頻道目前的線上人數,組成可讀的多行狀態文字。逐一走訪
ChannelServer.getAllInstances(),輸出每個頻道的連線數與全頻道線上總計。- Returns:
- 形如「Channel n: x users」逐行加上線上總人數的狀態字串
-
getConnected
-
getCheaters
蒐集全頻道的作弊嫌疑資料,排序後回傳分數最高的前 20 筆。合併所有
ChannelServer的getCheaters()結果並排序(依CheaterData自然順序), 再截取前 20 筆。- Returns:
- 至多 20 筆作弊嫌疑資料的清單
-
getReports
蒐集全頻道的玩家檢舉資料,排序後回傳分數最高的前 20 筆。合併所有
ChannelServer的getReports()結果並排序,再截取前 20 筆。- Returns:
- 至多 20 筆檢舉資料的清單
-
isConnected
判斷指定角色名稱目前是否在任一遊戲頻道上線。- Parameters:
charName- 角色名稱- Returns:
- 若該角色目前在線上(
World.Find.findChannel(String)回傳大於 0 的頻道)則為true
-
toggleMegaphoneMuteState
public static void toggleMegaphoneMuteState()切換全頻道的大聲公(喇叭)靜音狀態。對每個
ChannelServer呼叫其toggleMegaphoneMuteState(),副作用為改變各頻道喇叭禁用旗標。 -
ChannelChange_Data
準備角色換頻道(前往指定頻道)所需的轉移暫存資料並登記待轉入。將來源連線的暫存 IP、帳號名、原頻道與轉移時間寫入角色的
Transfer暫存欄位, 再向目標頻道的PlayerStorage登記為待轉入玩家(registerPendingPlayer)。 此為跨頻道移動流程的一環,具角色暫存狀態變更與目標頻道狀態登記副作用。- Parameters:
c- 來源用戶端連線chr- 欲轉移的角色toChannel- 目標頻道編號
-
ChannelChange_Data
依角色先前儲存的轉移暫存資料,將連線設回原頻道並登記待轉入。由角色
Transfer暫存欄位讀回原頻道編號,設定到連線後向該頻道的PlayerStorage登記為待轉入玩家。多用於返回原頻道(例如離開商城)的流程, 為前述三參數版本的對應反向操作。- Parameters:
c- 用戶端連線(其頻道會被改寫為暫存中的原頻道)chr- 欲轉回的角色
-
isCharacterListConnected
判斷給定的角色名稱清單中,是否有任一角色目前在任一遊戲頻道上線。逐頻道、逐名稱比對
PlayerStorage.getCharacterByName(String),一旦命中即回傳。- Parameters:
charName- 欲檢查的角色名稱清單- Returns:
- 只要清單中任一角色在線即為
true,否則為false
-
hasMerchant
public static boolean hasMerchant(int accountID, int characterID) 判斷指定帳號/角色是否在任一頻道擁有開設中的雇傭商人。- Parameters:
accountID- 帳號 IDcharacterID- 角色 ID- Returns:
- 任一
ChannelServer含有該雇傭商人則為true
-
getStorage
取得指定頻道(或商城特殊頻道)的玩家儲存區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或其PlayerStorage為null即視為不可用; 否則以連線數是否低於上限判斷——頻道 1 上限為 600、其餘頻道為 400。- Parameters:
ch- 頻道編號- Returns:
- 頻道存在且連線數低於上限則為
true
-
scheduleRateDelay
排程於指定延遲後結束某種雙倍活動,將對應倍率重設為 1 並全頻道公告。透過
Timer.WorldTimer在delay分鐘後執行:依活動類型("經驗"/"掉寶"/"楓幣") 將所有ChannelServer的對應額外倍率(setExExpRate/setExDropRate/setExMesoRate)歸 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
對單一地圖執行一輪重生/維護處理。處理三類週期性事務:地上物到期回收與轉為自由撿取(FFA);地圖可重生時觸發怪物重生並對地圖內每名角色呼叫
handleCooldowns(MapleCharacter, int, boolean, long);以及逐一檢查怪物是否該被清除、該掉落物品或該取消已到期的狀態效果。 含一處針對地圖931000500的特例(jaira hack)使其即使無玩家仍進行處理。由World.Respawn.run()在排程執行緒上呼叫; 具地圖怪物/地上物狀態變更與封包送出副作用。- Parameters:
map- 目標地圖numTimes- 目前累計執行次數(用於分頻處理)size- 呼叫時的地圖角色數(目前未使用)now- 本輪的時間戳(System.currentTimeMillis())
-
handleCooldowns
對單一角色執行一輪定時的冷卻、回復、異常狀態與寵物維護處理。涵蓋多項週期性事務:清除到期技能冷卻並送出
skillCooldown封包;存活時處理龍之血、HP/MP/自然回復、妖精與 持續傷害(DOT);清除到期的異常狀態(disease)。另以numTimes分頻處理:每 7 次累加坐騎疲勞、每 100 次跑寵物排程 (飽食度遞減、到期收回寵物、特殊寵物倒數)。當hurt為真且角色存活時,依地圖設定(含 749040100 迷你地城特例、 HP 防護裝備與HP_LOSS_GUARDbuff)扣血。由handleMap(MapleMap, int, int, long)對地圖內每名角色呼叫;具角色狀態變更與封包送出副作用。- Parameters:
chr- 目標角色numTimes- 目前累計執行次數(用於分頻處理)hurt- 本輪該地圖是否進入扣血時點now- 本輪的時間戳(System.currentTimeMillis())
-
線上時間排程
public static void 線上時間排程()註冊「在線時間」每分鐘排程:累計全頻道在線角色的在線時間。向
Timer.WorldTimer註冊一個每分鐘(延遲 10、間隔 10 分鐘)執行的任務,遍歷全頻道所有在線角色, 對存活者累加在線時間。具角色狀態變更副作用。 -
isPlayerSaving
查詢指定帳號是否正處於存檔鎖定中。於讀鎖(
saveLock.readLock())保護下查存檔鎖定清單;用於避免同一帳號的存檔與換頻道等操作競態。- Parameters:
accountid- 帳號 ID- Returns:
- 該帳號正在存檔則為
true,否則為false
-
addPlayerSaving
將指定帳號加入存檔鎖定清單(標記開始存檔)。於寫鎖(
saveLock.writeLock())保護下加入;應與removePlayerSaving(Integer)成對使用。- Parameters:
accountid- 帳號 ID
-
removePlayerSaving
將指定帳號自存檔鎖定清單移除(標記存檔結束)。於寫鎖(
saveLock.writeLock())保護下移除;與addPlayerSaving(Integer)成對使用。- Parameters:
accountid- 帳號 ID
-
clearChannelChangeDataByAccountId
public static void clearChannelChangeDataByAccountId(int accountid) 清除指定帳號殘留的換頻道/跨伺服器待處理玩家資料。對所有
ChannelServer及商城(-20)、登入轉接(-10)儲存區呼叫deregisterPendingPlayerByAccountId,移除卡在轉移中途的待處理玩家項目;過程中的例外會被吞下並以 debug 等級記錄。 用於登入時清理同帳號的舊有換頻道狀態。具跨頻道狀態移除副作用。- Parameters:
accountid- 帳號 ID
-