Class World.Messenger

java.lang.Object
handling.world.World.Messenger
Enclosing class:
World

public static class World.Messenger extends Object
密語視窗(Maple Messenger)跨頻道協調子系統。

以行程內的 messengers 表(messengerId → MapleMessenger)集中保管所有開啟中的密語視窗, 並提供建立、加入/離開、聊天、邀請等靜態工具方法。成員可能分散於不同頻道,故方法多半透過 World.Find.findChannel(String) 逐一定位每位成員後對其連線送出封包;具跨頻道封包送出與視窗狀態變更副作用。

  • Constructor Details

    • Messenger

      public Messenger()
  • Method Details

    • createMessenger

      public static MapleMessenger createMessenger(MapleMessengerCharacter chrfor)
      建立一個新的密語視窗並登記到行程內的視窗表。

      以原子遞增的方式配發新的 messengerId,建立 MapleMessenger 並放入 messengers, 初始成員為 chrfor。具狀態變更副作用。

      Parameters:
      chrfor - 開啟視窗的起始成員
      Returns:
      新建立的密語視窗
    • declineChat

      public static void declineChat(String target, String namefrom)
      通知目標玩家:某人婉拒了密語視窗邀請。

      於各頻道依名稱定位 target,若其仍開著密語視窗則送出婉拒提示封包(messengerNote 模式 5)。 找不到頻道、角色或對方未開視窗時不做任何事。具封包送出副作用。

      Parameters:
      target - 收到婉拒通知的目標角色名稱
      namefrom - 婉拒者角色名稱
    • getMessenger

      public static MapleMessenger getMessenger(int messengerid)
      依 ID 取得密語視窗。
      Parameters:
      messengerid - 密語視窗 ID
      Returns:
      對應的 MapleMessenger;若不存在則回傳 null
    • leaveMessenger

      public static void leaveMessenger(int messengerid, MapleMessengerCharacter target)
      將成員移出密語視窗,並通知其餘成員移除該成員的顯示位置。

      自視窗移除 target 後,於各頻道定位其餘每位成員並送出 removeMessengerPlayer 封包。 具視窗成員變更與跨頻道封包送出副作用。

      Parameters:
      messengerid - 密語視窗 ID
      target - 離開的成員
      Throws:
      IllegalArgumentException - 當指定 ID 的密語視窗不存在
    • silentLeaveMessenger

      public static void silentLeaveMessenger(int messengerid, MapleMessengerCharacter target)
      將成員自密語視窗靜默移除(不通知其餘成員)。

      僅更新視窗內部成員資料,不送出任何封包。具視窗成員變更副作用。

      Parameters:
      messengerid - 密語視窗 ID
      target - 移除的成員
      Throws:
      IllegalArgumentException - 當指定 ID 的密語視窗不存在
    • silentJoinMessenger

      public static void silentJoinMessenger(int messengerid, MapleMessengerCharacter target)
      將成員靜默加入密語視窗(不通知其餘成員)。

      僅更新視窗內部成員資料,不送出任何封包。具視窗成員變更副作用。

      Parameters:
      messengerid - 密語視窗 ID
      target - 加入的成員
      Throws:
      IllegalArgumentException - 當指定 ID 的密語視窗不存在
    • updateMessenger

      public static void updateMessenger(int messengerid, String namefrom, int fromchannel)
      通知視窗內其餘成員:更新某成員的顯示資料(換頻道/重新整理)。

      對除 namefrom 以外的每位成員,於其所在頻道送出 updateMessengerPlayer 封包, 帶入該成員當前位置與來源頻道(顯示為 fromchannel - 1)。具跨頻道封包送出副作用。

      與其他多數方法不同,本方法對取得的視窗做 null 檢查;若 messengerid 不存在會擲出 NullPointerException

      Parameters:
      messengerid - 密語視窗 ID
      namefrom - 被更新的成員名稱(不會收到自己的更新封包)
      fromchannel - 該成員所在頻道(從 1 起算)
    • joinMessenger

      public static void joinMessenger(int messengerid, MapleMessengerCharacter target, String from, int fromchannel)
      將成員加入密語視窗,並使新成員與既有成員互相看見彼此。

      target 加入視窗後,遍歷所有成員:對既有成員送出 addMessengerPlayer(顯示新加入者)並回送新加入者 既有成員的資訊;對新加入者本人則送出 joinMessenger。各成員於其所在頻道分別定位,具跨頻道封包送出與視窗成員變更副作用。

      Parameters:
      messengerid - 密語視窗 ID
      target - 加入的成員
      from - 加入者角色名稱
      fromchannel - 加入者所在頻道(從 1 起算)
      Throws:
      IllegalArgumentException - 當指定 ID 的密語視窗不存在
    • messengerChat

      public static void messengerChat(int messengerid, String charname, String text, String namefrom)
      將密語視窗聊天訊息送給視窗內其餘成員。

      對除 namefrom 以外的每位成員,於其所在頻道送出 messengerChat 封包。具跨頻道封包送出副作用。

      Parameters:
      messengerid - 密語視窗 ID
      charname - 顯示於聊天的角色名稱
      text - 聊天內容
      namefrom - 發話成員名稱(不會收到自己的訊息)
      Throws:
      IllegalArgumentException - 當指定 ID 的密語視窗不存在
    • messengerInvite

      public static void messengerInvite(String sender, int messengerid, String target, int fromchannel, boolean gm)
      邀請目標玩家加入密語視窗。

      僅當 target 已連線時處理。於各頻道定位目標:若對方尚未加入任何視窗且(非工讀生或邀請者具 GM 權), 則向對方送出邀請封包並回報邀請者成功;對方為工讀生且邀請者非 GM 時回報失敗;對方已在使用密語視窗時回報「對方已在使用」。 具跨頻道封包送出副作用。

      Parameters:
      sender - 邀請者角色名稱
      messengerid - 密語視窗 ID
      target - 受邀目標角色名稱
      fromchannel - 邀請者所在頻道(從 1 起算)
      gm - 邀請者是否具 GM 權限(可邀請工讀生)