Class NPCConversationManager

java.lang.Object
scripting.AbstractPlayerInteraction
scripting.NPCConversationManager

public class NPCConversationManager extends AbstractPlayerInteraction
單一 NPC 對話階段的狀態與 API 介面,於腳本中以全域 cm 暴露。

NPCScriptManager 為每個對話中的 MapleClient 建立,承襲腳本共用基底 AbstractPlayerInteraction,並在其上提供完整的對話框 API:sendNext(String)sendNextPrev(String)sendOk(String)sendYesNo(String)sendAcceptDecline(String)sendSimple(String)(選單)/ sendGetText(String)sendGetNumber(String, int, int, int)(輸入),以及 dispose() 結束對話。

對話視窗由 NPCPacket 組裝送出;type 區分 NPC/開始任務/完成任務, lastMsg 記錄前一個對話型別以驗證玩家回應。除一般 NPC 對話外,亦承載任務、商城、公會、抽獎 (MapleGachapon)等大量遊戲內互動,是 GraalJS 腳本最主要的伺服端入口。

  • Field Details

  • Constructor Details

    • NPCConversationManager

      public NPCConversationManager(MapleClient c, Invocable iv, String script, int npc, int mode, int questid, byte type)
      建立一個 NPC 對話階段管理器。

      NPCScriptManager 在啟動腳本時建構。承襲 AbstractPlayerInteraction 的玩家互動基底, 並記錄此對話的 GraalJS Invocable、互動模式與型別;若玩家存在,會同步設定其目前互動的 NPC (MapleCharacter.setNpcNow(int))。

      Parameters:
      c - 觸發此對話的客戶端連線
      iv - 已載入腳本、可呼叫 startactionInvocable
      script - 腳本識別名稱
      npc - NPC 模板 id
      mode - 互動模式
      questid - 關聯的任務 id(無則為 0)
      type - 對話型別:-1 = NPC、0 = 開始任務、1 = 完成任務
  • Method Details

    • getIv

      public Invocable getIv()
      取得此對話載入的 GraalJS Invocable,供再次呼叫腳本的 action 等進入點。
      Returns:
      此對話階段的腳本 Invocable
    • getNpc

      public int getNpc()
      取得此對話所屬的 NPC 模板 id。
      Overrides:
      getNpc in class AbstractPlayerInteraction
      Returns:
      NPC 模板 id
    • getQuest

      public int getQuest()
      取得此對話關聯的任務 id。
      Returns:
      任務 id(無則為 0)
    • getType

      public byte getType()
      取得此對話的型別。
      Returns:
      對話型別:-1 = NPC、0 = 開始任務、1 = 完成任務
    • safeDispose

      public void safeDispose()
      標記此對話為待結束(設定 pendingDisposal),延後到後續流程再實際結束。

      適用於 NPC 動作仍在進行、不宜立即 dispose() 的情境。

    • dispose

      public void dispose()
      結束本次 NPC 對話。

      委派 NPCScriptManager.dispose(client.MapleClient),清除此客戶端被快取的腳本引擎並釋放對話狀態, 故下次開啟同一 NPC 會重新讀取腳本。

    • askMapSelection

      public void askMapSelection(String sel)
      開啟地圖選擇對話框並送出至客戶端。

      若已有待回應的對話(lastMsg > -1)則略過不送。送出後將 lastMsg 設為 0x10 以記錄此對話型別。

      Parameters:
      sel - 地圖選項清單字串
    • askBuffSelection

      public void askBuffSelection(String text)
      開啟增益(buff)選擇對話框並送出至客戶端。

      若已有待回應的對話(lastMsg > -1)則略過不送。送出後將 lastMsg 設為 16 以記錄此對話型別。

      Parameters:
      text - 增益選項清單字串
    • say

      public void say(String sMsg)
      顯示一段 NPC 對話文字(無上一步/下一步按鈕)。

      便捷多載,等同 say(sMsg, false, false)

      Parameters:
      sMsg - 對話文字
    • say

      public void say(String sMsg, boolean prev, boolean next)
      顯示一段 NPC 對話文字,並可指定是否帶上一步/下一步按鈕。

      便捷多載,等同 say(0, sMsg, prev, next)

      Parameters:
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
    • say

      public void say(int bParam, String sMsg, boolean prev, boolean next)
      顯示一段 NPC 對話文字,並指定附加參數與按鈕。

      便捷多載,等同 say(id, bParam, sMsg, prev, next),說話者即本對話的 NPC。

      Parameters:
      bParam - 對話附加參數
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
    • say

      public void say(int nSpeakerTemplateID, int bParam, String sMsg, boolean prev, boolean next)
      以指定說話者顯示一段 NPC 對話文字。

      便捷多載,等同 say(nSpeakerTemplateID, -1, bParam, sMsg, prev, next)

      Parameters:
      nSpeakerTemplateID - 說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
    • say

      public void say(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int bParam, String sMsg, boolean prev, boolean next)
      以兩名說話者顯示一段 NPC 對話文字。

      便捷多載,等同 say(nSpeakerTemplateID, nAnotherSpeakerTemplateID, -1, bParam, sMsg, prev, next)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
    • say

      public void say(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, String sMsg, boolean prev, boolean next)
      以三名說話者顯示一段 NPC 對話文字。

      便捷多載,固定說話者型別為 4,等同 say(4, nSpeakerTemplateID, nAnotherSpeakerTemplateID, nOtherSpeakerTemplateID, bParam, 0, sMsg, prev, next, 0)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
    • say

      public void say(int nSpeakerTypeID, int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, int eColor, String sMsg, boolean prev, boolean next, int tWait)
      顯示一段 NPC 對話文字(最完整多載),實際組裝並送出對話封包。

      sMsg 內含選單標記 #L 則改走 askMenu(String);否則將 lastMsg 設為 0 並透過 NPCPacket.OnScriptMessage(int, int, int, int, byte, int, int, String[], int[], int[][], MaplePet[]) 送出文字對話。會將 prevnexttWait 編碼進按鈕旗標。

      Parameters:
      nSpeakerTypeID - 說話者型別 id
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      eColor - 文字顏色
      sMsg - 對話文字
      prev - 是否顯示「上一步」按鈕
      next - 是否顯示「下一步」按鈕
      tWait - 等待時間
    • askYesNo

      public void askYesNo(String sMsg)
      開啟是/否(Yes/No)詢問對話框。

      便捷多載,等同 askYesNo(0, sMsg)。玩家的選擇會回傳至腳本的 action

      Parameters:
      sMsg - 詢問文字
    • askYesNo

      public void askYesNo(int bParam, String sMsg)
      以附加參數開啟是/否詢問對話框。

      便捷多載,等同 askYesNo(id, bParam, sMsg),說話者即本對話的 NPC。

      Parameters:
      bParam - 對話附加參數
      sMsg - 詢問文字
    • askYesNo

      public void askYesNo(int nSpeakerTemplateID, int bParam, String sMsg)
      以指定說話者開啟是/否詢問對話框。

      便捷多載,等同 askYesNo(nSpeakerTemplateID, -1, bParam, sMsg)

      Parameters:
      nSpeakerTemplateID - 說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 詢問文字
    • askYesNo

      public void askYesNo(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int bParam, String sMsg)
      以兩名說話者開啟是/否詢問對話框。

      便捷多載,等同 askYesNo(nSpeakerTemplateID, nAnotherSpeakerTemplateID, -1, bParam, sMsg)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 詢問文字
    • askYesNo

      public void askYesNo(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, String sMsg)
      以三名說話者開啟是/否詢問對話框。

      便捷多載,固定說話者型別為 4,等同 askYesNo(4, nSpeakerTemplateID, nAnotherSpeakerTemplateID, nOtherSpeakerTemplateID, bParam, 0, sMsg)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 詢問文字
    • askYesNo

      public void askYesNo(int nSpeakerTypeID, int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, int eColor, String sMsg)
      開啟是/否詢問對話框(最完整多載),實際組裝並送出對話封包。

      sMsg 內含選單標記 #L 則改走 askMenu(String);否則將 lastMsg 設為 2 並透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出 Yes/No 對話。

      Parameters:
      nSpeakerTypeID - 說話者型別 id
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      eColor - 文字顏色
      sMsg - 詢問文字
    • askMenu

      public void askMenu(String sMsg)
      開啟選單(多選項)對話框。

      便捷多載,等同 askMenu(0, sMsg)。選項以 #L..#l 標記,玩家選擇的索引回傳至腳本 action

      Parameters:
      sMsg - 含選項標記的選單文字
    • askMenu

      public void askMenu(int bParam, String sMsg)
      以附加參數開啟選單對話框。

      便捷多載,等同 askMenu(id, bParam, sMsg),說話者即本對話的 NPC。

      Parameters:
      bParam - 對話附加參數
      sMsg - 含選項標記的選單文字
    • askMenu

      public void askMenu(int nSpeakerTemplateID, int bParam, String sMsg)
      以指定說話者開啟選單對話框。

      便捷多載,等同 askMenu(nSpeakerTemplateID, -1, bParam, sMsg)

      Parameters:
      nSpeakerTemplateID - 說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 含選項標記的選單文字
    • askMenu

      public void askMenu(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int bParam, String sMsg)
      以兩名說話者開啟選單對話框。

      便捷多載,等同 askMenu(nSpeakerTemplateID, nAnotherSpeakerTemplateID, -1, bParam, sMsg)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 含選項標記的選單文字
    • askMenu

      public void askMenu(int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, String sMsg)
      以三名說話者開啟選單對話框。

      便捷多載,固定說話者型別為 4,等同 askMenu(4, nSpeakerTemplateID, nAnotherSpeakerTemplateID, nOtherSpeakerTemplateID, bParam, 0, sMsg)

      Parameters:
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      sMsg - 含選項標記的選單文字
    • askMenu

      public void askMenu(int nSpeakerTypeID, int nSpeakerTemplateID, int nAnotherSpeakerTemplateID, int nOtherSpeakerTemplateID, int bParam, int eColor, String sMsg)
      開啟選單對話框(最完整多載),實際組裝並送出對話封包。

      sMsg 不含選項標記 #L 則退化為純文字 say(String);否則將 lastMsg 設為 5 並透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出選單對話。

      Parameters:
      nSpeakerTypeID - 說話者型別 id
      nSpeakerTemplateID - 主說話者 NPC 模板 id
      nAnotherSpeakerTemplateID - 第二說話者 NPC 模板 id
      nOtherSpeakerTemplateID - 第三說話者 NPC 模板 id
      bParam - 對話附加參數
      eColor - 文字顏色
      sMsg - 含選項標記的選單文字
    • sendNext

      public void sendNext(String text)
      顯示一段對話並只提供「下一步」按鈕。

      便捷多載,等同 sendNext(text, id),說話者即本對話的 NPC。

      Parameters:
      text - 對話文字
    • sendNext

      public void sendNext(String text, int id)
      以指定說話者顯示一段對話並只提供「下一步」按鈕。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,會改走 sendSimple(String)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      id - 說話者 NPC 模板 id
    • sendPlayerToNpc

      public void sendPlayerToNpc(String text)
      以「玩家對 NPC 說話」樣式顯示一段對話並提供「下一步」按鈕。

      便捷多載,等同 sendNextS(text, (byte) 3, id)(樣式 3 為玩家發話)。

      Parameters:
      text - 對話文字
    • sendNextNoESC

      public void sendNextNoESC(String text)
      顯示一段不可按 ESC 關閉的對話並提供「下一步」按鈕。

      便捷多載,等同 sendNextS(text, (byte) 1, id)(樣式 1 禁止 ESC)。

      Parameters:
      text - 對話文字
    • sendNextNoESC

      public void sendNextNoESC(String text, int id)
      以指定說話者顯示一段不可按 ESC 關閉的對話並提供「下一步」按鈕。

      便捷多載,等同 sendNextS(text, (byte) 1, id)(樣式 1 禁止 ESC)。

      Parameters:
      text - 對話文字
      id - 說話者 NPC 模板 id
    • sendNextS

      public void sendNextS(String text, byte type)
      以指定樣式顯示一段對話並提供「下一步」按鈕。

      便捷多載,等同 sendNextS(text, type, id)

      Parameters:
      text - 對話文字
      type - 對話框樣式
    • sendNextS

      public void sendNextS(String text, byte type, int idd)
      以指定樣式與說話者顯示一段對話並提供「下一步」按鈕。

      便捷多載,等同 sendNextS(text, type, idd, id)

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 說話者 NPC 模板 id
    • sendNextS

      public void sendNextS(String text, byte type, int idd, int npcid)
      以指定樣式與說話者顯示一段對話並提供「下一步」按鈕(最完整多載),實際送出封包。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,改走 sendSimpleS(String, byte)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 說話者 NPC 模板 id
      npcid - 預留的 NPC id 參數(未使用,封包以對話的 id 為準)
    • sendOthersTalk

      public void sendOthersTalk(String text, int npcid, boolean[] bottom)
      顯示由另一名 NPC 發話的對話。

      便捷多載,等同 sendOthersTalk(text, npcid, bottom, (byte) 1)

      Parameters:
      text - 對話文字
      npcid - 發話的另一名 NPC 模板 id
      bottom - 上一步/下一步按鈕旗標(長度至少 2 時逐項生效)
    • sendOthersTalk

      public void sendOthersTalk(String text, int npcid, boolean[] bottom, byte type)
      顯示由另一名 NPC 發話的對話(最完整多載),實際送出封包。

      bottom 組出按鈕旗標字串(長度不足 2 時退化為預設「00 01」)。若 text 含選項標記 #L 則以 lastMsg=5 送出選單,否則以 lastMsg=0 送出文字,皆透過 NPCPacket.getOthersTalk(int, byte, int, String, String, byte)

      Parameters:
      text - 對話文字
      npcid - 發話的另一名 NPC 模板 id
      bottom - 上一步/下一步按鈕旗標
      type - 對話框樣式
    • sendPrev

      public void sendPrev(String text)
      顯示一段對話並只提供「上一步」按鈕。

      便捷多載,等同 sendPrev(text, id),說話者即本對話的 NPC。

      Parameters:
      text - 對話文字
    • sendPrev

      public void sendPrev(String text, int id)
      以指定說話者顯示一段對話並只提供「上一步」按鈕。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,改走 sendSimple(String)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      id - 說話者 NPC 模板 id
    • getAdviceTalk

      public void getAdviceTalk(String[] wzinfo)
      送出「建議/提示」對話(advice talk)。

      lastMsg 設為 1 並透過 NPCPacket.getAdviceTalk(String[]) 送出。

      Parameters:
      wzinfo - 提示內容字串陣列
    • sendPrevS

      public void sendPrevS(String text, byte type)
      以指定樣式顯示一段對話並只提供「上一步」按鈕。

      便捷多載,等同 sendPrevS(text, type, id)

      Parameters:
      text - 對話文字
      type - 對話框樣式
    • sendPrevS

      public void sendPrevS(String text, byte type, int idd)
      以指定樣式與說話者顯示一段對話並只提供「上一步」按鈕,實際送出封包。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,改走 sendSimpleS(String, byte)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 說話者 NPC 模板 id
    • sendNextPrev

      public void sendNextPrev(String text)
      顯示一段對話並同時提供「上一步」與「下一步」按鈕。

      便捷多載,等同 sendNextPrev(text, id),說話者即本對話的 NPC。

      Parameters:
      text - 對話文字
    • sendNextPrev

      public void sendNextPrev(String text, int id)
      以指定說話者顯示一段對話並同時提供「上一步」與「下一步」按鈕。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,改走 sendSimple(String)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      id - 說話者 NPC 模板 id
    • PlayerToNpc

      public void PlayerToNpc(String text)
      以「玩家對 NPC 說話」樣式顯示一段對話並提供上一步/下一步按鈕。

      便捷多載,等同 sendNextPrevS(text, (byte) 3)(樣式 3 為玩家發話)。

      Parameters:
      text - 對話文字
    • sendNextPrevS

      public void sendNextPrevS(String text)
      以玩家發話樣式顯示一段對話並提供上一步/下一步按鈕。

      便捷多載,等同 sendNextPrevS(text, (byte) 3)

      Parameters:
      text - 對話文字
    • sendNextPrevS

      public void sendNextPrevS(String text, byte type)
      以指定樣式顯示一段對話並提供上一步/下一步按鈕。

      便捷多載,等同 sendNextPrevS(text, type, id)

      Parameters:
      text - 對話文字
      type - 對話框樣式
    • sendNextPrevS

      public void sendNextPrevS(String text, byte type, int idd)
      以指定樣式與說話者顯示一段對話並提供上一步/下一步按鈕。

      便捷多載,等同 sendNextPrevS(text, type, idd, id)

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 說話者 NPC 模板 id
    • sendNextPrevS

      public void sendNextPrevS(String text, byte type, int idd, int npcid)
      以指定樣式與說話者顯示一段對話並提供上一步/下一步按鈕(最完整多載),實際送出封包。

      若已有待回應對話(lastMsg > -1)則略過。若 text 含選項標記 #L,改走 sendSimpleS(String, byte)(否則客戶端會斷線);否則透過 NPCPacket.getNPCTalk(int, byte, String, String, byte) 送出並將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 說話者 NPC 模板 id
      npcid - 預留的 NPC id 參數(未使用,封包以對話的 id 為準)
    • sendNextPrevNpcS

      public void sendNextPrevNpcS(String text, byte type, int idd)
      以指定 NPC(idd)作為說話者顯示一段對話並提供上一步/下一步按鈕,實際送出封包。

      sendNextPrevS(String, byte, int, int) 類似,但封包的說話者 NPC id 改採 idd(而非對話的 id)。若已有待回應對話(lastMsg > -1)則略過;若含選項標記 #L 則改走 sendSimpleS(String, byte)。送出後將 lastMsg 設為 0。

      Parameters:
      text - 對話文字
      type - 對話框樣式
      idd - 作為說話者並送出封包的 NPC 模板 id
    • sendOk

      public void sendOk(String text)
      顯示只有「確定」按鈕的 NPC 對話框。

      委派至 sendOk(String, int),使用本對話的 NPC 編號 id

      Parameters:
      text - 對話內容(可含 MapleStory 文字格式碼)
    • sendOk

      public void sendOk(String text, int id)
      以指定 NPC 編號顯示只有「確定」按鈕的對話框。

      若已有待回應的對話(lastMsg > -1)則直接略過;若文字含 #L 連結碼則改走 sendSimple(String)(否則用戶端會斷線)。送出封包後將 lastMsg 設為 0

      Parameters:
      text - 對話內容
      id - 顯示對話的 NPC 範本編號
    • sendOkS

      public void sendOkS(String text, byte type)
      顯示只有「確定」按鈕的對話框,並指定對話框樣式。

      委派至 sendOkS(String, byte, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容
      type - 對話框樣式類型
    • sendOkS

      public void sendOkS(String text, byte type, int idd)
      以指定樣式與 NPC 編號顯示只有「確定」按鈕的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimpleS(String, byte)。 送出後 lastMsg 設為 0

      Parameters:
      text - 對話內容
      type - 對話框樣式類型
      idd - 顯示對話的 NPC 範本編號
    • sendYesNo

      public void sendYesNo(String text)
      顯示帶「是 / 否」按鈕的 NPC 對話框。

      委派至 sendYesNo(String, int),使用本對話的 NPC 編號。玩家的選擇會回傳到腳本 actionmode1=是,0=否)。

      Parameters:
      text - 對話內容
    • sendYesNo

      public void sendYesNo(String text, int id)
      以指定 NPC 編號顯示帶「是 / 否」按鈕的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimple(String)。 送出後 lastMsg 設為 2

      Parameters:
      text - 對話內容
      id - 顯示對話的 NPC 範本編號
    • sendYesNoS

      public void sendYesNoS(String text, byte type)
      以指定樣式顯示帶「是 / 否」按鈕的對話框。

      委派至 sendYesNoS(String, byte, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容
      type - 對話框樣式類型
    • sendYesNoS

      public void sendYesNoS(String text, byte type, int idd)
      以指定樣式與 NPC 編號顯示帶「是 / 否」按鈕的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimpleS(String, byte)。 送出後 lastMsg 設為 2

      Parameters:
      text - 對話內容
      type - 對話框樣式類型
      idd - 顯示對話的 NPC 範本編號
    • sendAcceptDecline

      public void sendAcceptDecline(String text)
      顯示帶「接受 / 拒絕」按鈕的對話框。

      委派至 askAcceptDecline(String)

      Parameters:
      text - 對話內容
    • sendAcceptDeclineNoESC

      public void sendAcceptDeclineNoESC(String text)
      顯示帶「接受 / 拒絕」按鈕、且不可按 ESC 關閉的對話框。

      委派至 askAcceptDeclineNoESC(String)

      Parameters:
      text - 對話內容
    • askAcceptDecline

      public void askAcceptDecline(String text)
      顯示帶「接受 / 拒絕」按鈕的對話框。

      委派至 askAcceptDecline(String, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容
    • askAcceptDecline

      public void askAcceptDecline(String text, int id)
      以指定 NPC 編號顯示帶「接受 / 拒絕」按鈕的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimple(String)lastMsg 設為 0xE 後送出可按 ESC 關閉的版本。

      Parameters:
      text - 對話內容
      id - 顯示對話的 NPC 範本編號
    • askAcceptDeclineNoESC

      public void askAcceptDeclineNoESC(String text)
      顯示帶「接受 / 拒絕」按鈕、且不可按 ESC 關閉的對話框。

      委派至 askAcceptDeclineNoESC(String, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容
    • askAcceptDeclineNoESC

      public void askAcceptDeclineNoESC(String text, int id)
      以指定 NPC 編號顯示帶「接受 / 拒絕」按鈕、且不可按 ESC 關閉的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimple(String)lastMsg 設為 0xE 後送出不可關閉的版本。

      Parameters:
      text - 對話內容
      id - 顯示對話的 NPC 範本編號
    • askAvatar

      public void askAvatar(String text, int... args)
      顯示造型(Avatar)選擇對話框,供玩家從多組造型中挑選。

      若已有待回應的對話則略過。送出造型樣式封包後 lastMsg 設為 9, 玩家選擇的索引會回傳到腳本 action

      Parameters:
      text - 對話內容
      args - 可供選擇的造型 ID 清單
    • sendSimple

      public void sendSimple(String text)
      顯示含多個選項連結(#L...#l)的選單式對話框。

      委派至 sendSimple(String, int),使用本對話的 NPC 編號。玩家點選的選項索引會回傳到腳本 actionselection

      Parameters:
      text - 對話內容,應包含 #L 選項連結碼
    • sendSimple

      public void sendSimple(String text, int id)
      以指定 NPC 編號顯示含多個選項連結的選單式對話框。

      若已有待回應的對話則略過;若文字「不含」#L 連結碼則改走 sendNext(String) (否則用戶端會斷線)。送出後 lastMsg 設為 5

      Parameters:
      text - 對話內容,應包含 #L 選項連結碼
      id - 顯示對話的 NPC 範本編號
    • sendSimpleS

      public void sendSimpleS(String text, byte type)
      以指定樣式顯示含多個選項連結的選單式對話框。

      委派至 sendSimpleS(String, byte, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容,應包含 #L 選項連結碼
      type - 對話框樣式類型
    • sendSimpleS

      public void sendSimpleS(String text, byte type, int idd)
      以指定樣式與 NPC 編號顯示含多個選項連結的選單式對話框。

      若已有待回應的對話則略過;若文字「不含」#L 連結碼則改走 sendNextS(String, byte)。 送出後 lastMsg 設為 5

      Parameters:
      text - 對話內容,應包含 #L 選項連結碼
      type - 對話框樣式類型
      idd - 顯示對話的 NPC 範本編號
    • sendStyle

      public void sendStyle(String text, int[] styles)
      顯示造型選擇對話框,供玩家挑選一組造型樣式。

      若已有待回應的對話則略過。送出造型樣式封包後 lastMsg 設為 9

      Parameters:
      text - 對話內容
      styles - 可供選擇的造型 ID 陣列
    • sendAndroidStyle

      public void sendAndroidStyle(String text, int[] styles)
      顯示機器人(Android)造型選擇對話框。

      若已有待回應的對話則略過。送出機器人造型樣式封包後 lastMsg 設為 10

      Parameters:
      text - 對話內容
      styles - 可供選擇的機器人造型 ID 陣列
    • setAndroidHair

      public void setAndroidHair(int hair)
      變更玩家機器人的髮型並存檔。

      更新機器人髮型、寫入資料庫,並重新套用機器人至玩家以同步顯示。

      Parameters:
      hair - 髮型造型 ID
    • setAndroidFace

      public void setAndroidFace(int face)
      變更玩家機器人的臉型並存檔。

      更新機器人臉型、寫入資料庫,並重新套用機器人至玩家以同步顯示。

      Parameters:
      face - 臉型造型 ID
    • sendGetNumber

      public void sendGetNumber(String text, int def, int min, int max)
      顯示要求玩家輸入數字的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimple(String)。 送出後 lastMsg 設為 4,玩家輸入的數值會回傳到腳本 actionselection

      Parameters:
      text - 對話內容
      def - 預設值
      min - 可輸入的最小值
      max - 可輸入的最大值
    • sendGetText

      public void sendGetText(String text)
      顯示要求玩家輸入文字的對話框。

      委派至 sendGetText(String, int),使用本對話的 NPC 編號。

      Parameters:
      text - 對話內容
    • sendGetText

      public void sendGetText(String text, int id)
      以指定 NPC 編號顯示要求玩家輸入文字的對話框。

      若已有待回應的對話則略過;文字含 #L 時改走 sendSimple(String)。 送出後 lastMsg 設為 3,輸入的字串可由 getText() 取得。

      Parameters:
      text - 對話內容
      id - 顯示對話的 NPC 範本編號
    • setGetText

      public void setGetText(String text)
      設定本對話暫存的文字輸入值。
      Parameters:
      text - 要暫存的文字
    • getText

      public String getText()
      取得玩家先前透過文字輸入對話框輸入的字串。
      Returns:
      暫存的文字輸入值
    • setHair

      public void setHair(int hair)
      變更玩家的髮型並即時更新外觀。

      設定髮型、更新 MapleStat.HAIR 單一屬性並觸發 equipChanged() 廣播外觀變化。

      Parameters:
      hair - 髮型造型 ID
    • setFace

      public void setFace(int face)
      變更玩家的臉型並即時更新外觀。

      設定臉型、更新 MapleStat.FACE 單一屬性並觸發 equipChanged() 廣播外觀變化。

      Parameters:
      face - 臉型造型 ID
    • setSkin

      public void setSkin(int color)
      變更玩家的膚色並即時更新外觀。

      設定膚色、更新 MapleStat.SKIN 單一屬性並觸發 equipChanged() 廣播外觀變化。

      Parameters:
      color - 膚色代碼
    • setRandomAvatar

      public int setRandomAvatar(int ticket, int... args_all)
      消耗一張券,從候選清單中隨機套用一項外觀變更(膚色 / 臉型 / 髮型)。

      須持有票券道具,否則回傳 -1;成功時扣除一張票券,並依隨機選中的數值範圍判定為膚色 (< 100)、臉型(< 30000)或髮型,更新對應屬性後觸發 equipChanged()

      Parameters:
      ticket - 須消耗的票券道具 ID
      args_all - 候選的膚色 / 臉型 / 髮型 ID 清單
      Returns:
      成功回傳 1;未持有票券回傳 -1
    • setAvatar

      public int setAvatar(int ticket, int args)
      消耗一張券,套用指定的外觀變更(膚色 / 臉型 / 髮型)。

      須持有票券道具,否則回傳 -1;成功時扣除一張票券,並依 args 的數值範圍判定為膚色 (< 100)、臉型(< 30000)或髮型,更新對應屬性後觸發 equipChanged()

      Parameters:
      ticket - 須消耗的票券道具 ID
      args - 要套用的膚色 / 臉型 / 髮型 ID
      Returns:
      成功回傳 1;未持有票券回傳 -1
    • setMedalQuestHair

      public void setMedalQuestHair(int hair)
      為勳章任務變更玩家髮型並即時更新外觀。

      等同於 setHair(int):設定髮型、更新 MapleStat.HAIR 並觸發 equipChanged()

      Parameters:
      hair - 髮型造型 ID
    • sendStorage

      public void sendStorage()
      為玩家開啟倉庫介面。

      若玩家不在地圖上、正在交易或已死亡,或伺服器正在關閉,則送出錯誤提示與 enableActions 後中止。否則寫入倉庫開啟訊息、將對話狀態設為倉庫模式(conversation=4operateStorage=true), 並送出倉庫內容封包。

    • openShop

      public void openShop(int id)
      開啟指定編號的商店介面。

      透過 MapleShopFactory 取得商店並送出商店封包給用戶端。

      Parameters:
      id - 商店編號
    • openShopNPC

      public void openShopNPC(int id)
      開啟指定編號的商店介面,並綁定當前對話的 NPC。

      openShop(int) 類似,但額外傳入本對話的 NPC 編號 this.id

      Parameters:
      id - 商店編號
    • gainGachaponItem

      public int gainGachaponItem(int id, int quantity)
      以轉蛋方式給予玩家道具。

      委派至 gainGachaponItem(int, int, String),廣播訊息採用玩家當前地圖的街道名稱。

      Parameters:
      id - 道具 ID
      quantity - 給予數量
      Returns:
      成功回傳道具 ID;失敗回傳 -1
    • gainGachaponItem

      public int gainGachaponItem(int id, int quantity, String msg)
      以轉蛋方式給予玩家道具,稀有道具會全頻廣播。

      道具不存在或加入背包失敗時回傳 -1。若為轉蛋稀有道具 (GameConstants.gachaponRareItem > 0)則透過 World.Broadcast 全頻廣播中獎喇叭;最後送出道具獲得效果封包。例外會被記錄並回傳 -1

      Parameters:
      id - 道具 ID
      quantity - 給予數量
      msg - 稀有道具廣播時使用的地點訊息
      Returns:
      成功回傳道具 ID;失敗或發生例外回傳 -1
    • useNebuliteGachapon

      public int useNebuliteGachapon()
      使用星岩(Nebulite)轉蛋,依機率隨機抽出一個潛能星岩或高級票券碎片。

      需 EQUIP/USE/SETUP/ETC/CASH 五種背包各至少 1 格空位,否則回傳 -1。依機率決定等級 (A/B/C/D,無法抽到 S),D 級有 25% 機率改給高級票券碎片(4420000);B 級以上會全頻廣播中獎喇叭。 成功後送出道具獲得效果、給予一個碎片道具(2430748)並扣除一張轉蛋券(5220094)。 例外會被記錄並回傳 -1

      Returns:
      成功回傳抽中的道具 ID;背包不足、抽取失敗或發生例外回傳 -1
    • changeJob

      public void changeJob(int job)
      變更玩家的職業。

      委派 MapleCharacter.changeJob(int)

      Parameters:
      job - 目標職業 ID
    • startQuest

      public void startQuest(int idd)
      依正常流程開始指定任務。

      委派至 MapleQuest.start(MapleCharacter, int),以本對話的 NPC 編號作為觸發者。

      Parameters:
      idd - 任務 ID
    • completeQuest

      public void completeQuest(int idd)
      依正常流程完成指定任務。

      委派至 MapleQuest.complete(MapleCharacter, int),以本對話的 NPC 編號作為觸發者。

      Parameters:
      idd - 任務 ID
    • forfeitQuest

      public void forfeitQuest(int idd)
      放棄指定任務。

      委派至 MapleQuest.forfeit(MapleCharacter)

      Parameters:
      idd - 任務 ID
    • forceStartQuest

      public void forceStartQuest()
      強制開始本對話綁定的任務(quest),不檢查前置條件。

      委派至 MapleQuest.forceStart(MapleCharacter, int, String),不附帶自訂資料。

    • forceStartQuest

      public void forceStartQuest(int idd)
      強制開始指定任務,不檢查前置條件。

      委派至 MapleQuest.forceStart(MapleCharacter, int, String),不附帶自訂資料。

      Overrides:
      forceStartQuest in class AbstractPlayerInteraction
      Parameters:
      idd - 任務 ID
    • forceStartQuest

      public void forceStartQuest(String customData)
      強制開始本對話綁定的任務並附帶自訂資料字串。

      委派至 MapleQuest.forceStart(MapleCharacter, int, String),將 customData 寫入任務狀態。

      Parameters:
      customData - 要附加到任務的自訂資料
    • forceCompleteQuest

      public void forceCompleteQuest()
      強制完成本對話綁定的任務(quest),不檢查條件。

      委派至 MapleQuest.forceComplete(MapleCharacter, int)

    • forceCompleteQuest

      public void forceCompleteQuest(int idd)
      強制完成指定任務,不檢查條件。

      委派至 MapleQuest.forceComplete(MapleCharacter, int)

      Overrides:
      forceCompleteQuest in class AbstractPlayerInteraction
      Parameters:
      idd - 任務 ID
    • getQuestCustomData

      public String getQuestCustomData()
      取得本對話綁定任務(quest)的自訂資料字串。
      Returns:
      該任務狀態的自訂資料;若任務不存在則由 getQuestNAdd 建立後回傳其值
    • getQuestCustomData

      public String getQuestCustomData(int quest)
      取得指定任務的自訂資料字串。
      Parameters:
      quest - 任務 ID
      Returns:
      該任務狀態的自訂資料;若任務不存在則由 getQuestNAdd 建立後回傳其值
    • setQuestCustomData

      public void setQuestCustomData(String customData)
      設定本對話綁定任務(quest)的自訂資料字串。
      Parameters:
      customData - 要寫入任務狀態的自訂資料
    • getMeso

      public int getMeso()
      取得玩家目前持有的楓幣數量。
      Returns:
      玩家的楓幣數
    • gainAp

      public void gainAp(int amount)
      給予玩家能力點數(AP)。

      委派 MapleCharacter.gainAp(short)

      Parameters:
      amount - 要增加的 AP 數量
    • expandInventory

      public void expandInventory(byte type, int amt)
      擴充玩家指定類型背包的格數。

      委派 MapleCharacter.expandInventory(byte, int)

      Parameters:
      type - 背包類型(對應 MapleInventoryType 的值)
      amt - 欲增加的格數
    • unequipEverything

      public void unequipEverything()
      將玩家身上所有已穿戴裝備卸下並移回裝備(EQUIP)背包。

      逐一取得 MapleInventoryType.EQUIPPED 內所有物品的位置, 透過 MapleInventoryManipulator.unequip(MapleClient, short, short) 卸至裝備背包的下一個空格。 會更動玩家背包狀態並送出對應封包。

      Overrides:
      unequipEverything in class AbstractPlayerInteraction
    • clearSkills

      public final void clearSkills()
      清除玩家所有技能。

      委派 MapleCharacter.clearSkills()

    • hasSkill

      public boolean hasSkill(int skillid)
      查詢玩家是否擁有指定技能。
      Parameters:
      skillid - 技能 ID
      Returns:
      擁有該技能時為 true
    • spawnNPCRequestController

      public void spawnNPCRequestController(int npcid, int x, int y)
      於指定座標為此玩家生成一個受控(client-request)NPC。

      委派至 spawnNPCRequestController(int, int, int, int),朝向參數 f 預設為 0

      Parameters:
      npcid - NPC ID
      x - 生成座標 X
      y - 生成座標 Y
    • spawnNPCRequestController

      public void spawnNPCRequestController(int npcid, int x, int y, int f)
      於指定座標與朝向為此玩家生成一個受控 NPC。

      委派至 spawnNPCRequestController(int, int, int, int, int),物件 ID 預設使用 npcid

      Parameters:
      npcid - NPC ID
      x - 生成座標 X
      y - 生成座標 Y
      f - 朝向(face)
    • spawnNPCRequestController

      public void spawnNPCRequestController(int npcid, int x, int y, int f, int oid)
      於指定座標、朝向與物件 ID 為此玩家生成一個受控 NPC(核心實作)。

      若同 oid 已登記於 npcRequestController,先移除舊登記。 優先沿用當前地圖上既有的同 ID NPC;否則以 MapleLifeFactory.getNPC(int) 建立自訂 NPC, 設定座標、可見範圍、踏腳板與物件 ID(找不到該 NPC 則為無操作)。最後將 NPC 登記於 npcRequestController,並送出生成與「summon」特殊動作封包給此玩家。

      Parameters:
      npcid - NPC ID
      x - 生成座標 X
      y - 生成座標 Y
      f - 朝向(face)
      oid - 物件 ID(用於後續控制與移除的鍵)
    • setNPCSpecialAction

      public void setNPCSpecialAction(int npcid, String action)
      令受控 NPC 播放指定的特殊動作。

      委派至 setNPCSpecialAction(int, String, int, boolean),時間預設 0unkfalse

      Parameters:
      npcid - 受控 NPC 的 ID(登記於 npcRequestController
      action - 特殊動作名稱
    • setNPCSpecialAction

      public void setNPCSpecialAction(int npcid, String action, int time, boolean unk)
      令受控 NPC 播放指定的特殊動作並指定持續時間。

      委派至 setNPCSpecialAction(int, String, int, boolean, int)directionTime 預設 -1(不附加延遲)。

      Parameters:
      npcid - 受控 NPC 的 ID
      action - 特殊動作名稱
      time - 動作持續時間
      unk - 額外旗標
    • setNPCSpecialAction

      public void setNPCSpecialAction(int npcid, String action, int time, boolean unk, int directionTime)
      令受控 NPC 播放指定的特殊動作,並可選擇性附加演出延遲(核心實作)。

      查找 npcRequestController 中登記於此玩家的同 ID NPC,未登記則為無操作。 送出特殊動作封包;當 directionTime > -1 時再透過 exceTime(int) 附加一段延遲(directionTime > 0 取其值,否則取 time)。

      Parameters:
      npcid - 受控 NPC 的 ID
      action - 特殊動作名稱
      time - 動作持續時間
      unk - 額外旗標
      directionTime - 演出延遲;-1 表示不附加
    • updateNPCSpecialAction

      public void updateNPCSpecialAction(int oid, int value, int x, int y)
      更新受控 NPC 的特殊動作狀態並送出封包。

      oid 查找 npcRequestController 中登記於此玩家的 NPC,未登記則為無操作。

      Parameters:
      oid - 受控 NPC 的物件 ID
      value - 動作狀態值
      x - 座標 X
      y - 座標 Y
    • getNPCDirectionEffect

      public void getNPCDirectionEffect(int npcid, String data, int value, int x, int y)
      對受控 NPC 播放指定的演出方向效果(in-game direction effect)。

      npcid 查找 npcRequestController 中登記於此玩家的 NPC,未登記則為無操作; 送出 InGameDirectionEvent_EffectPlay 封包給此玩家。

      Parameters:
      npcid - 受控 NPC 的 ID
      data - 效果資料名稱
      value - 效果參數值
      x - 座標 X
      y - 座標 Y
    • removeNPCRequestController

      public void removeNPCRequestController(int oid)
      移除先前生成的受控 NPC。

      oid 查找 npcRequestController 中登記於此玩家的 NPC,未登記則為無操作; 送出移除控制與移除 NPC 封包後,自 npcRequestController 解除登記。

      Parameters:
      oid - 受控 NPC 的物件 ID
    • forcedAction

      public void forcedAction(int[] values)
      對玩家觸發強制動作演出(ForcedAction)。

      委派 getDirectionEffect(int, String, int[]),送出演出封包。

      Parameters:
      values - 動作參數陣列
    • exceTime

      public void exceTime(int time)
      於演出序列中插入一段延遲(Delay)。

      委派 getDirectionEffect(int, String, int[]),送出演出封包。

      Parameters:
      time - 延遲時間
    • getEventEffect

      public void getEventEffect(String data, int[] values)
      對玩家播放指定的事件效果(EffectPlay)。

      委派 getDirectionEffect(int, String, int[]),送出演出封包。

      Parameters:
      data - 效果資料名稱
      values - 效果參數陣列
    • playerWaite

      public void playerWaite()
      強制玩家進入待機(不操作)狀態的演出輸入。

      送出 ForcedInput 演出封包,輸入值 0

    • playerMoveLeft

      public void playerMoveLeft()
      強制玩家向左移動的演出輸入。

      送出 ForcedInput 演出封包,輸入值 1

    • playerMoveRight

      public void playerMoveRight()
      強制玩家向右移動的演出輸入。

      送出 ForcedInput 演出封包,輸入值 2

    • playerJump

      public void playerJump()
      強制玩家跳躍的演出輸入。

      送出 ForcedInput 演出封包,輸入值 3

    • playerMoveDown

      public void playerMoveDown()
      強制玩家向下移動的演出輸入。

      送出 ForcedInput 演出封包,輸入值 4

    • forcedInput

      public void forcedInput(int input)
      對玩家送出自訂的強制輸入演出(ForcedInput)。
      Parameters:
      input - 輸入值(如 0 待機、1 左、2 右、3 跳、4 下)
    • patternInput

      public final void patternInput(String data, int[] values)
      向玩家要求輸入一組指定的按鍵序列(PatternInputRequest)。
      Parameters:
      data - 序列資料名稱
      values - 序列參數陣列
    • cameraMove

      public final void cameraMove(int[] values)
      播放鏡頭移動演出(CameraMove)。
      Parameters:
      values - 鏡頭移動參數陣列
    • cameraOnCharacter

      public final void cameraOnCharacter(int value)
      將鏡頭重新對準玩家角色(CameraOnCharacter)。
      Parameters:
      value - 鏡頭參數值
    • cameraZoom

      public final void cameraZoom(int[] values)
      播放鏡頭縮放演出(CameraZoom)。
      Parameters:
      values - 鏡頭縮放參數陣列
    • hidePlayer

      public final void hidePlayer(boolean hide)
      切換玩家角色的隱身演出(VansheeMode)。
      Parameters:
      hide - true 隱藏角色,false 顯示
    • faceOff

      public final void faceOff(int value)
      播放臉部特寫演出(FaceOff)。
      Parameters:
      value - 演出參數值
    • sendTellStory

      public void sendTellStory(String data, boolean lastLine)
      播放劇情獨白演出(Monologue)。
      Parameters:
      data - 獨白資料名稱
      lastLine - 是否為最後一句(true 表示結束此段獨白)
    • removeAdditionalEffect

      public void removeAdditionalEffect()
      移除先前附加於演出中的額外效果(RemoveAdditionalEffect)。
    • forcedMove

      public void forcedMove(int value, int value1)
      強制玩家依指定參數移動(ForcedMove)。
      Parameters:
      value - 移動參數一
      value1 - 移動參數二
    • forcedFlip

      public void forcedFlip(int value)
      強制玩家角色翻轉朝向(ForcedFlip)。
      Parameters:
      value - 翻轉參數值
    • inputUI

      public void inputUI(int value)
      向玩家彈出演出輸入介面(InputUI)。
      Parameters:
      value - 介面參數值
    • getDirectionEffect

      public void getDirectionEffect(int mod, String data, int[] values)
      演出方向效果(in-game direction event)的核心發送方法,供本類各演出 helper 委派。

      mod 解析出 InGameDirectionEventOpcode 並送出演出封包給此玩家。 當 lastMsg 已被設定(> -1)時直接返回,不更新狀態;否則對於會等待玩家回應 的演出類型(Delay/ForcedInput/PatternInputRequest/CameraMove/CameraZoom)將 lastMsg 設為 0x11,使後續對話流程得以正確接續。

      Parameters:
      mod - 演出事件 opcode 值(見 InGameDirectionEventOpcode
      data - 效果資料名稱,可為 null
      values - 效果參數陣列,可為 null
    • getDirectionFacialExpression

      public void getDirectionFacialExpression(int expression, int duration)
      令玩家角色播放臉部表情演出。

      送出 UIPacket.facialExpression2(int, int) 封包給此玩家。

      Parameters:
      expression - 表情 ID
      duration - 表情持續時間
    • playMovie

      public void playMovie(String data)
      對玩家播放劇情動畫(movie)。

      委派至 playMovie(String, boolean)show 預設 true

      Parameters:
      data - 動畫資料名稱
    • playMovie

      public void playMovie(String data, boolean show)
      對玩家播放劇情動畫並設定後續對話狀態。

      委派 AbstractPlayerInteraction.playMovie(String, boolean) 送出動畫封包, 隨後將 lastMsg 設為 0x12 以正確接續對話流程。

      Overrides:
      playMovie in class AbstractPlayerInteraction
      Parameters:
      data - 動畫資料名稱
      show - 是否顯示動畫
    • showMapEffect

      public void showMapEffect(String effect)
      向此玩家播放地圖效果(map effect)。

      送出 CField.MapEff(String) 封包,僅對當前玩家可見。

      Overrides:
      showMapEffect in class AbstractPlayerInteraction
      Parameters:
      effect - 地圖效果資料名稱
    • showEffect

      public void showEffect(boolean broadcast, String effect)
      播放畫面效果。

      broadcasttrue 時對整張地圖廣播 CField.showEffect(String); 否則僅送給當前玩家。

      Overrides:
      showEffect in class AbstractPlayerInteraction
      Parameters:
      broadcast - 是否對整張地圖廣播
      effect - 效果資料名稱
    • playSound

      public void playSound(boolean broadcast, String sound)
      播放音效。

      broadcasttrue 時對整張地圖廣播 CField.playSound(String); 否則僅送給當前玩家。

      Overrides:
      playSound in class AbstractPlayerInteraction
      Parameters:
      broadcast - 是否對整張地圖廣播
      sound - 音效資料名稱
    • environmentChange

      public void environmentChange(boolean broadcast, String env)
      變更地圖環境(背景/天氣等)效果。

      broadcasttrue 時對整張地圖廣播 CField.environmentChange(String, int); 否則僅送給當前玩家。

      Parameters:
      broadcast - 是否對整張地圖廣播
      env - 環境資料名稱
    • updateBuddyCapacity

      public void updateBuddyCapacity(int capacity)
      設定玩家好友名單上限。

      委派 MapleCharacter.setBuddyCapacity(byte)

      Parameters:
      capacity - 新的好友名單容量
    • getBuddyCapacity

      public int getBuddyCapacity()
      取得玩家好友名單上限。
      Returns:
      好友名單容量
    • partyMembersInMap

      public int partyMembersInMap()
      計算與玩家同隊且位於同一張地圖的成員數。

      玩家未組隊時回傳 0;否則遍歷當前地圖(thread-safe 快照)統計 隊伍 ID 相同的角色數。

      Returns:
      同隊且同地圖的成員數
    • getPartyMembers

      public List<MapleCharacter> getPartyMembers()
      取得玩家隊伍中所有目前在線的成員角色物件。

      玩家未組隊時回傳 null。否則跨所有頻道(ChannelServer.getAllInstances()) 依成員 ID 查找在線角色並收集為清單;離線成員不納入。

      Returns:
      在線隊員的角色清單;玩家未組隊時為 null
    • warpPartyWithExp

      public void warpPartyWithExp(int mapId, int exp)
      將整隊傳送至指定地圖並給予經驗值。

      玩家未組隊時僅傳送自己(AbstractPlayerInteraction.warp(int, int))並給予經驗。 已組隊時遍歷隊員:僅當隊員與玩家位於相同活動實例(或皆無實例)時, 才將其移動至目標地圖的 0 號傳送點並加經驗。會更動角色地圖與經驗狀態。

      Parameters:
      mapId - 目標地圖 ID
      exp - 給予的經驗值
    • warpPartyWithExpMeso

      public void warpPartyWithExpMeso(int mapId, int exp, int meso)
      將整隊傳送至指定地圖並給予經驗值與楓幣。

      玩家未組隊時僅傳送自己(AbstractPlayerInteraction.warp(int, int))並給予經驗與楓幣。 已組隊時遍歷隊員:僅當隊員與玩家位於相同活動實例(或皆無實例)時, 才將其移動至目標地圖的 0 號傳送點並加經驗、楓幣。會更動角色地圖、經驗與金錢狀態。

      Parameters:
      mapId - 目標地圖 ID
      exp - 給予的經驗值
      meso - 給予的楓幣
    • getSquad

      public MapleSquad getSquad(String type)
      取得本頻道指定類型的遠征隊(MapleSquad)。
      Parameters:
      type - 遠征隊類型名稱
      Returns:
      對應的遠征隊;不存在時為 null
    • getSquadAvailability

      public int getSquadAvailability(String type)
      查詢指定遠征隊的可用狀態。
      Parameters:
      type - 遠征隊類型名稱
      Returns:
      遠征隊狀態值(MapleSquad.getStatus());遠征隊不存在時為 -1
    • registerSquad

      public boolean registerSquad(String type, int minutes, String startText)
      由玩家發起並登記一支新的遠征隊。

      僅當該類型遠征隊尚不存在時建立並以玩家為隊長註冊。登記成功會向當前地圖 廣播倒數時鐘與伺服器公告;登記失敗則清除該隊。已存在同類型遠征隊時直接回傳 false。 會送出廣播封包。

      Parameters:
      type - 遠征隊類型名稱
      minutes - 遠征隊有效時間(分鐘)
      startText - 廣播時附加於玩家名稱後的開始訊息
      Returns:
      成功登記時為 true
    • getSquadList

      public boolean getSquadList(String type, byte type_)
      以對話視窗向玩家顯示遠征隊成員清單。

      type_ 決定呈現方式:0/3sendNext(String) 一般檢視; 1 為隊長封鎖檢視(sendSimple(String));2 為封鎖名單檢視(有封鎖成員用 sendSimple(String),否則用 sendNext(String))。遠征隊不存在時回傳 false。 捕捉 NullPointerException 並寫入腳本錯誤紀錄後回傳 false。會送出對話封包。

      Parameters:
      type - 遠征隊類型名稱
      type_ - 檢視模式
      Returns:
      成功顯示時為 true
    • isSquadLeader

      public byte isSquadLeader(String type)
      判斷當前玩家是否為指定遠征隊的隊長。
      Parameters:
      type - 遠征隊類型名稱
      Returns:
      玩家為隊長時為 1,非隊長為 0,遠征隊不存在為 -1
    • reAdd

      public boolean reAdd(String eim, String squad)
      將斷線後重連的玩家重新加入指定的活動實例與遠征隊。

      依名稱取得斷線時保留的 EventInstanceManagergetDisconnected)與 MapleSquad;兩者皆存在時把玩家重新加入遠征隊並重新登記至活動實例,回傳 true。 任一不存在則回傳 false

      Parameters:
      eim - 斷線活動實例的名稱鍵
      squad - 遠征隊類型名稱
      Returns:
      重新加入成功時為 true
    • banMember

      public void banMember(String type, int pos)
      將指定遠征隊(MapleSquad)中某位成員列入封鎖名單。

      取得本頻道名稱為 type 的遠征隊,若存在則委派 MapleSquad.banMember(int)。 遠征隊不存在時為無操作(no-op)。

      Parameters:
      type - 遠征隊類型名稱
      pos - 欲封鎖成員在隊伍中的位置索引
    • acceptMember

      public void acceptMember(String type, int pos)
      接受指定遠征隊(MapleSquad)中某位待審成員加入。

      取得本頻道名稱為 type 的遠征隊,若存在則委派 MapleSquad.acceptMember(int)。 遠征隊不存在時為無操作(no-op)。

      Parameters:
      type - 遠征隊類型名稱
      pos - 欲接受成員在隊伍中的位置索引
    • addMember

      public int addMember(String type, boolean join)
      將目前玩家加入或退出指定遠征隊(MapleSquad)。

      取得本頻道名稱為 type 的遠征隊並委派 MapleSquad.addMember(MapleCharacter, boolean)。 遠征隊不存在或過程拋出 NullPointerException(後者另寫入腳本錯誤記錄)時回傳 -1

      Parameters:
      type - 遠征隊類型名稱
      join - true 表示加入、false 表示退出
      Returns:
      MapleSquad.addMember(MapleCharacter, boolean) 回傳的結果,失敗回傳 -1
    • isSquadMember

      public byte isSquadMember(String type)
      查詢目前玩家在指定遠征隊(MapleSquad)中的成員狀態。
      Parameters:
      type - 遠征隊類型名稱
      Returns:
      遠征隊不存在回傳 -1;為成員回傳 1;已被封鎖回傳 2;其餘回傳 0
    • resetReactors

      public void resetReactors()
      重置玩家目前所在地圖的所有反應爐(reactor)。

      委派至 MapleMap.resetReactors()

    • genericGuildMessage

      public void genericGuildMessage(int code)
      向客戶端發送一則通用公會訊息封包。
      Parameters:
      code - 公會訊息代碼(將轉型為 byte 傳給 GuildPacket.genericGuildMessage(byte)
    • disbandGuild

      public void disbandGuild()
      解散目前玩家所屬的公會。

      僅當玩家有公會(公會 ID > 0)且公會階級為 1(會長)時才會執行,否則為無操作; 條件成立時委派 World.Guild.disbandGuild(int)

    • increaseGuildCapacity

      public void increaseGuildCapacity(boolean trueMax)
      擴充目前玩家所屬公會的成員容量。

      分兩種模式:

      • trueMax == false:一般擴充(上限 100 人),需扣除 500000 楓幣;楓幣不足時發送提示並中止。
      • trueMax == true:強制擴充(上限 200 人),改為扣除 25000 GP(會降低公會等級)。

      委派 World.Guild.increaseGuildCapacity(int, boolean);成功時扣除對應資源, 失敗或已達上限時向玩家發送說明訊息。玩家無公會時為無操作。會發送封包並變更玩家/公會狀態。

      Parameters:
      trueMax - true 啟用強制擴充(GP 計費、上限 200),false 為一般擴充(楓幣計費、上限 100)
    • displayGuildRanks

      public void displayGuildRanks()
      向客戶端發送公會排行榜封包。

      以目前 NPC 的 idMapleGuildRanking.getRank() 組出 GuildPacket.showGuildRanks(int, List) 封包並發送。

    • showFm

      public void showFm()
      向客戶端發送名聲(fame)排行榜封包。

      以目前 NPC 的 idMapleGuildRanking.getFameRank() 組出封包並發送。

    • showRb

      public void showRb()
      向客戶端發送轉生(reborn)排行榜封包。

      以目前 NPC 的 idMapleGuildRanking.getRebornRank() 組出封包並發送。

    • removePlayerFromInstance

      public boolean removePlayerFromInstance()
      將目前玩家自其所在的事件實例(EventInstanceManager)移除。

      玩家有事件實例時委派 EventInstanceManager.removePlayer(MapleCharacter) 並回傳 true; 否則不做任何事並回傳 false

      Returns:
      成功移除回傳 true,玩家不在任何事件實例中回傳 false
    • isPlayerInstance

      public boolean isPlayerInstance()
      判斷目前玩家是否身處某個事件實例(EventInstanceManager)中。
      Returns:
      玩家有事件實例回傳 true,否則 false
    • changeStat

      public void changeStat(byte slot, int type, int amount)
      直接設定玩家身上某件已裝備裝備(Equip)的單一屬性值。

      type 選定要設定的屬性,amount 為新值(多數屬性轉型為 short, 部分如升級次數/鎚擊/等級/強化為 byte)。type 對照如下: 0~3 STR/DEX/INT/LUK、4~5 HP/MP、6~7 物攻/魔攻、8~9 物防/魔防、10~11 命中/迴避、12 手技、 13~14 移動速度/跳躍、15 可升級次數、16 金鎚次數、17 裝備等級、18 強化等級、 19~23 潛在能力一至五、24 持有者名稱(取自 getText())。未知 type 為無操作。

      完成後呼叫 equipChanged() 套用變更,屬於玩家狀態變更並會發送封包。

      注意:未檢查指定欄位是否確有裝備,槽位為空時轉型可能拋出例外。

      Parameters:
      slot - 裝備欄位的負數槽位(MapleInventoryType.EQUIPPED
      type - 屬性選擇器(見上表)
      amount - 欲設定的新屬性值
    • openDuey

      public void openDuey()
      開啟快遞(Duey)視窗。

      將玩家對話狀態設為 2 並發送 CField.sendDuey(byte, List) 開啟封包。

    • openMerchantItemStore

      public void openMerchantItemStore()
      開啟雇傭商人(Hired Merchant)的物品取回視窗。

      將玩家對話狀態設為 3 並委派 HiredMerchantHandler.displayMerch(MapleClient) 顯示商店內容。

    • sendPVPWindow

      public void sendPVPWindow()
      開啟 PVP 對戰視窗。

      連續發送 UIPacket.openUI(int, int)(UI 50)與 CField.sendPVPMaps() 兩個封包。

    • sendAzwanWindow

      public void sendAzwanWindow()
      開啟阿斯旺(Azwan)視窗。

      發送 UIPacket.openUI(int, int)(UI 70)封包。

    • sendFriendWindow

      public void sendFriendWindow()
      開啟好友(Friendship)視窗。

      以玩家當前可新增的好友額度(getFriendShipToAdd())發送 UIPacket.sendFriendWindow(int) 封包。

    • sendDojoRanks

      public void sendDojoRanks()
      查詢武陵道場(Mu Lung Dojo)排行榜並發送給客戶端。

      dojo_ranks 資料表讀取前 50 筆(依通關時間遞增)後,以 CWvsContext.getMulungRanks(ResultSet) 組出封包發送。讀取失敗時記錄錯誤並中止(不丟出)。

    • sendRepairWindow

      public void sendRepairWindow()
      開啟裝備修理視窗。

      以目前 NPC 的 id 發送 UIPacket.sendRepairWindow(int) 封包。

    • sendProfessionWindow

      public void sendProfessionWindow()
      開啟專業技能(Profession)視窗。

      發送 UIPacket.openUI(int, int)(UI 42)封包。

    • setDojoMode

      public void setDojoMode(int mode)
      設定武陵道場的進行模式。

      玩家不在隊伍時僅對自己設定(setDojoMode(getDojoMode(mode)));在隊伍中時, 遍歷隊伍成員並對每位線上玩家分別設定。

      Parameters:
      mode - 道場模式參數(會先經各玩家的 getDojoMode(mode) 轉換後再套用)
    • getDojoPoints

      public final int getDojoPoints()
      取得玩家目前的武陵道場點數。
      Returns:
      道場點數
    • getDojoRecord

      public final int getDojoRecord()
      取得玩家的武陵道場連續通關紀錄。

      讀取任務 GameConstants.DOJO_RECORD 的自訂資料(不更新紀錄計數)。

      Returns:
      道場連續通關紀錄值
    • setDojoRecord

      public void setDojoRecord(boolean reset)
      更新或重置玩家的武陵道場連續通關紀錄。

      reset == true 時將 GameConstants.DOJO_RECORDGameConstants.DOJO 兩個任務的自訂資料皆歸零;reset == false 時將 DOJO_RECORD 的紀錄值加一。會寫入任務自訂資料(玩家狀態變更)。

      Parameters:
      reset - true 重置紀錄,false 將紀錄加一
    • start_DojoAgent

      public boolean start_DojoAgent(boolean dojo, boolean party)
      啟動武陵道場或祕密特務(Agent)並傳送玩家進入。

      dojo == true 時委派 Event_DojoAgent.warpStartDojo(MapleCharacter, boolean)(道場), 否則委派 Event_DojoAgent.warpStartAgent(MapleCharacter, boolean)(特務)。會傳送玩家。

      Parameters:
      dojo - true 進入武陵道場,false 進入祕密特務
      party - true 以隊伍方式進入
      Returns:
      啟動/傳送成功回傳 true,否則 false
    • start_PyramidSubway

      public boolean start_PyramidSubway(int pyramid)
      啟動金字塔(Pyramid)或地鐵(Subway)活動並傳送玩家進入。

      pyramid >= 0 時委派 Event_PyramidSubway.warpStartPyramid(MapleCharacter, int)(傳入該關卡編號), 否則委派 Event_PyramidSubway.warpStartSubway(MapleCharacter)。會傳送玩家。

      Parameters:
      pyramid - 金字塔關卡編號;傳入負數表示改為啟動地鐵活動
      Returns:
      啟動/傳送成功回傳 true,否則 false
    • bonus_PyramidSubway

      public boolean bonus_PyramidSubway(int pyramid)
      傳送玩家進入金字塔(Pyramid)或地鐵(Subway)的獎勵關卡。

      pyramid >= 0 時委派 Event_PyramidSubway.warpBonusPyramid(MapleCharacter, int)(傳入該關卡編號), 否則委派 Event_PyramidSubway.warpBonusSubway(MapleCharacter)。會傳送玩家。

      Parameters:
      pyramid - 金字塔關卡編號;傳入負數表示改為地鐵獎勵關卡
      Returns:
      傳送成功回傳 true,否則 false
    • getKegs

      public final short getKegs()
      取得煙火(Fireworks)活動中火藥桶(kegs)的累積百分比。
      Returns:
      火藥桶累積百分比
    • get香爐

      public final short get香爐()
      取得煙火活動中香爐的累積百分比。
      Returns:
      香爐累積百分比
    • giveKegs

      public void giveKegs(int kegs)
      由目前玩家為煙火活動貢獻火藥桶(kegs)。

      委派 getFireWorks().giveKegs,會變更頻道煙火活動狀態。

      Parameters:
      kegs - 貢獻的火藥桶數量
    • give香爐

      public void give香爐(int 香爐)
      由目前玩家為煙火活動貢獻香爐。

      委派 getFireWorks().give香爐,會變更頻道煙火活動狀態。

      Parameters:
      香爐 - 貢獻的香爐數量
    • getSunshines

      public final short getSunshines()
      取得煙火活動中陽光(sunshines)的累積百分比。
      Returns:
      陽光累積百分比
    • addSunshines

      public void addSunshines(int kegs)
      由目前玩家為煙火活動貢獻陽光(sunshines)。

      委派 getFireWorks().giveSuns,會變更頻道煙火活動狀態。

      Parameters:
      kegs - 貢獻的陽光數量
    • getDecorations

      public final short getDecorations()
      取得煙火活動中裝飾品(decorations)的累積百分比。
      Returns:
      裝飾品累積百分比
    • addDecorations

      public void addDecorations(int kegs)
      由目前玩家為煙火活動貢獻裝飾品(decorations)。

      委派 getFireWorks().giveDecs,會變更頻道煙火活動狀態;過程拋出例外時記錄錯誤並吞下(不丟出)。

      Parameters:
      kegs - 貢獻的裝飾品數量
    • getCarnivalParty

      public final MapleCarnivalParty getCarnivalParty()
      取得目前玩家所屬的怪物嘉年華(Carnival)隊伍。
      Returns:
      玩家的 MapleCarnivalParty,未加入時可能為 null
    • getNextCarnivalRequest

      public final MapleCarnivalChallenge getNextCarnivalRequest()
      取得目前玩家收到的下一個怪物嘉年華對戰邀請。
      Returns:
      下一個 MapleCarnivalChallenge,無邀請時可能為 null
    • getCarnivalChallenge

      public final MapleCarnivalChallenge getCarnivalChallenge(MapleCharacter chr)
      為指定玩家建立一個新的怪物嘉年華對戰挑戰物件。
      Parameters:
      chr - 發起挑戰的 MapleCharacter
      Returns:
      以該玩家為對象建立的 MapleCarnivalChallenge
    • maxStats

      public void maxStats()
      將玩家四圍(STR/DEX/INT/LUK)與血量/魔力上限拉滿。

      四圍皆設為 32767、HP/MAXHP 設為 99999;MP/MAXMP 一般設為 99999,但若玩家為惡魔職業 (GameConstants.isDemon(int))則改設為 10。重算本地屬性後,發送 CWvsContext.updatePlayerStats(Map, MapleCharacter) 封包同步至客戶端。會直接變更玩家屬性狀態並發送封包。

    • getSpeedRun

      public Triple<String, Map<Integer,String>, Long> getSpeedRun(String typ)
      取得指定遠征類型的速通(speed run)排行資料。

      typ 解析為 ExpeditionType 後查詢 SpeedRunner.getSpeedRunData(ExpeditionType); 無資料時回傳一個空的 Triple(空字串、空 map、0L)。

      Parameters:
      typ - 遠征類型名稱(ExpeditionType 列舉名)
      Returns:
      速通資料三元組(標題、排名項目對照、時間戳記)
      Throws:
      IllegalArgumentException - 當 typ 不是合法的 ExpeditionType 名稱
    • getSR

      public boolean getSR(Triple<String, Map<Integer,String>, Long> ma, int sel)
      顯示速通資料中指定排名項目的內容。

      ma 的排名對照(mid)取出索引 sel 的字串:若為空則結束對話 (dispose())並回傳 false;否則以 sendOk(String) 顯示並回傳 true

      Parameters:
      ma - 由 getSpeedRun(String) 取得的速通資料三元組
      sel - 欲顯示的排名項目索引
      Returns:
      有內容並已顯示回傳 true,否則回傳 false(並已結束對話)
    • getEquip

      public Equip getEquip(int itemid)
      依道具 ID 建立一件對應的裝備(Equip)物件。

      委派 MapleItemInformationProvider.getEquipById(int) 並轉型為 Equip

      Parameters:
      itemid - 裝備道具 ID
      Returns:
      新建的 Equip 實例
    • setExpiration

      public void setExpiration(Object statsSel, long expire)
      為一件裝備設定到期時間(以天數計)。

      僅當 statsSelEquip 時生效,將其到期時間設為「目前時間 + expire 天」。 其他型別為無操作。

      Parameters:
      statsSel - 目標物件,須為 Equip 才會處理
      expire - 自現在起算的有效天數
    • setLock

      public void setLock(Object statsSel)
      為一件裝備加上鎖定或不可交易旗標。

      僅當 statsSelEquip 時生效:無到期時間(-1)的裝備加上 ItemFlag.LOCK,否則加上 ItemFlag.UNTRADEABLE。其他型別為無操作。

      Parameters:
      statsSel - 目標物件,須為 Equip 才會處理
    • addFromDrop

      public boolean addFromDrop(Object statsSel)
      將一個物品實例直接加入玩家背包。

      僅當 statsSelItem 時生效:先以 MapleInventoryManipulator.checkSpace(MapleClient, int, int, String) 檢查空間,足夠時再以 MapleInventoryManipulator.addFromDrop(MapleClient, Item, boolean) 加入。會變更玩家背包並可能發送封包。

      Parameters:
      statsSel - 欲加入的物品,須為 Item
      Returns:
      成功加入回傳 true;空間不足或型別不符回傳 false
    • replaceItem

      public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type)
      以指定屬性偏移取代玩家背包中某個槽位的物品(不消耗升級次數)。

      委派 replaceItem(int, int, Object, int, String, boolean)takeSlot 固定為 false

      Parameters:
      slot - 來源物品所在槽位
      invType - 背包類型代碼(對應 MapleInventoryType
      statsSel - 取代用的物品物件(Item),為空時改用槽位現有物品
      offset - 屬性增減量(> 0 才會套用屬性修改,且僅限裝備欄)
      type - 要修改的屬性名稱(如 "Slots""STR""WATK" 等)
      Returns:
      取代成功回傳 true,否則 false
    • replaceItem

      public boolean replaceItem(int slot, int invType, Object statsSel, int offset, String type, boolean takeSlot)
      取代玩家背包中某個槽位的物品,並可對裝備套用屬性偏移。

      解析 invTypeMapleInventoryType(無效則回傳 false)。來源物品取自該槽位, 若該槽位為空或 statsSel 本身為 Item 則改用 statsSel

      offset > 0(且必須為 MapleInventoryType.EQUIP 裝備欄,否則回傳 false)時: 若 takeSlottrue,先消耗一次可升級次數(不足則回傳 false)並依到期狀態加上 ItemFlag.LOCKItemFlag.UNTRADEABLE 旗標;接著依 type 對裝備的對應屬性(升級次數/ 金鎚/等級/四圍/攻防/命中迴避/速度跳躍/道具經驗/到期/旗標等)加上 offset,最後複製為新物件。

      最終自原槽位移除舊物品(MapleInventoryManipulator.removeFromSlot(MapleClient, MapleInventoryType, short, short, boolean))並以 MapleInventoryManipulator.addFromDrop(MapleClient, Item, boolean) 加入結果物品。會變更玩家背包並可能發送封包。

      Parameters:
      slot - 來源物品所在槽位
      invType - 背包類型代碼(對應 MapleInventoryType
      statsSel - 取代用的物品物件(Item),為空時改用槽位現有物品
      offset - 屬性增減量(> 0 才會套用屬性修改,且僅限裝備欄)
      type - 要修改的屬性名稱(如 "Slots""Level""Hammer""STR" 等)
      takeSlot - true 時先消耗一次可升級次數並加上鎖定/不可交易旗標
      Returns:
      取代成功回傳 true,背包類型無效或裝備條件不符回傳 false
    • replaceItem

      public boolean replaceItem(int slot, int invType, Object statsSel, int upgradeSlots)
      取代玩家背包中某個槽位的物品,並增加其可升級次數。

      委派 replaceItem(int, int, Object, int, String)type 固定為 "Slots"

      Parameters:
      slot - 來源物品所在槽位
      invType - 背包類型代碼(對應 MapleInventoryType
      statsSel - 取代用的物品物件(Item),為空時改用槽位現有物品
      upgradeSlots - 欲增加的可升級次數
      Returns:
      取代成功回傳 true,否則 false
    • isCash

      public boolean isCash(int itemId)
      判斷指定道具是否為現金(cash)道具。

      委派 MapleItemInformationProvider.isCash(int)

      Parameters:
      itemId - 道具 ID
      Returns:
      為現金道具回傳 true,否則 false
    • getTotalStat

      public int getTotalStat(int itemId)
      取得指定裝備道具的總屬性值。

      先以 MapleItemInformationProvider.getEquipById(int) 建立該裝備,再委派 MapleItemInformationProvider.getTotalStat(Equip) 計算總和。

      Parameters:
      itemId - 裝備道具 ID
      Returns:
      該裝備的總屬性值
    • getReqLevel

      public int getReqLevel(int itemId)
      取得指定道具的需求等級。

      委派 MapleItemInformationProvider.getReqLevel(int)

      Parameters:
      itemId - 道具 ID
      Returns:
      該道具的需求等級
    • getEffect

      public MapleStatEffect getEffect(int buff)
      取得指定道具 ID 對應的增益效果(MapleStatEffect)。

      委派 MapleItemInformationProvider.getItemEffect(int)

      Parameters:
      buff - 提供增益效果的道具 ID
      Returns:
      對應的 MapleStatEffect,無對應效果時可能為 null
    • buffGuild

      public void buffGuild(int buff, int duration, String msg)
      對整個公會成員施放道具效果的增益。

      buff 道具 ID 取得 MapleStatEffect,若該效果存在且玩家有公會, 則遍歷所有頻道(ChannelServer.getAllInstances())對同公會的每位 MapleCharacter 套用效果(持續 duration 毫秒),並向其發送一則 5 號提示訊息。

      Parameters:
      buff - 提供增益效果的道具 ID
      duration - 增益持續時間(毫秒)
      msg - 提示訊息中顯示的增益名稱
    • createAlliance

      public boolean createAlliance(String alliancename)
      以玩家及其隊伍第二位成員為雙方會長建立聯盟。

      取得玩家隊伍中索引 1 的另一名成員作為對方公會代表,委派至 World.Alliance.createAlliance(String, int, int, int, int)。若隊伍成員缺失、與自己同人,或建立過程拋出例外則回傳 false

      Parameters:
      alliancename - 欲建立的聯盟名稱
      Returns:
      建立成功回傳 true,否則 false
    • addCapacityToAlliance

      public boolean addCapacityToAlliance()
      擴充玩家所屬聯盟的成員上限。

      須玩家同時為公會會長(guildRank == 1)與聯盟會長(allianceRank == 1)且為聯盟領袖。 成功時委派至 World.Alliance.changeAllianceCapacity(int),並扣除 MapleGuildAlliance.CHANGE_CAPACITY_COST 楓幣。

      Returns:
      擴充成功回傳 true,否則 false
    • disbandAlliance

      public boolean disbandAlliance()
      解散玩家所屬的聯盟。

      須玩家同時為公會會長與聯盟會長且為聯盟領袖,成功時委派至 World.Alliance.disbandAlliance(int)

      Returns:
      解散成功回傳 true,否則 false
    • getLastMsg

      public byte getLastMsg()
      取得前一個送出的對話型別代碼。
      Returns:
      上一則對話的 lastMsg 型別代碼
    • setLastMsg

      public final void setLastMsg(byte last)
      設定前一個對話型別代碼,用於驗證玩家回應。
      Parameters:
      last - 欲記錄的對話型別代碼
    • maxAllSkills

      public final void maxAllSkills()
      將玩家所有可用技能調至最高等級。

      遍歷 SkillFactory.getAllSkills(),僅納入 GameConstants.isApplicableSkill(int) 且 ID 小於 90000000 的技能(排除幼兒/附加/抗性技能),以最高等級組成 SkillEntry 後委派至 MapleCharacter.changeSkillsLevel(Map)

    • maxSkillsByJob

      public final void maxSkillsByJob()
      將玩家當前職業的技能調至最高等級。委派至 MapleCharacter.maxSkillsByJob()
    • resetStats

      public final void resetStats(int str, int dex, int z, int luk)
      將玩家的四項基礎能力值重設為指定數值。委派至 MapleCharacter.resetStats(int, int, int, int)
      Parameters:
      str - 力量
      dex - 敏捷
      z - 智力
      luk - 幸運
    • levelUp

      public final void levelUp()
      讓玩家提升一級。委派至 MapleCharacter.levelUp()
    • dropItem

      public final boolean dropItem(int slot, int invType, int quantity)
      將玩家指定欄位的道具丟到地面。

      委派至 MapleInventoryManipulator.drop(MapleClient, MapleInventoryType, short, short)。若 invType 無法對應到合法的 MapleInventoryType 則回傳 false

      Parameters:
      slot - 道具所在的欄位索引
      invType - 道具的物品欄型別代碼
      quantity - 欲丟出的數量
      Returns:
      丟出成功回傳 true,型別非法則 false
    • getAllPotentialInfo

      public final List<Integer> getAllPotentialInfo()
      取得所有潛在能力資訊的 ID 清單(已排序)。
      Returns:
      由小到大排序的潛在能力 ID 清單
    • getAllPotentialInfoSearch

      public final List<Integer> getAllPotentialInfoSearch(String content)
      依關鍵字搜尋符合的潛在能力 ID 清單(已排序)。

      遍歷所有潛在能力選項(StructItemOption),凡其字串描述包含 content 即收錄該 ID。

      Parameters:
      content - 要比對的關鍵字
      Returns:
      描述含關鍵字的潛在能力 ID 清單,由小到大排序
    • getPotentialInfo

      public final String getPotentialInfo(int id)
      組出某潛在能力 ID 的可讀說明字串。

      以每 10 等為一段(1~10、11~20…)列出各等級的選項描述,回傳含 MapleStory 對話色碼/格式標記的字串供對話框顯示。

      Parameters:
      id - 潛在能力 ID
      Returns:
      含格式標記、依等級分段的說明字串
    • getEquipPotentialList

      public List<Integer> getEquipPotentialList(Equip equip)
      列出指定裝備在其目前潛能位階下「可能出現」的所有潛能 ID(每個 ID 僅列一次)。

      依裝備需求等級(reqLevel / 10)取每個潛能 ID 的代表等級項,套用與實際洗潛能 (見 InventoryHandler)相同的過濾條件:等級上限、GameConstants.optionTypeFits 裝備類型、GameConstants.potentialIDFits 位階/排數;opID >= 60000(特殊潛能)一律略過。

      Parameters:
      equip - 目標裝備
      Returns:
      可能出現的潛能 ID 清單(已去重)
    • getPotentialString

      public String getPotentialString(Equip equip, int potId)
      取得指定裝備在某潛能 ID 下、對應其需求等級段的可讀說明字串。

      說明字串由 MapleItemInformationProvider.runEtc() 預先以 ItemOption.img 的 info/string 模板組好(見 StructItemOption.levelText);等級段以 (reqLevel - 1) / 10 + 1(最小為 1)計算。

      Parameters:
      equip - 目標裝備
      potId - 潛能 ID
      Returns:
      對應等級段的潛能說明;無資料或越界時回傳空字串
    • sendRPS

      public final void sendRPS()
      向玩家開啟剪刀石頭布(RPS)小遊戲視窗。送出 CField.getRPSMode(byte, int, int, int) 封包。
    • setQuestRecord

      public final void setQuestRecord(Object ch, int questid, String data)
      設定指定角色某任務的自訂資料欄位。

      取得(必要時新增)該任務狀態後寫入 customDatach 會被轉型為 MapleCharacter

      Parameters:
      ch - 目標角色物件(MapleCharacter
      questid - 任務 ID
      data - 欲寫入的自訂資料字串
    • doWeddingEffect

      public final void doWeddingEffect(Object ch)
      在地圖上播放結婚儀式的演出流程。

      先向地圖廣播新娘誓詞,並透過 Timer.CloneTimer 排程兩段延遲(10 秒、20 秒)的演出: 10 秒後廣播新郎誓詞;20 秒後設定雙方婚姻相關任務記錄(160001160002)、 顯示 NPC 對白與擴展地圖特效,並向雙方的公會、家族廣播結婚訊息。若任一方離線則改為將玩家傳送回 地圖 680000500。會多次廣播封包並寫入任務記錄。

      Parameters:
      ch - 結婚對象角色物件(MapleCharacter
    • putKey

      public void putKey(int key, int type, int action)
      變更玩家某個按鍵的快捷設定並回送新的按鍵配置。

      委派至 MapleCharacter.changeKeybinding(int, byte, int),並送出 CField.getKeymap(MapleKeyLayout) 封包更新客戶端快捷列。

      Parameters:
      key - 按鍵代碼
      type - 動作型別
      action - 綁定的動作 ID
    • logDonator

      public void logDonator(String log, int previous_points)
      記錄一筆贊助(捐獻)點數異動。

      將玩家名稱、CID、帳號、訊息與點數前後值寫入資料庫 donorlog 資料表, 並透過 FileoutputUtil.log 寫入贊助記錄檔。資料庫寫入失敗時僅記錄錯誤,不中斷流程。

      Parameters:
      log - 異動描述訊息
      previous_points - 異動前的點數
    • doRing

      public void doRing(String name, int itemid)
      為玩家與指定對象建立戒指(情侶/友情等配對)。委派至 PlayersHandler.DoRing(MapleClient, String, int)
      Parameters:
      name - 配對對象的角色名稱
      itemid - 戒指道具 ID
    • getNaturalStats

      public int getNaturalStats(int itemid, String it)
      取得某裝備的原始(未強化)指定能力值。

      查詢 MapleItemInformationProvider.getEquipStats(int) 中以 it 為鍵的數值,查無則回傳 0

      Parameters:
      itemid - 裝備道具 ID
      it - 能力值的鍵名(如力量、敏捷等)
      Returns:
      對應的原始能力值,查無時為 0
    • isEligibleName

      public boolean isEligibleName(String t)
      檢查名稱是否可用於建立角色。

      須通過 MapleCharacterUtil.canCreateChar(String, boolean),且非禁用名稱(GM 不受禁用名稱限制)。

      Parameters:
      t - 欲檢查的名稱
      Returns:
      名稱合法可用回傳 true,否則 false
    • checkDrop

      public String checkDrop(int mobId)
      組出指定怪物的掉寶資訊可讀字串。

      查詢 MapleMonsterInformationProvider.retrieveDrop(int),逐項列出道具、掉落機率 (已乘上頻道掉落倍率)與相關任務;楓幣掉落以錢袋圖示顯示並換算頻道楓幣倍率。 查無資料時回傳「查無掉寶資訊。」。

      Parameters:
      mobId - 怪物 ID
      Returns:
      含格式標記的掉寶資訊字串,或查無提示
    • getLeftPadded

      public String getLeftPadded(String in, char padchar, int length)
      將字串向左補齊至指定長度。委派至 StringUtil.getLeftPaddedStr(String, char, int)
      Parameters:
      in - 原始字串
      padchar - 補齊用的字元
      length - 補齊後的目標長度
      Returns:
      左側補齊後的字串
    • handleDivorce

      public void handleDivorce()
      處理玩家的離婚流程。

      若玩家無婚姻則送出提示並返回。依配偶所在頻道分流:配偶離線時直接更新資料庫 (queststatuscharacters 的婚姻欄位)並清空雙方任務記錄;配偶在線時 通知對方、清空雙方婚姻 ID 與任務記錄。會送出對話框、寫入資料庫並變動雙方婚姻狀態。

    • getReadableMillis

      public String getReadableMillis(long startMillis, long endMillis)
      將兩個時間點之間的毫秒差轉為可讀字串。委派至 StringUtil.getReadableMillis(long, long)
      Parameters:
      startMillis - 起始時間(毫秒)
      endMillis - 結束時間(毫秒)
      Returns:
      兩時間點間隔的可讀字串
    • sendUltimateExplorer

      public void sendUltimateExplorer()
      向玩家送出「究極冒險家」相關封包。送出 CWvsContext.ultimateExplorer()
    • changeJobById

      public void changeJobById(short job)
      將玩家轉職為指定職業 ID。委派至 MapleCharacter.changeJob(int)
      Parameters:
      job - 目標職業 ID
    • getJobId

      public int getJobId()
      取得玩家目前的職業 ID。
      Returns:
      玩家職業 ID
    • getLevel

      public int getLevel()
      取得玩家目前的等級。
      Returns:
      玩家等級
    • getEquipId

      public int getEquipId(byte slot)
      取得玩家裝備(EQUIP)物品欄指定欄位的道具 ID。
      Parameters:
      slot - 欄位索引
      Returns:
      該欄位道具的 ID
    • getUseId

      public int getUseId(byte slot)
      取得玩家消耗(USE)物品欄指定欄位的道具 ID。
      Parameters:
      slot - 欄位索引
      Returns:
      該欄位道具的 ID
    • getSetupId

      public int getSetupId(byte slot)
      取得玩家裝飾(SETUP)物品欄指定欄位的道具 ID。
      Parameters:
      slot - 欄位索引
      Returns:
      該欄位道具的 ID
    • getCashId

      public int getCashId(byte slot)
      取得玩家現金(CASH)物品欄指定欄位的道具 ID。
      Parameters:
      slot - 欄位索引
      Returns:
      該欄位道具的 ID
    • getETCId

      public int getETCId(byte slot)
      取得玩家其他(ETC)物品欄指定欄位的道具 ID。
      Parameters:
      slot - 欄位索引
      Returns:
      該欄位道具的 ID
    • sendPendant

      public void sendPendant(boolean b)
      開啟或關閉玩家的吊墜(pendant)欄位。送出 CWvsContext.pendantSlot(boolean) 封包。
      Parameters:
      b - true 啟用吊墜欄位,false 關閉
    • addPendantSlot

      public void addPendantSlot(int days)
      給予玩家限時的吊墜(雙項鍊)額外欄位,並立即在客戶端開啟。

      GameConstants.PENDANT_SLOT 任務的自訂資料設為「現在 + days 天」的到期時間戳, 再依到期時間是否仍在未來(到期 > 現在)送出 CWvsContext.pendantSlot(boolean) 開啟封包。

      Parameters:
      days - 吊墜欄位的有效天數
    • getCompensation

      public Triple<Integer,Integer,Integer> getCompensation()
      查詢玩家已確認的補償記錄。

      從資料庫 compensationlog_confirmed 資料表以角色名稱查詢首筆記錄, 回傳 Triple(補償數值、已領取旗標、贊助者)。查無或查詢失敗時回傳 null

      Returns:
      補償記錄(數值/已領取/贊助者),查無或例外時為 null
    • deleteCompensation

      public boolean deleteCompensation(int taken)
      更新玩家補償記錄的已領取狀態。

      將資料庫 compensationlog_confirmed 資料表中該角色的 taken 欄位更新為指定值。 寫入失敗時回傳 false

      Parameters:
      taken - 欲寫入的已領取旗標值
      Returns:
      更新成功回傳 true,例外時 false
    • gainAPS

      public void gainAPS(int gain)
      增加玩家的 AP 重置點數(APS)。委派至 MapleCharacter.gainAPS(int)
      Parameters:
      gain - 要增加的 APS 數量
    • foundData

      public boolean foundData(int type, String search)
      檢查指定類別的資料中是否有符合關鍵字的項目。委派至 SearchGenerator.foundData(int, String)
      Parameters:
      type - 搜尋的資料類別
      search - 搜尋關鍵字
      Returns:
      找到符合項目回傳 true,否則 false
    • searchData

      public String searchData(int type, String search)
      搜尋指定類別資料並回傳可讀結果字串。委派至 SearchGenerator.searchData(int, String)
      Parameters:
      type - 搜尋的資料類別
      search - 搜尋關鍵字
      Returns:
      符合項目的結果字串
    • getSearchData

      public int[] getSearchData(int type, String search)
      搜尋指定類別資料並回傳符合的 ID 陣列。

      委派至 SearchGenerator.getSearchData(int, String) 取得結果對應表,再取出其鍵集合為 int[]。 查無結果時回傳 null

      Parameters:
      type - 搜尋的資料類別
      search - 搜尋關鍵字
      Returns:
      符合項目的 ID 陣列,查無時為 null
    • gachapon

      public int gachapon(int type)
      執行一次轉蛋並將抽中的道具加入玩家物品欄。

      MapleGachapon.randomItem(int) 依轉蛋類型隨機抽取道具,計算數量後透過 MapleInventoryManipulator.addbyId_Gachapon(MapleClient, int, short) 加入物品欄;抽中物或加入失敗時回傳 -1。 若該道具設定了喇叭(smega)類型,會以 CWvsContext.getGachaponMega(String, Item, boolean, int) 向全頻廣播中獎訊息。 會變動玩家物品欄並可能發送廣播封包。

      Parameters:
      type - 轉蛋機類型
      Returns:
      抽中道具的 ID,失敗時為 -1
    • hasSubwpn

      public boolean hasSubwpn()
      檢查玩家是否「未」裝備副武器或盾牌。

      檢視已裝備(EQUIPPED)欄位 -10-110;任一格有道具時回傳 false, 兩格皆空才回傳 true(即可裝備副武器)。

      Returns:
      兩個副手欄位皆為空回傳 true,否則 false
    • hasSquadByMap

      public boolean hasSquadByMap()
      檢查玩家當前地圖是否已有遠征隊(squad)。
      Returns:
      當前地圖存在遠征隊回傳 true,否則 false
    • hasEventInstance

      public boolean hasEventInstance()
      檢查玩家目前是否處於某個事件副本(event instance)中。
      Returns:
      玩家在事件副本中回傳 true,否則 false
    • liveReceiveMedal

      public boolean liveReceiveMedal()
      領取「直播(live)」活動勳章,每個帳號限領一次。

      流程:先以角色名稱查 livemedals 表(不存在則不可領),再以帳號 id 查是否已領(已領則拒絕), 通過後將該筆 amount 更新為 0 並寫入 logs/data/直播.txt 領取紀錄。實際發放裝備的 程式碼目前已註解停用。讀寫皆透過共用 ThreadLocal 連線;例外會寫入 NPCConversationManager.txt 而不外拋。

      Returns:
      成功領取回傳 true;角色未登錄於勳章表單或該帳號已領取則回傳 false
    • ReceiveMedal

      public boolean ReceiveMedal()
      領取「RC」活動勳章,每個帳號限領一次。

      liveReceiveMedal() 同邏輯,但改查 rcmedals 表、領取紀錄寫入 logs/data/RC.txt。 通過後將該筆 amount 更新為 0;發放裝備的程式碼已註解停用。例外寫入 NPCConversationManager.txt 而不外拋。

      Returns:
      成功領取回傳 true;角色未登錄於勳章表單或該帳號已領取則回傳 false
    • ReceiveMedal1000

      public boolean ReceiveMedal1000()
      領取「RC 1000」活動勳章,每個帳號限領一次。

      ReceiveMedal() 同邏輯,但改查 rcmedals1000 表;領取紀錄同樣寫入 logs/data/RC.txt。 通過後將該筆 amount 更新為 0;發放裝備的程式碼已註解停用。例外寫入 NPCConversationManager.txt 而不外拋。

      Returns:
      成功領取回傳 true;角色未登錄於勳章表單或該帳號已領取則回傳 false
    • fbReceiveMedal

      public boolean fbReceiveMedal()
      領取「Facebook 分享」活動勳章,每個帳號限領一次。

      ReceiveMedal() 同邏輯,但改查 fbmedals 表、領取紀錄寫入 logs/data/fb分享.txt。 通過後將該筆 amount 更新為 0;發放裝備的程式碼已註解停用。例外寫入 NPCConversationManager.txt 而不外拋。

      Returns:
      成功領取回傳 true;角色未登錄於勳章表單或該帳號已領取則回傳 false
    • hasEMByMap

      public boolean hasEMByMap()
      檢查玩家目前所在地圖是否綁定了活動管理器(event manager / EM)。
      Returns:
      地圖有對應的 EMByMap 時回傳 true,否則 false
    • processCommand

      public void processCommand(String line)
      以本對話所屬玩家的身分,將一行文字當作一般(NORMAL)玩家指令送交 CommandProcessor 執行。

      供腳本代為觸發 @ 指令;副作用視該指令而定。

      Parameters:
      line - 完整指令字串(含前綴)
    • getSkillMenu

      public String getSkillMenu(int job)
      組出指定職業可用技能的選單字串,供技能相關 NPC 以 sendSimple 顯示。

      逐一走訪 SkillFactory.getAllSkills(),略過初心者與專業(採集/製作)技能; 純讀取、不變動任何狀態。

      Parameters:
      job - 職業代碼
      Returns:
      以選單連結組成的字串(初心者職業回傳空字串)