Class World.Party
- Enclosing class:
World
以靜態映射集中保管全伺服器的 MapleParty、MapleExpedition 與組隊搜尋清單
(PartySearch),並提供建立/解散、成員異動、組隊/遠征隊聊天與訊息、以及搜尋清單維護等工具方法。
隊伍與遠征隊 ID 由 AtomicInteger 計數器產生。多數方法會先透過 World.Find.findChannel(String)
定位成員所在頻道再送出封包,具跨頻道封包送出與隊伍狀態變更副作用。
靜態初始化區塊會在開機時以一筆 UPDATE 將所有角色的組隊與疲勞值重置
(characters.party = -1, fatigue = 0),並為每種 PartySearchType 建立空搜尋清單。
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidaddSearch(PartySearch ps) 將一筆組隊搜尋加入其類型對應的搜尋清單。static MaplePartycreateParty(MaplePartyCharacter chrfor) 為指定角色建立一個新隊伍並登記到全域隊伍表。static MaplePartycreateParty(MaplePartyCharacter chrfor, int expedId) 為指定角色建立新隊伍,並在遠征隊類型有效時一併建立其所屬遠征隊。static MaplePartycreatePartyAndAdd(MaplePartyCharacter chrfor, int expedId) 在既有遠征隊下建立新隊伍並加入該遠征隊。static MapleExpeditiondisbandExped(int partyid) 解散指定遠征隊及其所有子隊伍。static MaplePartydisbandParty(int partyid) 解散指定隊伍。static void向整個遠征隊廣播聊天訊息。static voidexpedMessage(int expedId, String chattext) 向整個遠征隊送出系統提示訊息。static voidexpedPacket(int expedId, byte[] packet, MaplePartyCharacter exception) 向整個遠征隊送出原始封包,可排除特定成員。static MapleExpeditiongetExped(int partyid) 依遠征隊 ID 取得對應的遠征隊模型。static MaplePartygetParty(int partyid) 依隊伍 ID 取得對應的隊伍模型。static PartySearchgetSearch(MapleParty party) 找出與指定隊伍相符的組隊搜尋。static PartySearchgetSearchByExped(int partyId) 依遠征隊 ID 找出對應的(遠征隊)組隊搜尋。static PartySearchgetSearchByParty(int partyId) 依隊伍 ID 找出對應的(非遠征隊)組隊搜尋。static void向組隊全體成員廣播一般組隊聊天訊息。static void以指定聊天模式向組隊成員廣播聊天訊息(組隊/遠征隊聊天的核心實作)。static booleanpartyListed(MapleParty party) 判斷指定隊伍目前是否已登記於組隊搜尋清單。static voidpartyMessage(int partyid, String chattext) 向組隊全體在線成員送出系統提示訊息。static voidpartyPacket(int partyid, byte[] packet, MaplePartyCharacter exception) 向組隊成員送出原始封包,可排除特定成員。static voidremoveSearch(PartySearch ps, String text) 自搜尋清單移除一筆組隊搜尋,並通知相關隊伍/遠征隊。static List<PartySearch> 取得指定類型目前登記中的組隊搜尋清單。static voidupdateParty(int partyid, PartyOperation operation, MaplePartyCharacter target) 套用一次組隊狀態變更,更新隊伍模型並將結果同步給全體成員。
-
Constructor Details
-
Party
public Party()
-
-
Method Details
-
partyChat
向組隊全體成員廣播一般組隊聊天訊息。等同以聊天模式
1呼叫partyChat(int, String, String, int)。- Parameters:
partyid- 隊伍 IDchattext- 聊天內容namefrom- 寄件者角色名稱
-
expedChat
向整個遠征隊廣播聊天訊息。取得遠征隊後,對其所含每個子隊伍以聊天模式
4呼叫partyChat(int, String, String, int);找不到遠征隊時直接返回。- Parameters:
expedId- 遠征隊 IDchattext- 聊天內容namefrom- 寄件者角色名稱
-
expedPacket
向整個遠征隊送出原始封包,可排除特定成員。取得遠征隊後,對其所含每個子隊伍呼叫
partyPacket(int, byte[], MaplePartyCharacter); 找不到遠征隊時直接返回。具跨頻道封包送出副作用。- Parameters:
expedId- 遠征隊 IDpacket- 欲送出的原始封包位元組exception- 不送出的成員;null表示送給全體
-
partyPacket
向組隊成員送出原始封包,可排除特定成員。逐一在各頻道定位每位成員,對在線且非被排除者送出封包;找不到隊伍時直接返回。 具跨頻道封包送出副作用。
- Parameters:
partyid- 隊伍 IDpacket- 欲送出的原始封包位元組exception- 不送出的成員(以角色 ID 比對);null表示送給全體
-
partyChat
以指定聊天模式向組隊成員廣播聊天訊息(組隊/遠征隊聊天的核心實作)。逐一在各頻道定位每位成員,對在線且非寄件者本人者送出
CField.multiChat(String, String, int)封包。 若某收件者連線正受 GM 監看,會額外透過World.Broadcast.broadcastGMMessage(byte[])對所有 GM 廣播一則監看訊息。 找不到隊伍時直接返回。具跨頻道封包送出與 GM 監看廣播副作用。- Parameters:
partyid- 隊伍 IDchattext- 聊天內容namefrom- 寄件者角色名稱(用於排除其本人並標示來源)mode- 聊天模式(例如1為一般組隊、4為遠征隊)
-
partyMessage
向組隊全體在線成員送出系統提示訊息。逐一在各頻道定位每位成員,對在線者以
dropMessage(5, ...)顯示提示文字; 找不到隊伍時直接返回。具跨頻道訊息送出副作用。- Parameters:
partyid- 隊伍 IDchattext- 提示內容
-
expedMessage
向整個遠征隊送出系統提示訊息。取得遠征隊後,對其所含每個子隊伍呼叫
partyMessage(int, String);找不到遠征隊時直接返回。- Parameters:
expedId- 遠征隊 IDchattext- 提示內容
-
updateParty
套用一次組隊狀態變更,更新隊伍模型並將結果同步給全體成員。依
operation對隊伍模型執行對應動作(PartyOperation):JOIN:加入成員;若隊伍滿 6 人則移除對應的組隊搜尋,遠征隊額滿時亦移除其搜尋。EXPEL/LEAVE:移除成員,並通知該成員清空組隊狀態;若離開者為隊長且仍有成員, 會自動將隊長轉讓給等級最高的成員(以CHANGE_LEADER_DC遞迴呼叫)。DISBAND:解散隊伍。SILENT_UPDATE/LOG_ONOFF:靜默更新成員資訊(跨頻道同步/上下線通知)。CHANGE_LEADER/CHANGE_LEADER_DC:設定新隊長。
PartyPacket.updateParty(int, MapleParty, PartyOperation, MaplePartyCharacter)封包並更新其 隊伍參考;若隊伍屬於遠征隊,另對遠征隊廣播ExpeditionPacket.expeditionUpdate(int, MapleParty)。 找不到隊伍時直接返回(不丟例外)。具隊伍狀態變更、跨頻道封包送出與可能的遞迴解散副作用。- Parameters:
partyid- 隊伍 IDoperation- 欲套用的組隊操作target- 操作對象成員(依操作而為加入/離開/更新/新隊長等角色)- Throws:
RuntimeException- 當operation為未處理的列舉值時
-
createParty
為指定角色建立一個新隊伍並登記到全域隊伍表。以遞增的隊伍 ID 建立
MapleParty,由chrfor擔任隊長。- Parameters:
chrfor- 建立隊伍並擔任隊長的成員- Returns:
- 新建立的
MapleParty
-
createParty
為指定角色建立新隊伍,並在遠征隊類型有效時一併建立其所屬遠征隊。以
expedId解析ExpeditionType:若有效,建立的隊伍會帶有遞增的遠征隊 ID, 並同時建立MapleExpedition、把此隊伍納入其子隊伍清單、登記到全域遠征隊表; 若無效(null),則建立一般隊伍(遠征隊 ID 為-1)。- Parameters:
chrfor- 建立隊伍並擔任隊長的成員expedId- 遠征隊類型 ID;無對應類型時建立一般隊伍- Returns:
- 新建立的
MapleParty
-
createPartyAndAdd
在既有遠征隊下建立新隊伍並加入該遠征隊。以
expedId取得既存的MapleExpedition;若不存在則回傳null。 否則以該遠征隊 ID 建立新MapleParty、登記到全域隊伍表,並納入遠征隊的子隊伍清單。- Parameters:
chrfor- 建立隊伍並擔任隊長的成員expedId- 既存遠征隊的 ID- Returns:
- 新建立的
MapleParty;若指定遠征隊不存在則為null
-
getParty
依隊伍 ID 取得對應的隊伍模型。- Parameters:
partyid- 隊伍 ID- Returns:
- 對應的
MapleParty;不存在時為null
-
getExped
依遠征隊 ID 取得對應的遠征隊模型。- Parameters:
partyid- 遠征隊 ID- Returns:
- 對應的
MapleExpedition;不存在時為null
-
disbandExped
解散指定遠征隊及其所有子隊伍。先移除該遠征隊對應的組隊搜尋(若有,並送出隊長離開的提示),自全域遠征隊表移除後, 對其每個子隊伍以
DISBAND呼叫updateParty(int, PartyOperation, MaplePartyCharacter)。具隊伍/遠征隊狀態變更與跨頻道封包送出副作用。- Parameters:
partyid- 遠征隊 ID- Returns:
- 被移除的
MapleExpedition;原本不存在時為null
-
disbandParty
解散指定隊伍。先移除該隊伍對應的組隊搜尋(若有),自全域隊伍表移除;若隊伍隸屬遠征隊,會自遠征隊子隊伍清單移除該隊 並廣播
ExpeditionPacket.expeditionUpdate(int, MapleParty)。最後呼叫MapleParty.disband()。 具隊伍狀態變更與跨頻道封包送出副作用。- Parameters:
partyid- 隊伍 ID- Returns:
- 被移除的
MapleParty;原本不存在時為null
-
searchParty
取得指定類型目前登記中的組隊搜尋清單。回傳的是內部清單的直接參考(非複本),呼叫端不應自行結構性修改。
- Parameters:
pst- 組隊搜尋類型- Returns:
- 該類型的
PartySearch清單
-
removeSearch
自搜尋清單移除一筆組隊搜尋,並通知相關隊伍/遠征隊。僅當該搜尋確實存在於對應類型清單時才移除並取消其自動移除排程 (
PartySearch.cancelRemoval()),接著依其類型對遠征隊或一般隊伍送出提示訊息 (expedMessage(int, String)/partyMessage(int, String))。具狀態變更與跨頻道訊息送出副作用。- Parameters:
ps- 欲移除的組隊搜尋text- 移除後送給該隊伍/遠征隊的提示文字
-
addSearch
-
getSearch
找出與指定隊伍相符的組隊搜尋。走訪所有類型的搜尋清單,依搜尋類型是否為遠征隊,分別以隊伍 ID 或遠征隊 ID 比對。
- Parameters:
party- 欲查詢的隊伍- Returns:
- 相符的
PartySearch;找不到時為null
-
getSearchByParty
依隊伍 ID 找出對應的(非遠征隊)組隊搜尋。- Parameters:
partyId- 隊伍 ID- Returns:
- 相符且類型非遠征隊的
PartySearch;找不到時為null
-
getSearchByExped
依遠征隊 ID 找出對應的(遠征隊)組隊搜尋。- Parameters:
partyId- 遠征隊 ID- Returns:
- 相符且類型為遠征隊的
PartySearch;找不到時為null
-
partyListed
判斷指定隊伍目前是否已登記於組隊搜尋清單。- Parameters:
party- 欲查詢的隊伍- Returns:
- 該隊伍存在對應的(非遠征隊)組隊搜尋則為
true
-