Class LoginPacket

java.lang.Object
tools.packet.LoginPacket

public class LoginPacket extends Object
登入流程相關封包的建構器,涵蓋握手到角色選擇的全部回應。

本類別以靜態方法提供 LoginServer 所需的所有送出封包,包括:

  • 連線握手 getHello:寫入遊戲版本(149)、AES-OFB IV 與區服識別碼(台灣 = 6)。
  • 帳號認證結果 getAuthSuccessRequest / getLoginFailed:登入成功或失敗通知。
  • 角色清單 getCharList、角色建立 / 刪除確認、世界 / 頻道選擇。
  • 兼職(打工)資訊 getPartTimeJobResult 等輔助封包。

所有方法使用 MaplePacketLittleEndianWriter 組裝位元組, 送出 opcode 來自 SendPacketOpcode;角色外觀序列化委由 PacketHelper 完成。

  • 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.PING opcode,用以要求用戶端回應 Pong。

      Returns:
      封包位元組陣列
    • getLoginAUTH

      public static final byte[] getLoginAUTH()
      建構登入授權(標題畫面背景)封包。

      寫入 SendPacketOpcode.LOGIN_AUTH opcode 後, 自背景清單(MapLoginMapLogin4)隨機挑選一張作為登入畫面背景, 再附上目前日期(GameConstants.getCurrentDate())。

      因背景以 Math.random() 抽選,輸出為非確定性。

      Returns:
      封包位元組陣列
    • getGenderNeeded

      public static final byte[] getGenderNeeded(MapleClient client)
      建構要求設定二次密碼(性別 / 安全碼初始化)的封包。

      寫入 SendPacketOpcode.GET_SET_SECOND_PASSWORD opcode 與旗標 1, 通知用戶端開啟設定流程。傳入的 client 目前未序列化進封包。

      Parameters:
      client - 觸發此封包的用戶端連線
      Returns:
      封包位元組陣列
    • getGenderChanged

      public static final byte[] getGenderChanged(MapleClient client)
      建構二次密碼設定完成的確認封包。

      寫入 SendPacketOpcode.SECOND_PASSWORD_SET opcode 與旗標 1, 告知用戶端設定已生效。傳入的 client 目前未序列化進封包。

      Parameters:
      client - 觸發此封包的用戶端連線
      Returns:
      封包位元組陣列
    • getAuthSuccessRequest

      public static final byte[] getAuthSuccessRequest(MapleClient client)
      建構帳號認證成功的封包。

      寫入 SendPacketOpcode.LOGIN_STATUS opcode 與成功狀態碼 0, 並讀取 client 序列化帳號相關資訊:帳號編號(MapleClient.getAccID())、 性別(MapleClient.getGender())、GM 權限位元(MapleClient.isGm())與 帳號名稱(MapleClient.getAccountName())。

      Parameters:
      client - 通過認證的用戶端連線
      Returns:
      封包位元組陣列
    • getLoginFailed

      public static final byte[] getLoginFailed(int reason)
      建構登入失敗的封包。

      寫入 SendPacketOpcode.LOGIN_STATUS opcode 與失敗原因碼, 用戶端依碼顯示對應訊息,常見值如:

      • 4 — 密碼錯誤。
      • 5 — 帳號未註冊。
      • 7 — 帳號已在線上。
      • 23 — 帳號遭刪除或封鎖。
      Parameters:
      reason - 登入失敗原因碼
      Returns:
      封包位元組陣列
    • getPermBan

      public static final byte[] getPermBan(byte reason)
      建構永久封鎖通知封包。

      寫入 SendPacketOpcode.LOGIN_STATUS opcode 與帳號封鎖狀態碼 2, 附上封鎖原因碼,用戶端據此顯示永久停權訊息。

      Parameters:
      reason - 封鎖原因碼
      Returns:
      封包位元組陣列
    • getTempBan

      public static final byte[] getTempBan(long timestampTill, byte reason)
      建構暫時封鎖通知封包。

      寫入 SendPacketOpcode.LOGIN_STATUS opcode 與封鎖狀態碼 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_RESPONSE opcode、目標角色編號與結果狀態碼 (0 表成功),用戶端據此更新角色清單。

      Parameters:
      cid - 欲刪除的角色編號
      state - 刪除結果狀態碼(0 為成功)
      Returns:
      封包位元組陣列
    • secondPwError

      public static final byte[] secondPwError(byte mode)
      建構二次密碼錯誤的封包。

      寫入 SendPacketOpcode.SECONDPW_ERROR opcode 與錯誤模式碼, 通知用戶端二次密碼驗證失敗。

      Parameters:
      mode - 錯誤模式碼
      Returns:
      封包位元組陣列
    • enableRecommended

      public static byte[] enableRecommended()
      建構啟用「推薦世界」功能的封包。

      寫入 SendPacketOpcode.ENABLE_RECOMMENDED opcode 與一個世界編號欄位, 用以開啟世界選擇畫面的推薦提示。

      Returns:
      封包位元組陣列
    • sendRecommended

      public static byte[] sendRecommended(int world, String message)
      建構推薦世界訊息封包。

      寫入 SendPacketOpcode.SEND_RECOMMENDED opcode; 當 messagenull 時附上推薦世界編號與推薦訊息文字, 顯示於世界選擇畫面。

      Parameters:
      world - 推薦的世界編號
      message - 推薦訊息文字,為 null 時不附帶任何訊息
      Returns:
      封包位元組陣列
    • getServerList

      public static final byte[] getServerList(int serverId, Map<Integer,Integer> channelLoad)
      建構單一世界的伺服器(頻道)清單封包。

      寫入 SendPacketOpcode.SERVERLIST opcode 後序列化該世界資訊,並讀取 LoginServer 取得世界名稱、旗標與事件訊息;接著依 channelLoad 逐一寫入各頻道名稱與人數負載(缺漏頻道以 1200 視為滿載),最後附上 登入畫面氣球公告(GameConstants.getBalloons())。

      Parameters:
      serverId - 世界(伺服器)編號
      channelLoad - 各頻道編號對應的目前人數負載
      Returns:
      封包位元組陣列
    • getEndOfServerList

      public static final byte[] getEndOfServerList()
      建構伺服器清單結束標記封包。

      於送完所有 getServerList(int, Map) 後送出,寫入 SendPacketOpcode.SERVERLIST opcode 與終止標記 -1, 通知用戶端世界清單已傳送完畢。

      Returns:
      封包位元組陣列
    • getLoginWelcome

      public static final byte[] getLoginWelcome()
      建構登入歡迎(活動旗標)封包。

      組裝一份活動旗標清單後委由 CField.spawnFlags(java.util.List) 產生封包; 目前清單為空(旗標項目皆已註解停用)。

      Returns:
      封包位元組陣列
    • getServerStatus

      public static final byte[] getServerStatus(int status)
      建構世界擁擠程度狀態封包。

      寫入 SendPacketOpcode.SERVERSTATUS opcode 與狀態碼: 0 正常、1 擁擠、2 已滿;用戶端據此顯示對應的世界負載提示。

      Parameters:
      status - 世界擁擠程度狀態碼(0 正常/1 擁擠/2 已滿)
      Returns:
      封包位元組陣列
    • getCharList

      public static final byte[] getCharList(String secondpw, List<MapleCharacter> chars, int charslots)
      建構角色選擇畫面的角色清單封包。

      寫入 SendPacketOpcode.CHARLIST opcode 後逐一序列化每個角色 (等級達 30 且非 GM 者顯示排名資訊),再附上二次密碼需求旗標與可用角色欄位數 charslots

      Parameters:
      secondpw - 帳號二次密碼設定狀態
      chars - 該帳號於此世界的角色清單
      charslots - 可用的角色欄位數量
      Returns:
      封包位元組陣列
    • addNewCharEntry

      public static final byte[] addNewCharEntry(MapleCharacter chr, boolean worked)
      建構新增角色完成的回應封包。

      寫入 SendPacketOpcode.ADD_NEW_CHAR_ENTRY opcode 與結果旗標 (workedtrue 寫入 0 表成功),成功時序列化新角色資料以加入清單。

      Parameters:
      chr - 新建立的角色
      worked - 角色建立是否成功
      Returns:
      封包位元組陣列
    • charNameResponse

      public static final byte[] charNameResponse(String charname, boolean nameUsed)
      建構角色名稱可用性檢查的回應封包。

      寫入 SendPacketOpcode.CHAR_NAME_RESPONSE opcode、欲檢查的名稱與 是否已被使用旗標(nameUsedtrue 寫入 1 表名稱不可用)。

      Parameters:
      charname - 欲檢查的角色名稱
      nameUsed - 該名稱是否已被使用(true 表已被佔用)
      Returns:
      封包位元組陣列
    • showAllCharacter

      public static byte[] showAllCharacter(int chars)
      建構「檢視全部角色」模式的角色總數封包。

      寫入 SendPacketOpcode.ALL_CHARLIST opcode、是否含角色旗標 1、 角色總數,以及補滿為 3 倍數的版面列數,供用戶端配置跨世界角色一覽畫面。

      Parameters:
      chars - 全部角色的總數
      Returns:
      封包位元組陣列
    • showAllCharacterInfo

      public static byte[] showAllCharacterInfo(int worldid, List<MapleCharacter> chars, String pic)
      建構「檢視全部角色」模式中單一世界的角色明細封包。

      寫入 SendPacketOpcode.ALL_CHARLIST opcode、結果碼 (清單為空時寫入 5 表查無角色)、世界編號與角色數,並逐一序列化各角色(含排名資訊), 最後依 pic 狀態寫入 PIC 需求旗標(2 表停用 PIC)。

      Parameters:
      worldid - 此批角色所屬的世界編號
      chars - 該世界的角色清單
      pic - 帳號的個人識別碼(PIC)狀態;null 表未設定、空字串表停用
      Returns:
      封包位元組陣列
    • enableSpecialCreation

      public static byte[] enableSpecialCreation(int accid, boolean enable)
      建構啟用特殊角色(傳說職業)創建的封包。

      寫入 SendPacketOpcode.SPECIAL_CREATION opcode、帳號編號與啟用旗標 (enabletrue 寫入 0 表開放),並附上已創建傳說職業數量欄位。

      Parameters:
      accid - 目標帳號編號
      enable - 是否開放特殊角色創建
      Returns:
      封包位元組陣列
    • updatePartTimeJob

      public static byte[] updatePartTimeJob(PartTimeJob partTime)
      建構更新兼職(打工)資訊的封包。

      寫入 SendPacketOpcode.PART_TIME opcode 與所屬角色編號 (PartTimeJob.getCharacterId()),再委由 PacketHelper.addPartTimeJob(tools.data.MaplePacketLittleEndianWriter, client.PartTimeJob) 序列化兼職詳細狀態。

      Parameters:
      partTime - 欲同步至用戶端的兼職資料
      Returns:
      封包位元組陣列