Class InventoryHandler

java.lang.Object
handling.channel.handler.InventoryHandler

public class InventoryHandler extends Object
頻道伺服器中「背包與道具操作」的封包處理器,由 MapleServerHandler 的封包分派表呼叫。

本類別為一組 static 方法的集合,將玩家對道具的操作封包(以 LittleEndianAccessor 讀取) 套用到 MapleCharacterMapleInventory,多數變更實際委由 MapleInventoryManipulator 執行、並以 InventoryPacket 等建構器回送。涵蓋範圍包括:

  • 道具移動/整理/合併與背包擴充(ItemMoveItemSortItemGatherSwitchBag);
  • 使用消耗品、卷軸強化、附加能力/星岩/放大鏡等裝備加工(UseItemUseUpgradeScrollUseNebuliteUseMagnify);
  • 召喚包、寶箱、坐騎餵食、現金道具與技能書(UseSummonBagUseTreasureChestUseCashItemUseSkillBook);
  • 地面道具的玩家/寵物拾取(Pickup_PlayerPickup_Pet)與貓頭鷹搜尋/傳送石等工具道具。

關鍵協作者:MapleItemInformationProvider(道具屬性查詢)、RandomRewardsStructRewardItem(隨機獎勵)、MapleQuestNPCScriptManager (腳本化道具)、DatabaseConnection(卷軸記錄等持久化)。

  • Field Details

  • Constructor Details

    • InventoryHandler

      public InventoryHandler()
  • Method Details

    • ItemMove

      public static final void ItemMove(LittleEndianAccessor slea, MapleClient c)
      處理玩家在背包中拖曳道具的封包:依來源/目標欄位判斷為卸裝、穿裝、丟棄到地面或單純搬移。

      讀取道具類型與來源/目標欄位、數量後委派給 MapleInventoryManipulator: 目標為正且來源為負時 unequip、目標為負時 equip、目標為 0 時 drop (丟到地圖),其餘為背包內 move。若玩家背包遭鎖定(hasBlockedInventory)則直接忽略 以防作弊。

      Parameters:
      slea - 入站封包讀取器(tick、道具類型、來源/目標欄位、數量)
      c - 發出此動作的玩家連線
    • SwitchBag

      public static final void SwitchBag(LittleEndianAccessor slea, MapleClient c)
      處理玩家在 ETC 背包的可擴充子袋(bag)之間搬移道具的封包。

      讀取來源/目標欄位後,僅在兩者皆 >= 100(屬於子袋的虛擬欄位範圍)時, 委派 MapleInventoryManipulator.move(MapleClient, MapleInventoryType, short, short)MapleInventoryType.ETC 內搬移; 背包鎖定時忽略。

      Parameters:
      slea - 入站封包讀取器(tick、來源欄位、目標欄位)
      c - 發出此動作的玩家連線
    • MoveBag

      public static final void MoveBag(LittleEndianAccessor slea, MapleClient c)
      處理玩家加入或取出 ETC 子袋(bag)的封包。

      srcFirst 旗標決定對 ETC 背包 addBagItem(放入子袋)或 removeBagItem (取出子袋),再以 MapleInventoryManipulator.move(MapleClient, MapleInventoryType, short, short) 完成欄位搬移。封包長度不足或讀到的類型 非 ETC(4)時,回送 CWvsContext.enableActions() 後中止;背包鎖定時忽略。

      Parameters:
      slea - 入站封包讀取器(tick、srcFirst 旗標、目標欄位、類型、來源欄位)
      c - 發出此動作的玩家連線
    • ItemSort

      public static final void ItemSort(LittleEndianAccessor slea, MapleClient c)
      處理玩家點擊「整理」按鈕、將指定背包內的道具往前緊靠以消除空格的封包。

      反覆找出最前面的空欄並把其後第一個有物品的欄位搬過去(透過 MapleInventoryManipulator.move(MapleClient, MapleInventoryType, short, short)),直到無可整理;完成後回送 CWvsContext.finishedSort(int)CWvsContext.enableActions()。 連線或角色為 null、背包類型未定義或背包鎖定時中止。

      Parameters:
      slea - 入站封包讀取器(tick、背包類型)
      c - 發出此動作的玩家連線
    • ItemGather

      public static final void ItemGather(LittleEndianAccessor slea, MapleClient c)
      處理玩家點擊「合併」按鈕、將指定背包內可堆疊道具依道具 ID 排序並合併堆疊的封包。

      先複製欄位 97 以前的道具、移除原物(排除 GameConstants.exItemGather 的例外道具), 再依 sortItems(List) 排序後以 MapleInventoryManipulator.addFromDrop(MapleClient, Item, boolean) 重新放回, 完成後回送 CWvsContext.finishedGather(int)CWvsContext.enableActions()。 模式 5 且有已召喚寵物時會先收回所有寵物並提示玩家重新召喚。背包鎖定時中止。

      Parameters:
      slea - 入站封包讀取器(tick、背包類型/模式)
      c - 發出此動作的玩家連線
    • UseRewardItem

      public static final boolean UseRewardItem(byte slot, int itemId, MapleClient c, MapleCharacter chr)
      使用「獎勵箱」類道具(依機率表抽出並發給一件獎勵),由 UseItem(LittleEndianAccessor, MapleClient, MapleCharacter) 等入口呼叫。

      校驗道具存在且四大背包皆有空位後,向 MapleItemInformationProvider.getRewardItem(int) 取得加權機率表,依 Randomizer 抽中後加入裝備或道具(裝備可帶期限與 GM 紀錄),扣除一個來源道具, 並廣播 EffectPacket.showRewardItemAnimation(int, String) 開箱動畫。任何前置校驗失敗會以 dropMessage 提示且回傳 false

      Parameters:
      slot - 來源道具所在欄位
      itemId - 預期的獎勵箱道具 ID(用以比對防作弊)
      c - 玩家連線
      chr - 使用道具的角色
      Returns:
      成功抽出並發放獎勵時 true,否則 false
    • UseItem

      public static final void UseItem(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用 USE 背包內一般消耗品(藥水/食物等)的封包,套用其狀態效果。

      透過 MapleItemInformationProvider.getItemEffect(int) 取得效果並 applyTo(chr);成功時扣除一個並依地圖的消耗冷卻設定設定下次可用時間 (setNextConsume)。角色死亡、位於特定地圖、處於 MapleDisease.POTION 封印、背包鎖定、PVP 中、仍在消耗冷卻內,或地圖 FieldLimitType.PotionUse 禁用藥水時, 一律回送 CWvsContext.enableActions() 並中止。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseCosmetic

      public static final void UseCosmetic(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用整形/變裝類道具(道具 ID 前綴 254)的封包。

      除一般校驗外,另檢查道具屬於整形類(itemId / 10000 == 254)且性別欄位 與角色 getGender() 相符,套用 applyTo(chr) 成功後扣除一個。校驗失敗時 回送 CWvsContext.enableActions()。角色死亡、背包鎖定或 PVP 中時中止。

      Parameters:
      slea - 入站封包讀取器(欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseReturnScroll

      public static final void UseReturnScroll(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用「返回卷軸」(回城/回特定地圖)的封包。

      透過 MapleItemInformationProvider.getItemEffect(int) 取得效果並 applyReturnScroll(chr) 傳送角色,成功時扣除一個。角色死亡、位於特定地圖、背包鎖定、 處於禁止傳送的地圖、PVP 中,或地圖 FieldLimitType.PotionUse 受限時,回送 CWvsContext.enableActions() 並中止。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseAlienSocket

      public static final void UseAlienSocket(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「外星插槽器」為裝備開出一個星岩插槽的封包。

      校驗來源道具與目標裝備後,僅在該裝備尚未有插槽(getSocketState() == 0)時 設定第一個插槽(setSocket1(0))、扣除道具並 forceReAddItem 更新;已有插槽則 提示需透過 NPC 進行。校驗失敗回送 InventoryPacket.getInventoryFull();結束時回送 MTSCSPacket.useAlienSocket(boolean)

      Parameters:
      slea - 入站封包讀取器(tick、來源道具欄位、道具 ID、目標裝備欄位)
      c - 發出此動作的玩家連線
    • UseNebulite

      public static final void UseNebulite(LittleEndianAccessor slea, MapleClient c)
      處理玩家把「星岩」(Nebulite)鑲入裝備插槽的封包。

      校驗 SETUP 背包內的星岩與目標裝備後,若插槽為空且星岩選項型別符合裝備 (GameConstants.optionTypeFits),將 StructItemOption.opID 寫入第一個插槽、扣除星岩 並 forceReAddItem 更新;最後向地圖廣播 CField.showNebuliteEffect(int, boolean) 並回送 CWvsContext.enableActions()。校驗失敗回送 InventoryPacket.getInventoryFull()

      Parameters:
      slea - 入站封包讀取器(tick、星岩欄位、道具 ID、目標裝備欄位)
      c - 發出此動作的玩家連線
    • UseNebuliteFusion

      public static final void UseNebuliteFusion(LittleEndianAccessor slea, MapleClient c)
      處理玩家「星岩融合」的封包:消耗兩顆星岩與楓幣或高級融合劑,產出一顆新星岩。

      依兩顆星岩的等級(GameConstants.getNebuliteGrade)核驗所需費用(楓幣或道具 4420000 數量、二擇一)與背包空位,計算平均等級後以 Randomizer 決定成品等級 (有 4% 機率上下浮動一階、不可升至最高 S 階),自對應等級的星岩選項中隨機抽出新道具,扣除材料/費用、 加入新星岩,並回送 CField.useNebuliteFusion(int, int, boolean)(成功)。任一校驗失敗時提示並回送失敗封包。

      Parameters:
      slea - 入站封包讀取器(tick、兩顆星岩 ID 與欄位、楓幣、高級融合劑數量)
      c - 發出此動作的玩家連線
    • UseMagnify

      public static final void UseMagnify(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「放大鏡」(或洞察技能)鑑定裝備潛在能力的封包。

      支援放大鏡道具(2460000~2460003,依需求等級限制可鑑定的裝備)與洞察 (MapleTrait.MapleTraitType.sense 達 30 級的來源欄 127)。僅在裝備為未鑑定狀態(getState() == 1) 時,依 MapleItemInformationProvider.getAllPotentialInfo() 隨機抽出符合型別與位階的潛能寫入各排 (若有鎖定潛能 lockid 相符則保留鎖定排),廣播 CField.showMagnifyingEffect(int, short)、增加洞察特性經驗、 扣除放大鏡或重加裝備,並依 ServerConstants.log_cube 記錄鑑定結果到檔案。最後重置鎖定 ID 並回送 CWvsContext.enableActions();校驗失敗回送 InventoryPacket.getInventoryFull()

      Parameters:
      slea - 入站封包讀取器(tick、放大鏡來源欄、目標裝備欄)
      c - 發出此動作的玩家連線
    • addToScrollLog

      public static final void addToScrollLog(int accountID, int charID, int scrollID, int itemID, byte oldSlots, byte newSlots, byte viciousHammer, String result, boolean ws, boolean ls, int vega)
      將一次卷軸使用結果寫入 scroll_log 資料表(稽核用)。

      副作用:對共用的 DatabaseConnection 連線執行一筆 INSERT;失敗時以 FileoutputUtil.outputFileError(String, Throwable) 記錄而不拋出。

      Parameters:
      accountID - 帳號 ID
      charID - 角色 ID
      scrollID - 使用的卷軸道具 ID
      itemID - 被強化的裝備道具 ID
      oldSlots - 強化前可用升級次數
      newSlots - 強化後可用升級次數
      viciousHammer - 已使用的黃金鐵鎚次數
      result - 結果字串(成功/失敗/詛咒等)
      ws - 是否使用白卷(white scroll)
      ls - 是否為傳說之靈(legendary spirit)施放
      vega - 維加斯卷軸(保證成功)相關旗標/次數
    • UseUpgradeScroll

      public static final boolean UseUpgradeScroll(short slot, short dst, short ws, MapleClient c, MapleCharacter chr, boolean legendarySpirit)
      套用升級卷軸到裝備(便捷重載,維加斯次數視為 0)。

      直接轉呼 UseUpgradeScroll(short, short, short, MapleClient, MapleCharacter, int, boolean)

      Parameters:
      slot - 卷軸所在欄位
      dst - 目標裝備欄位(負值代表已穿戴)
      ws - 白卷/旗標位元(bit2 表示使用白卷)
      c - 玩家連線
      chr - 使用卷軸的角色
      legendarySpirit - 是否為傳說之靈施放(對已穿戴裝備施卷)
      Returns:
      卷軸動作成功處理時 true
    • UseUpgradeScroll

      public static final boolean UseUpgradeScroll(short slot, short dst, short ws, MapleClient c, MapleCharacter chr, int vegas, boolean legendarySpirit)
      套用升級卷軸到裝備,處理白卷消耗、成功/失敗/詛咒結果與相關封包廣播。

      核心強化流程:判定是否使用白卷(ws bit2)、定位目標裝備(已穿戴 / 背包 / 傳說之靈), 透過 MapleItemInformationProvider 計算結果並更新裝備,扣除卷軸(與白卷),廣播強化動畫, 並視結果(Equip.ScrollResult.SUCCESSEquip.ScrollResult.CURSE)呼叫 equipChanged()vegas > 0 表示維加斯卷軸(保證成功、不耗白卷、不重複動畫)。

      Parameters:
      slot - 卷軸所在欄位
      dst - 目標裝備欄位(負值代表已穿戴)
      ws - 白卷/旗標位元(bit2 表示使用白卷)
      c - 玩家連線
      chr - 使用卷軸的角色
      vegas - 維加斯卷軸次數,0 表示一般卷軸
      legendarySpirit - 是否為傳說之靈施放(對已穿戴裝備施卷)
      Returns:
      卷軸動作成功處理時 true,校驗失敗時 false
    • UseSkillBook

      public static final boolean UseSkillBook(byte slot, int itemId, MapleClient c, MapleCharacter chr)
      使用「技能書」習得或提升精通技能等級,由 UseItem(LittleEndianAccessor, MapleClient, MapleCharacter) 等入口呼叫。

      MapleItemInformationProvider.getEquipStats(int) 取得技能書資料,逐一檢查書中技能是否 可由角色職業習得、是否達到前置等級且尚未滿精通;符合者依成功率(Randomizer)決定成敗,成功時以 changeSingleSkillLevel 提升精通上限,無論成敗皆扣除一本書並向地圖廣播 CWvsContext.useSkillBook(MapleCharacter, int, int, boolean, boolean)。背包鎖定或資料異常時不處理。

      Parameters:
      slot - 技能書所在欄位
      itemId - 預期的技能書道具 ID(用以比對防作弊)
      c - 玩家連線
      chr - 使用技能書的角色
      Returns:
      角色具備可習得之技能(已嘗試使用)時 true,否則 false
    • UseExpPotion

      public static final void UseExpPotion(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用「經驗藥水」(在限定等級區間內分次給予經驗)的封包。

      MapleItemInformationProvider.getExpPotionLev(int) 取得等級區間,並以 getOneInfo/updateOneInfoGameConstants.EXP_POTION)保存此道具的累進進度 (上次等級+剩餘經驗,以 # 分隔)。每次呼叫補滿當前等級所需經驗、扣減剩餘額度並 gainExp,回送 CWvsContext.updateExpPotion(int, int, int, boolean, int, int, int);當達區間上限或經驗用罄時,扣除一個道具並 清除進度。等級超出區間或經驗異常時提示並中止。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseCatchItem

      public static final void UseCatchItem(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用「捕捉道具」(怪物卡/捕獸網等)對指定怪物的封包。

      包含阿里安競賽(道具 2270002 對怪物 9300157,血量低於四成時 50% 機率捕獲並加分) 與一般卡片捕捉(道具前綴 227、卡片對應怪物且血量過半/符合 HP 門檻)。捕獲成功時廣播 MobPacket.catchMonster(int, int, byte)killMonster 擊殺、扣除道具,並視 getCreateId 給予產物; 失敗時回送捕捉失敗封包。最後一律回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID、目標怪物物件 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseMountFood

      public static final void UseMountFood(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用「坐騎飼料」(道具前綴 226)餵食坐騎、降低疲勞並累積經驗的封包。

      將坐騎疲勞調降 30;若原疲勞為正則增加經驗,達門檻時提升坐騎等級(上限 30)。隨後向地圖廣播 CWvsContext.updateMount(MapleCharacter, boolean) 並扣除一個飼料。最後一律回送 CWvsContext.enableActions()。 無坐騎或背包鎖定時不處理。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseScriptedNPCItem

      public static final void UseScriptedNPCItem(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用各種「腳本化/特殊用途道具」的封包(一個大型道具 ID switch 分派)。

      涵蓋多種特殊道具的客製效果,例如空白羅盤(2430007,集滿四向羅盤字母換取獎勵)、 各式造型/坐騎/寵物/傳送與活動道具等;視道具不同會扣除材料、加入道具、變更角色狀態或開啟對應流程, 並送出相應更新封包。校驗道具存在、背包未鎖定且非 PVP 後才處理。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID 及該道具所需的額外欄位)
      c - 玩家連線
      chr - 使用道具的角色
    • useInnerCirculator

      public static final void useInnerCirculator(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「內在能力重置(循環器)」道具,重新隨機產生角色的內在能力技能的封包。

      對未鎖定的內在能力槽,透過 InnerAbillity.renewSkill(int, int, boolean) 重抽(道具 2701000 的第一槽 有額外處理);已鎖定者保留。重抽後清空並重建內在技能清單、逐槽回送 CField.updateInnerPotential(byte, int, int, int), 扣除一個道具並 recalcLocalStats 重算屬性。最後一律回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(道具 ID、欄位)
      c - 發出此動作的玩家連線
    • UseSummonBag

      public static final void UseSummonBag(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家使用「召喚包」在當前地圖召喚怪物的封包。

      MapleItemInformationProvider.getEquipStats(int) 讀取召喚包的怪物清單,逐項依機率 (Randomizer)以 spawnMonster_sSack 在角色位置生成怪物;至少召喚出一隻時扣除一個道具。 角色死亡、背包鎖定、PVP 中或位於自由市場(910000000~910000022)時不處理。最後一律回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID)
      c - 玩家連線
      chr - 使用道具的角色
    • UseTreasureChest

      public static final void UseTreasureChest(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家開啟「寶箱」(金箱 4280000 / 銀箱 4280001)的封包。

      依箱別自 RandomRewards 抽出獎勵並決定數量(特定消耗品有固定堆疊數)。需 CASH 背包持有 對應鑰匙(金 5490000 / 銀 5490001):透過 addbyId_Gachapon 加入獎勵、扣除一個寶箱與 一把鑰匙、回送 InfoPacket.getShowItemGain(int, short);若為稀有道具則以 World.Broadcast.broadcastSmega(byte[]) 全服廣播。背包空間或鑰匙不足時提示並回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(欄位、道具 ID)
      c - 玩家連線
      chr - 開啟寶箱的角色
    • UseCashItem

      public static final void UseCashItem(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用 CASH 背包內現金道具的封包(一個涵蓋大量現金道具的大型分派)。

      校驗 CASH 背包內道具存在後,依道具 ID 執行各自效果——例如改名/改性別/喇叭廣播、寵物相關道具、 AP/SP 重置、商店與倉庫擴充、各式特效與祝福道具等;視道具不同會扣除材料、變更角色或帳號狀態 (部分含 DB 寫入)、開啟對應視窗或全服廣播,並送出相應更新封包。角色或地圖為 null、PVP 中、 或背包鎖定時回送 CWvsContext.enableActions() 並中止。

      Parameters:
      slea - 入站封包讀取器(tick、欄位、道具 ID 及各道具所需的額外欄位)
      c - 發出此動作的玩家連線
    • Pickup_Player

      public static final void Pickup_Player(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理玩家親自拾取地面道具(或楓幣)的封包。

      於道具物件鎖(MapleMapItem.getLock())保護下檢查是否已被撿走、任務道具的任務狀態、擁有者/ 隊伍掉落歸屬,並以兩道距離檢查防外掛(CheatingOffense.ITEMVAC_CLIENTCheatingOffense.ITEMVAC_SERVER)。楓幣依隊伍規則分配給隊友與自身(含 incMesoProp 加成); 一般道具則優先當作消耗品即時觸發(useItem(MapleClient, int)),否則檢查空間後 addFromDrop 加入背包;成功皆 移除地圖物件。背包鎖定、伺服器關閉中、背包已滿或 PVP 冰凍持有者等情況分別忽略或回送相應封包。

      並依 ServerConstants.log_pickup 記錄稀有/卷軸道具的撿取到檔案。

      Parameters:
      slea - 入站封包讀取器(tick、回報座標、地圖物件 ID)
      c - 玩家連線
      chr - 撿取道具的角色
    • Pickup_Pet

      public static final void Pickup_Pet(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr)
      處理由寵物代為拾取地面道具(或楓幣)的封包。

      邏輯與 Pickup_Player(LittleEndianAccessor, MapleClient, MapleCharacter) 類似——檢查是否已被撿走、擁有者/隊伍歸屬,並以 CheatingOffense.PET_ITEMVAC_CLIENTCheatingOffense.PET_ITEMVAC_SERVER 進行寵物座標距離 防外掛檢查(傳送/使用傳送點期間略過伺服端檢查)。楓幣依隊伍規則分配;一般道具優先當消耗品觸發,否則檢查空間後 addFromDrop 加入背包,移除時透過 removeItem_Pet(MapleCharacter, MapleMapItem, int) 帶入寵物索引以播放對應撿取動畫。 背包鎖定或 PVP 中時忽略,並依 ServerConstants.log_pickup 記錄稀有/卷軸道具。

      Parameters:
      slea - 入站封包讀取器(寵物索引、回報座標、地圖物件 ID)
      c - 玩家連線
      chr - 寵物的主人角色
    • useItem

      public static final boolean useItem(MapleClient c, int id)
      判斷地面道具是否屬於「撿起即生效」的消耗品,若是則套用其效果。

      僅對 GameConstants.isUse(id) 的道具處理:取得 MapleStatEffect,並為搶旗(CTF,前綴 291)做特例判斷(在自隊旗區或非 PVP 時不套用)。當效果的 getConsume() > 0 時,呼叫 consumeItem(MapleClient, MapleStatEffect) 套用主效果與額外效果、回送 InfoPacket.getShowItemGain(int, short) 並回傳 true(呼叫端據此把地面道具移除)。

      Parameters:
      c - 玩家連線
      id - 地面道具的道具 ID
      Returns:
      該道具為即時生效消耗品且已套用時 true,否則 false
    • consumeItem

      public static final void consumeItem(MapleClient c, MapleStatEffect eff)
      套用一個消耗品狀態效果到玩家(或全隊)。

      eff.getConsume() == 2 時為隊伍範圍效果:對同地圖內存活的隊友逐一 applyTo;無隊伍時 僅套用於自己。其餘情況在玩家存活時套用於自己。effnull 時直接返回。

      Parameters:
      c - 玩家連線
      eff - 要套用的狀態效果,可為 null
    • removeItem_Pet

      public static final void removeItem_Pet(MapleCharacter chr, MapleMapItem mapitem, int pet)
      將地面道具標記為已撿取並自地圖移除(寵物撿取版本,播放對應寵物的拾取動畫)。

      設定 setPickedUp(true)、向地圖廣播 CField.removeItemFromMap(int, int, int)(類型 5、帶寵物索引), 移除地圖物件;若該道具為隨機掉落(isRandDrop)則觸發 spawnRandDrop 補刷。

      Parameters:
      chr - 撿取道具的角色
      mapitem - 被撿取的地面道具物件
      pet - 執行撿取的寵物索引
    • OwlMinerva

      public static final void OwlMinerva(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「智慧女神(Minerva)貓頭鷹」(道具 2310000)搜尋雇傭商人販售指定道具的封包。

      ChannelServer.searchMerchant(int) 搜尋販售目標道具的商店,找到時回送 CWvsContext.getOwlSearched(int, List) 並扣除一個道具;找不到則提示。最後一律回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(欄位、道具 ID、欲搜尋的道具 ID)
      c - 發出此動作的玩家連線
    • Owl

      public static final void Owl(LittleEndianAccessor slea, MapleClient c)
      處理玩家開啟貓頭鷹搜尋視窗的封包。

      需持有貓頭鷹道具(52300002310000)且位於自由市場 (910000000~910000022)才回送 CWvsContext.getOwlOpen();否則提示僅能於自由市場使用 並回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(本處理未額外讀取欄位)
      c - 發出此動作的玩家連線
    • OwlWarp

      public static final void OwlWarp(LittleEndianAccessor slea, MapleClient c)
      處理玩家透過貓頭鷹搜尋結果傳送到目標雇傭商人店面的封包。

      校驗存活、無交易中、位於自由市場且背包未鎖定後,傳送至目標市場地圖,並依 OWL_ID 的鍵別在該地圖 尋找對應的 HiredMerchant。若玩家為店主則重新接管店面(setOpen(false)、清空訪客);否則在 店面開放、有空位且未被列入黑名單時加入為訪客;皆回送 PlayerShopPacket.getHiredMerch(MapleCharacter, HiredMerchant, boolean)。各種失敗情況 以 CWvsContext.getOwlMessage(int)dropMessage 提示。

      Parameters:
      slea - 入站封包讀取器(目標商店識別 ID、目標地圖 ID)
      c - 發出此動作的玩家連線
    • PamSong

      public static final void PamSong(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「帕姆之歌」(Pam's Song,現金道具 5640000)為裝備增加一格升級次數的封包。

      需先前已選定目標裝備欄位(getScrolledPosition() != 0)且持有帕姆之歌:將目標裝備 setUpgradeSlots(+1)forceReAddItem_Flag 更新、扣除一個道具,並向地圖廣播 CField.pamsSongEffect(int)。無論成敗皆重置已選欄位。

      Parameters:
      slea - 入站封包讀取器(確認位元組)
      c - 發出此動作的玩家連線
    • TeleRock

      public static final void TeleRock(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「傳送石」(道具前綴 232)的封包入口,傳送成功時扣除道具。

      先校驗道具存在且背包未鎖定,再委派 UseTeleRock(LittleEndianAccessor, MapleClient, int) 執行實際傳送;傳回 true 時扣除一個傳送石。 最後一律回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(欄位、道具 ID,後續由 UseTeleRock(LittleEndianAccessor, MapleClient, int) 續讀)
      c - 發出此動作的玩家連線
    • UseTeleRock

      public static final boolean UseTeleRock(LittleEndianAccessor slea, MapleClient c, int itemId)
      執行傳送石的實際傳送邏輯:依封包模式傳送到指定地圖或指定玩家所在地。

      模式 0(傳送到地圖):核驗目標地圖在該傳送石可用的地圖清單內(一般/VIP/高級,依 itemId); 模式非 0(傳送到玩家):依名稱找到玩家後核驗其非分流員、雙方皆不在活動實例中,且 VIP 石或同大陸。兩種模式均 受 FieldLimitType.VipRock 與封鎖地圖限制保護,通過後 changeMap 傳送並回傳 true;失敗時以 dropMessage 提示。不在此處扣除道具(由呼叫端依回傳值處理)。

      Parameters:
      slea - 入站封包讀取器(傳送模式、目標地圖 ID 或目標玩家名稱)
      c - 玩家連線
      itemId - 使用的傳送石道具 ID(決定可傳送的地圖範圍)
      Returns:
      成功傳送時 true,否則 false
    • UseMagicHourglass

      public static final boolean UseMagicHourglass(LittleEndianAccessor slea, MapleClient c, int itemId)
      使用「魔法沙漏」延長已穿戴裝備的到期時間,由 UseCashItem(LittleEndianAccessor, MapleClient) 等入口呼叫。

      延長天數由 magicHourglassDays(itemId) 決定。僅對非飾品、有到期時間、非現金且延長後不超過約 100 天 上限的裝備生效;並排除名稱含 GameConstants.RESERVED 保留字的玩家或道具。生效時更新到期時間並 forceReAddItem 重加裝備。

      注意:days 維持為 int 以保留原本 days*24*60*60*1000 的整數溢位語意。

      Parameters:
      slea - 入站封包讀取器(目標裝備欄位)
      c - 玩家連線
      itemId - 使用的魔法沙漏道具 ID(決定延長天數)
      Returns:
      成功延長到期時間時 true,否則 false
    • UseCarvedSeal

      public static void UseCarvedSeal(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「印章」(道具 ID 前綴 20495)為裝備加上第三排潛能的封包。

      MapleItemInformationProvider.getScrollSuccess(int) 判定成敗(Randomizer)。成功時要求裝備已鑑定 (getState() >= 17)且尚無第三排潛能,從潛能表中隨機抽出符合型別/位階且通過 isAllowedPotentialStat(Equip, int) 的選項寫入 setPotential3,廣播 CField.showPotentialReset(boolean, int, boolean, int)、回送 InventoryPacket.scrolledItem(Item, Item, boolean, boolean)forceReAddItem_NoUpdate 更新;依 ServerConstants.log_seal 記錄結果到檔案。失敗時廣播失敗特效。無論成敗皆扣除一個印章並回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(tick、印章欄位、目標裝備欄位)
      c - 發出此動作的玩家連線
    • isAllowedPotentialStat

      public static boolean isAllowedPotentialStat(Equip eqq, int opID)
      判斷某潛能選項是否允許由印章(UseCarvedSeal(LittleEndianAccessor, MapleClient))附加到裝備上。

      目前的規則為僅允許 opID < 40000(排除高位特殊潛能)。

      Parameters:
      eqq - 目標裝備(目前未參與判定)
      opID - 候選潛能選項 ID
      Returns:
      允許附加時 true,否則 false
    • useViciousHammer

      public static void useViciousHammer(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「黃金鐵鎚」為裝備增加可升級次數的封包。

      校驗目標裝備可錘(GameConstants.canHammer)、原本有升級格且已錘次數 < 2 時,遞增 setViciousHammersetUpgradeSlotsforceReAddItem 更新,並回送 MTSCSPacket.ViciousHammer(boolean, int);成功時扣除一個鐵鎚。不可錘時以 dropMessage 提示。 完成後回送 CWvsContext.enableActions()

      Parameters:
      slea - 入站封包讀取器(背包類型、欄位等占位欄位與目標裝備欄位)
      c - 發出此動作的玩家連線
    • UnlockItem

      public static void UnlockItem(LittleEndianAccessor slea, MapleClient c)
      處理玩家使用「封印之鎖解除鑰匙」(道具 2051000)解除道具鎖定或不可交易狀態的封包。

      依封包指定的背包類型與欄位取得道具,若帶有 ItemFlag.LOCKItemFlag.UNTRADEABLE 旗標則清除之 並扣除一把鑰匙;隨後 forceReAddItem_Flag 更新、reloadC 重整並提示已解鎖。背包類型無效或道具不存在時 回送 CWvsContext.enableActions() 並中止。

      Parameters:
      slea - 入站封包讀取器(道具數量、背包類型、欄位)
      c - 發出此動作的玩家連線
    • resetCoreAura

      public static void resetCoreAura(int slot, MapleClient c)
      使用道具重置核心光環(Core Aura)的能力值設定,由 UseCashItem(LittleEndianAccessor, MapleClient) 等入口呼叫。

      依角色等級 updateCoreAurarecalcLocalStats 重算屬性、扣除一個道具並回送 CWvsContext.updateCoreAura(MapleCharacter)。若先前處於延長(delay)狀態,會解除並提示時間已重置。 來源道具不存在或背包鎖定時回送 InventoryPacket.getInventoryFull() 並中止。

      Parameters:
      slot - 來源道具所在的 USE 背包欄位
      c - 玩家連線
    • addCoreExpire

      public static void addCoreExpire(int slot, MapleClient c)
      使用道具延長核心光環(Core Aura)的有效期限,由 UseCashItem(LittleEndianAccessor, MapleClient) 等入口呼叫。

      設定延長旗標並把到期時間延後 7 天、扣除一個道具並回送 CWvsContext.updateCoreAura(MapleCharacter)。 來源道具不存在或背包鎖定時回送 InventoryPacket.getInventoryFull() 並中止。

      Parameters:
      slot - 來源道具所在的 USE 背包欄位
      c - 玩家連線
    • CosmicDustShifter

      public static void CosmicDustShifter(int slot, MapleClient c)
      使用道具循環移轉核心光環(Core Aura)的各項能力值加成,由 UseCashItem(LittleEndianAccessor, MapleClient) 等入口呼叫。

      將核心光環的 STR/DEX/INT/LUK/攻擊/魔攻六項加成依固定順序順時針輪換後 recalcLocalStats 重算屬性、 扣除一個道具並回送 CWvsContext.updateCoreAura(MapleCharacter)。來源道具不存在或背包鎖定時回送 InventoryPacket.getInventoryFull() 並中止。

      Parameters:
      slot - 來源道具所在的 USE 背包欄位
      c - 玩家連線