Class LoginPacket
本類別以靜態方法提供 LoginServer 所需的所有送出封包,包括:
- 連線握手
getHello:寫入遊戲版本(149)、AES-OFB IV 與區服識別碼(台灣 =6)。 - 帳號認證結果
getAuthSuccessRequest/getLoginFailed:登入成功或失敗通知。 - 角色清單
getCharList、角色建立 / 刪除確認、世界 / 頻道選擇。 - 兼職(打工)資訊
getPartTimeJobResult等輔助封包。
所有方法使用 MaplePacketLittleEndianWriter 組裝位元組,
送出 opcode 來自 SendPacketOpcode;角色外觀序列化委由
PacketHelper 完成。
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic final byte[]addNewCharEntry(MapleCharacter chr, boolean worked) 建構新增角色完成的回應封包。static final byte[]charNameResponse(String charname, boolean nameUsed) 建構角色名稱可用性檢查的回應封包。static final byte[]deleteCharResponse(int cid, int state) 建構刪除角色的回應封包。static byte[]建構啟用「推薦世界」功能的封包。static byte[]enableSpecialCreation(int accid, boolean enable) 建構啟用特殊角色(傳說職業)創建的封包。static final byte[]getAuthSuccessRequest(MapleClient client) 建構帳號認證成功的封包。static final byte[]getCharList(String secondpw, List<MapleCharacter> chars, int charslots) 建構角色選擇畫面的角色清單封包。static final byte[]建構伺服器清單結束標記封包。static final byte[]getGenderChanged(MapleClient client) 建構二次密碼設定完成的確認封包。static final byte[]getGenderNeeded(MapleClient client) 建構要求設定二次密碼(性別 / 安全碼初始化)的封包。static final byte[]getHello(short mapleVersion, byte[] sendIv, byte[] recvIv) 建構連線握手封包。static final byte[]建構登入授權(標題畫面背景)封包。static final byte[]getLoginFailed(int reason) 建構登入失敗的封包。static final byte[]建構登入歡迎(活動旗標)封包。static final byte[]getPermBan(byte reason) 建構永久封鎖通知封包。static final byte[]getPing()建構連線存活偵測(Ping)封包。static final byte[]getServerList(int serverId, Map<Integer, Integer> channelLoad) 建構單一世界的伺服器(頻道)清單封包。static final byte[]getServerStatus(int status) 建構世界擁擠程度狀態封包。static final byte[]getTempBan(long timestampTill, byte reason) 建構暫時封鎖通知封包。static final byte[]secondPwError(byte mode) 建構二次密碼錯誤的封包。static byte[]sendRecommended(int world, String message) 建構推薦世界訊息封包。static byte[]showAllCharacter(int chars) 建構「檢視全部角色」模式的角色總數封包。static byte[]showAllCharacterInfo(int worldid, List<MapleCharacter> chars, String pic) 建構「檢視全部角色」模式中單一世界的角色明細封包。static byte[]updatePartTimeJob(PartTimeJob partTime) 建構更新兼職(打工)資訊的封包。
-
Constructor Details
-
LoginPacket
public LoginPacket()
-
-
Method Details
-
getHello
public static final byte[] getHello(short mapleVersion, byte[] sendIv, byte[] recvIv) 建構連線握手封包。於用戶端連上
LoginServer時最先送出,依序寫入封包長度、 遊戲版本(149)、版本修補字串(ServerConstants.MAPLE_PATCH)、 AES-OFB 收 / 送 IV,以及區服識別碼(6= 台灣)。此封包專屬於 149.1 用戶端。- Parameters:
mapleVersion- 遊戲主版本號sendIv- 伺服器送出方向的 AES-OFB 初始向量recvIv- 伺服器接收方向的 AES-OFB 初始向量- Returns:
- 封包位元組陣列
-
getPing
public static final byte[] getPing()建構連線存活偵測(Ping)封包。僅寫入
SendPacketOpcode.PINGopcode,用以要求用戶端回應 Pong。- Returns:
- 封包位元組陣列
-
getLoginAUTH
public static final byte[] getLoginAUTH()建構登入授權(標題畫面背景)封包。寫入
SendPacketOpcode.LOGIN_AUTHopcode 後, 自背景清單(MapLogin~MapLogin4)隨機挑選一張作為登入畫面背景, 再附上目前日期(GameConstants.getCurrentDate())。因背景以
Math.random()抽選,輸出為非確定性。- Returns:
- 封包位元組陣列
-
getGenderNeeded
建構要求設定二次密碼(性別 / 安全碼初始化)的封包。寫入
SendPacketOpcode.GET_SET_SECOND_PASSWORDopcode 與旗標1, 通知用戶端開啟設定流程。傳入的client目前未序列化進封包。- Parameters:
client- 觸發此封包的用戶端連線- Returns:
- 封包位元組陣列
-
getGenderChanged
建構二次密碼設定完成的確認封包。寫入
SendPacketOpcode.SECOND_PASSWORD_SETopcode 與旗標1, 告知用戶端設定已生效。傳入的client目前未序列化進封包。- Parameters:
client- 觸發此封包的用戶端連線- Returns:
- 封包位元組陣列
-
getAuthSuccessRequest
建構帳號認證成功的封包。寫入
SendPacketOpcode.LOGIN_STATUSopcode 與成功狀態碼0, 並讀取client序列化帳號相關資訊:帳號編號(MapleClient.getAccID())、 性別(MapleClient.getGender())、GM 權限位元(MapleClient.isGm())與 帳號名稱(MapleClient.getAccountName())。- Parameters:
client- 通過認證的用戶端連線- Returns:
- 封包位元組陣列
-
getLoginFailed
public static final byte[] getLoginFailed(int reason) 建構登入失敗的封包。寫入
SendPacketOpcode.LOGIN_STATUSopcode 與失敗原因碼, 用戶端依碼顯示對應訊息,常見值如:4— 密碼錯誤。5— 帳號未註冊。7— 帳號已在線上。2/3— 帳號遭刪除或封鎖。
- Parameters:
reason- 登入失敗原因碼- Returns:
- 封包位元組陣列
-
getPermBan
public static final byte[] getPermBan(byte reason) 建構永久封鎖通知封包。寫入
SendPacketOpcode.LOGIN_STATUSopcode 與帳號封鎖狀態碼2, 附上封鎖原因碼,用戶端據此顯示永久停權訊息。- Parameters:
reason- 封鎖原因碼- Returns:
- 封包位元組陣列
-
getTempBan
public static final byte[] getTempBan(long timestampTill, byte reason) 建構暫時封鎖通知封包。寫入
SendPacketOpcode.LOGIN_STATUSopcode 與封鎖狀態碼2、 封鎖原因碼,以及解封時間戳。解封時間以 64 位元 long 表示, 為自 1601/1/1 起算的 100 奈秒間隔數。- Parameters:
timestampTill- 解封時間戳(自 1601/1/1 起算的 100 奈秒間隔數)reason- 封鎖原因碼- Returns:
- 封包位元組陣列
-
deleteCharResponse
public static final byte[] deleteCharResponse(int cid, int state) 建構刪除角色的回應封包。寫入
SendPacketOpcode.DELETE_CHAR_RESPONSEopcode、目標角色編號與結果狀態碼 (0表成功),用戶端據此更新角色清單。- Parameters:
cid- 欲刪除的角色編號state- 刪除結果狀態碼(0為成功)- Returns:
- 封包位元組陣列
-
secondPwError
public static final byte[] secondPwError(byte mode) 建構二次密碼錯誤的封包。寫入
SendPacketOpcode.SECONDPW_ERRORopcode 與錯誤模式碼, 通知用戶端二次密碼驗證失敗。- Parameters:
mode- 錯誤模式碼- Returns:
- 封包位元組陣列
-
enableRecommended
public static byte[] enableRecommended()建構啟用「推薦世界」功能的封包。寫入
SendPacketOpcode.ENABLE_RECOMMENDEDopcode 與一個世界編號欄位, 用以開啟世界選擇畫面的推薦提示。- Returns:
- 封包位元組陣列
-
sendRecommended
建構推薦世界訊息封包。寫入
SendPacketOpcode.SEND_RECOMMENDEDopcode; 當message非null時附上推薦世界編號與推薦訊息文字, 顯示於世界選擇畫面。- Parameters:
world- 推薦的世界編號message- 推薦訊息文字,為null時不附帶任何訊息- Returns:
- 封包位元組陣列
-
getServerList
建構單一世界的伺服器(頻道)清單封包。寫入
SendPacketOpcode.SERVERLISTopcode 後序列化該世界資訊,並讀取LoginServer取得世界名稱、旗標與事件訊息;接著依channelLoad逐一寫入各頻道名稱與人數負載(缺漏頻道以1200視為滿載),最後附上 登入畫面氣球公告(GameConstants.getBalloons())。- Parameters:
serverId- 世界(伺服器)編號channelLoad- 各頻道編號對應的目前人數負載- Returns:
- 封包位元組陣列
-
getEndOfServerList
public static final byte[] getEndOfServerList()建構伺服器清單結束標記封包。於送完所有
getServerList(int, Map)後送出,寫入SendPacketOpcode.SERVERLISTopcode 與終止標記-1, 通知用戶端世界清單已傳送完畢。- Returns:
- 封包位元組陣列
-
getLoginWelcome
public static final byte[] getLoginWelcome()建構登入歡迎(活動旗標)封包。組裝一份活動旗標清單後委由
CField.spawnFlags(java.util.List)產生封包; 目前清單為空(旗標項目皆已註解停用)。- Returns:
- 封包位元組陣列
-
getServerStatus
public static final byte[] getServerStatus(int status) 建構世界擁擠程度狀態封包。寫入
SendPacketOpcode.SERVERSTATUSopcode 與狀態碼:0正常、1擁擠、2已滿;用戶端據此顯示對應的世界負載提示。- Parameters:
status- 世界擁擠程度狀態碼(0正常/1擁擠/2已滿)- Returns:
- 封包位元組陣列
-
getCharList
建構角色選擇畫面的角色清單封包。寫入
SendPacketOpcode.CHARLISTopcode 後逐一序列化每個角色 (等級達 30 且非 GM 者顯示排名資訊),再附上二次密碼需求旗標與可用角色欄位數charslots。- Parameters:
secondpw- 帳號二次密碼設定狀態chars- 該帳號於此世界的角色清單charslots- 可用的角色欄位數量- Returns:
- 封包位元組陣列
-
addNewCharEntry
建構新增角色完成的回應封包。寫入
SendPacketOpcode.ADD_NEW_CHAR_ENTRYopcode 與結果旗標 (worked為true寫入0表成功),成功時序列化新角色資料以加入清單。- Parameters:
chr- 新建立的角色worked- 角色建立是否成功- Returns:
- 封包位元組陣列
-
charNameResponse
建構角色名稱可用性檢查的回應封包。寫入
SendPacketOpcode.CHAR_NAME_RESPONSEopcode、欲檢查的名稱與 是否已被使用旗標(nameUsed為true寫入1表名稱不可用)。- Parameters:
charname- 欲檢查的角色名稱nameUsed- 該名稱是否已被使用(true表已被佔用)- Returns:
- 封包位元組陣列
-
showAllCharacter
public static byte[] showAllCharacter(int chars) 建構「檢視全部角色」模式的角色總數封包。寫入
SendPacketOpcode.ALL_CHARLISTopcode、是否含角色旗標1、 角色總數,以及補滿為 3 倍數的版面列數,供用戶端配置跨世界角色一覽畫面。- Parameters:
chars- 全部角色的總數- Returns:
- 封包位元組陣列
-
showAllCharacterInfo
建構「檢視全部角色」模式中單一世界的角色明細封包。寫入
SendPacketOpcode.ALL_CHARLISTopcode、結果碼 (清單為空時寫入5表查無角色)、世界編號與角色數,並逐一序列化各角色(含排名資訊), 最後依pic狀態寫入 PIC 需求旗標(2表停用 PIC)。- Parameters:
worldid- 此批角色所屬的世界編號chars- 該世界的角色清單pic- 帳號的個人識別碼(PIC)狀態;null表未設定、空字串表停用- Returns:
- 封包位元組陣列
-
enableSpecialCreation
public static byte[] enableSpecialCreation(int accid, boolean enable) 建構啟用特殊角色(傳說職業)創建的封包。寫入
SendPacketOpcode.SPECIAL_CREATIONopcode、帳號編號與啟用旗標 (enable為true寫入0表開放),並附上已創建傳說職業數量欄位。- Parameters:
accid- 目標帳號編號enable- 是否開放特殊角色創建- Returns:
- 封包位元組陣列
-
updatePartTimeJob
建構更新兼職(打工)資訊的封包。寫入
SendPacketOpcode.PART_TIMEopcode 與所屬角色編號 (PartTimeJob.getCharacterId()),再委由PacketHelper.addPartTimeJob(tools.data.MaplePacketLittleEndianWriter, client.PartTimeJob)序列化兼職詳細狀態。- Parameters:
partTime- 欲同步至用戶端的兼職資料- Returns:
- 封包位元組陣列
-