Class World.Party

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

public static class World.Party extends Object
組隊(Party)與遠征隊(Expedition)跨頻道協調子系統。

以靜態映射集中保管全伺服器的 MaplePartyMapleExpedition 與組隊搜尋清單 (PartySearch),並提供建立/解散、成員異動、組隊/遠征隊聊天與訊息、以及搜尋清單維護等工具方法。 隊伍與遠征隊 ID 由 AtomicInteger 計數器產生。多數方法會先透過 World.Find.findChannel(String) 定位成員所在頻道再送出封包,具跨頻道封包送出與隊伍狀態變更副作用。

靜態初始化區塊會在開機時以一筆 UPDATE 將所有角色的組隊與疲勞值重置 (characters.party = -1, fatigue = 0),並為每種 PartySearchType 建立空搜尋清單。

  • Constructor Details

    • Party

      public Party()
  • Method Details

    • partyChat

      public static void partyChat(int partyid, String chattext, String namefrom)
      向組隊全體成員廣播一般組隊聊天訊息。

      等同以聊天模式 1 呼叫 partyChat(int, String, String, int)

      Parameters:
      partyid - 隊伍 ID
      chattext - 聊天內容
      namefrom - 寄件者角色名稱
    • expedChat

      public static void expedChat(int expedId, String chattext, String namefrom)
      向整個遠征隊廣播聊天訊息。

      取得遠征隊後,對其所含每個子隊伍以聊天模式 4 呼叫 partyChat(int, String, String, int);找不到遠征隊時直接返回。

      Parameters:
      expedId - 遠征隊 ID
      chattext - 聊天內容
      namefrom - 寄件者角色名稱
    • expedPacket

      public static void expedPacket(int expedId, byte[] packet, MaplePartyCharacter exception)
      向整個遠征隊送出原始封包,可排除特定成員。

      取得遠征隊後,對其所含每個子隊伍呼叫 partyPacket(int, byte[], MaplePartyCharacter); 找不到遠征隊時直接返回。具跨頻道封包送出副作用。

      Parameters:
      expedId - 遠征隊 ID
      packet - 欲送出的原始封包位元組
      exception - 不送出的成員;null 表示送給全體
    • partyPacket

      public static void partyPacket(int partyid, byte[] packet, MaplePartyCharacter exception)
      向組隊成員送出原始封包,可排除特定成員。

      逐一在各頻道定位每位成員,對在線且非被排除者送出封包;找不到隊伍時直接返回。 具跨頻道封包送出副作用。

      Parameters:
      partyid - 隊伍 ID
      packet - 欲送出的原始封包位元組
      exception - 不送出的成員(以角色 ID 比對);null 表示送給全體
    • partyChat

      public static void partyChat(int partyid, String chattext, String namefrom, int mode)
      以指定聊天模式向組隊成員廣播聊天訊息(組隊/遠征隊聊天的核心實作)。

      逐一在各頻道定位每位成員,對在線且非寄件者本人者送出 CField.multiChat(String, String, int) 封包。 若某收件者連線正受 GM 監看,會額外透過 World.Broadcast.broadcastGMMessage(byte[]) 對所有 GM 廣播一則監看訊息。 找不到隊伍時直接返回。具跨頻道封包送出與 GM 監看廣播副作用。

      Parameters:
      partyid - 隊伍 ID
      chattext - 聊天內容
      namefrom - 寄件者角色名稱(用於排除其本人並標示來源)
      mode - 聊天模式(例如 1 為一般組隊、4 為遠征隊)
    • partyMessage

      public static void partyMessage(int partyid, String chattext)
      向組隊全體在線成員送出系統提示訊息。

      逐一在各頻道定位每位成員,對在線者以 dropMessage(5, ...) 顯示提示文字; 找不到隊伍時直接返回。具跨頻道訊息送出副作用。

      Parameters:
      partyid - 隊伍 ID
      chattext - 提示內容
    • expedMessage

      public static void expedMessage(int expedId, String chattext)
      向整個遠征隊送出系統提示訊息。

      取得遠征隊後,對其所含每個子隊伍呼叫 partyMessage(int, String);找不到遠征隊時直接返回。

      Parameters:
      expedId - 遠征隊 ID
      chattext - 提示內容
    • updateParty

      public static void updateParty(int partyid, PartyOperation operation, MaplePartyCharacter target)
      套用一次組隊狀態變更,更新隊伍模型並將結果同步給全體成員。

      operation 對隊伍模型執行對應動作(PartyOperation):

      • JOIN:加入成員;若隊伍滿 6 人則移除對應的組隊搜尋,遠征隊額滿時亦移除其搜尋。
      • EXPELLEAVE:移除成員,並通知該成員清空組隊狀態;若離開者為隊長且仍有成員, 會自動將隊長轉讓給等級最高的成員(以 CHANGE_LEADER_DC 遞迴呼叫)。
      • DISBAND:解散隊伍。
      • SILENT_UPDATELOG_ONOFF:靜默更新成員資訊(跨頻道同步/上下線通知)。
      • CHANGE_LEADERCHANGE_LEADER_DC:設定新隊長。
      處理後若成員數歸零會自動解散。最後逐一在各頻道對在線成員送出 PartyPacket.updateParty(int, MapleParty, PartyOperation, MaplePartyCharacter) 封包並更新其 隊伍參考;若隊伍屬於遠征隊,另對遠征隊廣播 ExpeditionPacket.expeditionUpdate(int, MapleParty)。 找不到隊伍時直接返回(不丟例外)。具隊伍狀態變更、跨頻道封包送出與可能的遞迴解散副作用。
      Parameters:
      partyid - 隊伍 ID
      operation - 欲套用的組隊操作
      target - 操作對象成員(依操作而為加入/離開/更新/新隊長等角色)
      Throws:
      RuntimeException - 當 operation 為未處理的列舉值時
    • createParty

      public static MapleParty createParty(MaplePartyCharacter chrfor)
      為指定角色建立一個新隊伍並登記到全域隊伍表。

      以遞增的隊伍 ID 建立 MapleParty,由 chrfor 擔任隊長。

      Parameters:
      chrfor - 建立隊伍並擔任隊長的成員
      Returns:
      新建立的 MapleParty
    • createParty

      public static MapleParty createParty(MaplePartyCharacter chrfor, int expedId)
      為指定角色建立新隊伍,並在遠征隊類型有效時一併建立其所屬遠征隊。

      expedId 解析 ExpeditionType:若有效,建立的隊伍會帶有遞增的遠征隊 ID, 並同時建立 MapleExpedition、把此隊伍納入其子隊伍清單、登記到全域遠征隊表; 若無效(null),則建立一般隊伍(遠征隊 ID 為 -1)。

      Parameters:
      chrfor - 建立隊伍並擔任隊長的成員
      expedId - 遠征隊類型 ID;無對應類型時建立一般隊伍
      Returns:
      新建立的 MapleParty
    • createPartyAndAdd

      public static MapleParty createPartyAndAdd(MaplePartyCharacter chrfor, int expedId)
      在既有遠征隊下建立新隊伍並加入該遠征隊。

      expedId 取得既存的 MapleExpedition;若不存在則回傳 null。 否則以該遠征隊 ID 建立新 MapleParty、登記到全域隊伍表,並納入遠征隊的子隊伍清單。

      Parameters:
      chrfor - 建立隊伍並擔任隊長的成員
      expedId - 既存遠征隊的 ID
      Returns:
      新建立的 MapleParty;若指定遠征隊不存在則為 null
    • getParty

      public static MapleParty getParty(int partyid)
      依隊伍 ID 取得對應的隊伍模型。
      Parameters:
      partyid - 隊伍 ID
      Returns:
      對應的 MapleParty;不存在時為 null
    • getExped

      public static MapleExpedition getExped(int partyid)
      依遠征隊 ID 取得對應的遠征隊模型。
      Parameters:
      partyid - 遠征隊 ID
      Returns:
      對應的 MapleExpedition;不存在時為 null
    • disbandExped

      public static MapleExpedition disbandExped(int partyid)
      解散指定遠征隊及其所有子隊伍。

      先移除該遠征隊對應的組隊搜尋(若有,並送出隊長離開的提示),自全域遠征隊表移除後, 對其每個子隊伍以 DISBAND 呼叫 updateParty(int, PartyOperation, MaplePartyCharacter)。具隊伍/遠征隊狀態變更與跨頻道封包送出副作用。

      Parameters:
      partyid - 遠征隊 ID
      Returns:
      被移除的 MapleExpedition;原本不存在時為 null
    • disbandParty

      public static MapleParty disbandParty(int partyid)
      解散指定隊伍。

      先移除該隊伍對應的組隊搜尋(若有),自全域隊伍表移除;若隊伍隸屬遠征隊,會自遠征隊子隊伍清單移除該隊 並廣播 ExpeditionPacket.expeditionUpdate(int, MapleParty)。最後呼叫 MapleParty.disband()。 具隊伍狀態變更與跨頻道封包送出副作用。

      Parameters:
      partyid - 隊伍 ID
      Returns:
      被移除的 MapleParty;原本不存在時為 null
    • searchParty

      public static List<PartySearch> searchParty(PartySearchType pst)
      取得指定類型目前登記中的組隊搜尋清單。

      回傳的是內部清單的直接參考(非複本),呼叫端不應自行結構性修改。

      Parameters:
      pst - 組隊搜尋類型
      Returns:
      該類型的 PartySearch 清單
    • removeSearch

      public static void removeSearch(PartySearch ps, String text)
      自搜尋清單移除一筆組隊搜尋,並通知相關隊伍/遠征隊。

      僅當該搜尋確實存在於對應類型清單時才移除並取消其自動移除排程 (PartySearch.cancelRemoval()),接著依其類型對遠征隊或一般隊伍送出提示訊息 (expedMessage(int, String)partyMessage(int, String))。具狀態變更與跨頻道訊息送出副作用。

      Parameters:
      ps - 欲移除的組隊搜尋
      text - 移除後送給該隊伍/遠征隊的提示文字
    • addSearch

      public static void addSearch(PartySearch ps)
      將一筆組隊搜尋加入其類型對應的搜尋清單。
      Parameters:
      ps - 欲新增的組隊搜尋
    • getSearch

      public static PartySearch getSearch(MapleParty party)
      找出與指定隊伍相符的組隊搜尋。

      走訪所有類型的搜尋清單,依搜尋類型是否為遠征隊,分別以隊伍 ID 或遠征隊 ID 比對。

      Parameters:
      party - 欲查詢的隊伍
      Returns:
      相符的 PartySearch;找不到時為 null
    • getSearchByParty

      public static PartySearch getSearchByParty(int partyId)
      依隊伍 ID 找出對應的(非遠征隊)組隊搜尋。
      Parameters:
      partyId - 隊伍 ID
      Returns:
      相符且類型非遠征隊的 PartySearch;找不到時為 null
    • getSearchByExped

      public static PartySearch getSearchByExped(int partyId)
      依遠征隊 ID 找出對應的(遠征隊)組隊搜尋。
      Parameters:
      partyId - 遠征隊 ID
      Returns:
      相符且類型為遠征隊的 PartySearch;找不到時為 null
    • partyListed

      public static boolean partyListed(MapleParty party)
      判斷指定隊伍目前是否已登記於組隊搜尋清單。
      Parameters:
      party - 欲查詢的隊伍
      Returns:
      該隊伍存在對應的(非遠征隊)組隊搜尋則為 true