Class MobPacket

java.lang.Object
tools.packet.MobPacket

public class MobPacket extends Object
怪物(Mob)生命週期與狀態相關封包的建構器。

本類別以靜態方法提供 ChannelServer 遊戲頻道所需的怪物封包,包括:

  • 生成與消滅:spawnMonsterkillMonster(支援淡出 / 特殊動畫)、suckMonster
  • 移動:moveMonsterLifeMovementFragment 序列描述移動路徑。
  • 傷害顯示:damageMonsterdamageFriendlyMob(顯示友善怪血量比例)。
  • 狀態與技能:applyMonsterStatus(套用 MonsterStatus)、 cancelMonsterStatususeSkillSpecial
  • 控制者指定、攻擊廣播、節點移動、魔力消耗等輔助封包。

所有方法使用 MaplePacketLittleEndianWriter 組裝位元組, 送出 opcode 來自 SendPacketOpcode;怪物實體為 MapleMonster

  • Constructor Details

    • MobPacket

      public MobPacket()
  • Method Details

    • damageMonster

      public static byte[] damageMonster(int oid, long damage)
      建構對怪物造成傷害的封包。

      傷害值以 32 位元有號整數寫出,超過 Integer.MAX_VALUE 時夾擠為 MAX_VALUE。 此封包僅顯示傷害數字,不夾帶怪物當前血量。

      Parameters:
      oid - 怪物的物件 ID
      damage - 造成的傷害量
      Returns:
      封包位元組陣列
    • damageFriendlyMob

      public static byte[] damageFriendlyMob(MapleMonster mob, long damage, boolean display)
      建構對友善怪(Friendly Mob)造成傷害並更新其血量顯示的封包。

      除傷害值外,另寫出 mob 的當前血量與最大血量(超過 Integer.MAX_VALUE 時依比例縮放或夾擠),供客戶端顯示友善怪的血量比例。displayfalse 用於 Shammos 換圖等不顯示傷害的情境(寫出值 2 而非 1)。讀取怪物的即時狀態。

      Parameters:
      mob - 受到傷害的怪物
      damage - 造成的傷害量
      display - 是否顯示傷害數字(false 寫出 2)
      Returns:
      封包位元組陣列
    • killMonster

      public static byte[] killMonster(int oid, int animation)
      建構怪物死亡(消滅)的封包。

      animation 決定消滅效果:0 立即消失、1 淡出、2 以上為特殊動畫; 當值為 4 時額外寫出一個 -1

      Parameters:
      oid - 怪物的物件 ID
      animation - 死亡動畫類型(0=消失、1=淡出、2+=特殊)
      Returns:
      封包位元組陣列
    • suckMonster

      public static byte[] suckMonster(int oid, int chr)
      建構怪物被吸取(吸怪)消滅的封包。

      沿用 KILL_MONSTER opcode,死亡動畫固定為 4,並夾帶吸取此怪物的角色 ID。

      Parameters:
      oid - 怪物的物件 ID
      chr - 吸取此怪物的角色 ID
      Returns:
      封包位元組陣列
    • healMonster

      public static byte[] healMonster(int oid, int heal)
      建構治療怪物(顯示回血數字)的封包。

      沿用 DAMAGE_MONSTER opcode,以負傷害值 -heal 表示回血。

      Parameters:
      oid - 怪物的物件 ID
      heal - 回復的血量
      Returns:
      封包位元組陣列
    • MobToMobDamage

      public static byte[] MobToMobDamage(int oid, int dmg, int mobid)
      建構怪物對怪物造成傷害的封包。

      用於某怪物攻擊另一怪物的情境,夾帶受擊怪物 ID、傷害值與來源怪物 ID。

      Parameters:
      oid - 受擊怪物的物件 ID
      dmg - 造成的傷害量
      mobid - 發動攻擊的來源怪物 ID
      Returns:
      封包位元組陣列
    • getMobSkillEffect

      public static byte[] getMobSkillEffect(int oid, int skillid, int cid, int skilllevel)
      建構怪物施放技能效果的封包。

      夾帶怪物物件 ID、技能 ID、施法角色 ID 與技能等級,供客戶端播放對應的怪物技能特效。

      Parameters:
      oid - 怪物的物件 ID
      skillid - 技能 ID
      cid - 觸發效果的角色 ID
      skilllevel - 技能等級
      Returns:
      封包位元組陣列
    • getMobCoolEffect

      public static byte[] getMobCoolEffect(int oid, int itemid)
      建構怪物道具效果(冷卻 / 特殊道具特效)的封包。

      夾帶怪物物件 ID 與道具 ID,供客戶端在該怪物身上播放對應道具特效。

      Parameters:
      oid - 怪物的物件 ID
      itemid - 道具 ID
      Returns:
      封包位元組陣列
    • showMonsterHP

      public static byte[] showMonsterHP(int oid, int remhppercentage)
      建構顯示怪物血量百分比(血條)的封包。

      夾帶怪物物件 ID 與剩餘血量百分比(0–100),供客戶端在怪物上方顯示血條。

      Parameters:
      oid - 怪物的物件 ID
      remhppercentage - 剩餘血量百分比
      Returns:
      封包位元組陣列
    • showCygnusAttack

      public static byte[] showCygnusAttack(int oid)
      建構天使(Cygnus)攻擊動畫的封包。

      夾帶怪物物件 ID(須為怪物 8850011)以觸發對應的攻擊演出。

      Parameters:
      oid - 怪物的物件 ID(須為 8850011)
      Returns:
      封包位元組陣列
    • showMonsterResist

      public static byte[] showMonsterResist(int oid)
      建構顯示怪物抵抗(免疫 / 抗性觸發)的封包。

      夾帶怪物物件 ID 並寫出抵抗標記,供客戶端顯示該怪物抵抗了攻擊或狀態。

      Parameters:
      oid - 怪物的物件 ID
      Returns:
      封包位元組陣列
    • showBossHP

      public static byte[] showBossHP(MapleMonster mob)
      建構畫面下方 BOSS 血條(環境 UI)的封包。

      沿用 BOSS_ENV opcode,依 mob 的即時血量 / 最大血量(超過 Integer.MAX_VALUE 時依比例縮放或夾擠)與其屬性的血條前景 / 背景顏色顯示。 含一處 hack:怪物 9400589(MV)無法顯示 BOSS 血條,故改以 9300184 的圖示呈現。讀取怪物的即時狀態。

      Parameters:
      mob - 要顯示血條的 BOSS 怪物
      Returns:
      封包位元組陣列
    • showBossHP

      public static byte[] showBossHP(int monsterId, long currentHp, long maxHp)
      建構畫面下方 BOSS 血條(環境 UI)的封包,直接指定數值。

      沿用 BOSS_ENV opcode,以傳入的怪物 ID 與當前 / 最大血量(超過 Integer.MAX_VALUE 時依比例縮放或夾擠;當前血量小於等於 0 時寫出 -1)顯示血條, 顏色固定為 6(前景)與 5(背景)。顏色對照:

      • 1=紅、2=深藍、3=淺綠、4=深綠、5=黑、6=淺藍、7=紫。
      Parameters:
      monsterId - 顯示用的怪物 ID
      currentHp - 當前血量
      maxHp - 最大血量
      Returns:
      封包位元組陣列
    • moveMonster

      public static byte[] moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves)
      建構怪物移動的封包(無附加技能清單的簡化重載)。

      委派至 moveMonster(boolean, int, int, int, Point, List, List, List), 兩個附加清單參數傳入 null

      Parameters:
      useskill - 移動期間是否使用技能
      skill - 技能代號
      unk - 未知欄位
      oid - 怪物的物件 ID
      startPos - 移動起始座標
      moves - 以 LifeMovementFragment 描述的移動路徑序列
      Returns:
      封包位元組陣列
    • moveMonster

      public static byte[] moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves, List<Integer> unk2, List<Pair<Integer,Integer>> unk3)
      建構怪物移動的封包(完整重載)。

      夾帶怪物物件 ID、是否使用技能、技能代號與兩組附加清單(unk3 每筆兩個 short、 unk2 每筆一個 short),再寫出起始座標並透過 PacketHelper.serializeMovementList(MaplePacketLittleEndianWriter, List) 序列化 moves 移動路徑。

      Parameters:
      useskill - 移動期間是否使用技能
      skill - 技能代號
      unk - 未知欄位
      oid - 怪物的物件 ID
      startPos - 移動起始座標
      moves - 以 LifeMovementFragment 描述的移動路徑序列
      unk2 - 附加清單(每筆寫出一個 short),可為 null
      unk3 - 附加清單(每筆寫出兩個 short),可為 null
      Returns:
      封包位元組陣列
    • spawnMonster

      public static byte[] spawnMonster(MapleMonster life, int spawnType, int link)
      建構怪物生成(出現於地圖)的封包。

      寫出怪物物件 ID、怪物 ID、透過 addMonsterStatus(MaplePacketLittleEndianWriter, MapleMonster) 附加的狀態遮罩、座標、姿態與 Foothold 等。spawnType-3 或大於等於 0 時額外寫出 link;特定怪物 (9300498 / 9300507)追加固定座標欄位;位於 961xxxxx 系列地圖時附加空字串。讀取怪物的即時狀態。

      Parameters:
      life - 要生成的怪物
      spawnType - 生成類型(影響是否寫出 link 與動畫)
      link - 連結 ID(依 spawnType 條件寫出)
      Returns:
      封包位元組陣列
    • addMonsterStatus

      public static void addMonsterStatus(MaplePacketLittleEndianWriter mplew, MapleMonster life)
      將怪物的狀態效果(MonsterStatus 遮罩與各狀態資料)寫入指定的封包寫入器。

      spawnMonster(MapleMonster, int, int)controlMonster(MapleMonster, boolean, boolean) 共用:先寫出變更後屬性 (changedStats,若有則寫 HP/MP/EXP/攻防等),再透過長遮罩列出各 MonsterStatusEffect,並依狀態種類寫出對應的數值、技能 / 怪物技能 ID 與等級。 武器 / 魔法反射狀態存在時會略過免疫類狀態。

      副作用:當怪物狀態少於等於一筆時呼叫 life.addEmpty() 補一筆空狀態; 並讀取怪物的即時狀態。本方法直接寫入傳入的 mplew,不回傳位元組陣列。

      Parameters:
      mplew - 目標封包寫入器
      life - 來源怪物
    • controlMonster

      public static byte[] controlMonster(MapleMonster life, boolean newSpawn, boolean aggro)
      建構指派客戶端為怪物控制者的封包。

      沿用 SPAWN_MONSTER_CONTROL opcode:先寫出控制模式(aggrotrue 寫 2、否則 1),再寫出怪物物件 ID、怪物 ID、addMonsterStatus(MaplePacketLittleEndianWriter, MapleMonster) 狀態、座標與姿態等; 生成標記依假怪 / 新生成 / 既有分別寫 -4 / -2 / -1。讀取怪物的即時狀態。

      Parameters:
      life - 要交由客戶端控制的怪物
      newSpawn - 是否為新生成(影響生成標記)
      aggro - 是否為主動仇恨控制
      Returns:
      封包位元組陣列
    • stopControllingMonster

      public static byte[] stopControllingMonster(int oid)
      建構解除客戶端對怪物控制權的封包。

      沿用 SPAWN_MONSTER_CONTROL opcode,控制模式寫 0 並夾帶怪物物件 ID。

      Parameters:
      oid - 怪物的物件 ID
      Returns:
      封包位元組陣列
    • makeMonsterReal

      public static byte[] makeMonsterReal(MapleMonster life)
      建構將假怪轉為真實怪物的封包。

      委派至 spawnMonster(MapleMonster, int, int),生成類型固定為 -1

      Parameters:
      life - 目標怪物
      Returns:
      封包位元組陣列
    • makeMonsterFake

      public static byte[] makeMonsterFake(MapleMonster life)
      建構生成假怪(不可攻擊的幻影)的封包。

      委派至 spawnMonster(MapleMonster, int, int),生成類型固定為 -4

      Parameters:
      life - 目標怪物
      Returns:
      封包位元組陣列
    • makeMonsterEffect

      public static byte[] makeMonsterEffect(MapleMonster life, int effect)
      建構以指定生成特效顯示怪物的封包。

      委派至 spawnMonster(MapleMonster, int, int),生成類型即傳入的 effect

      Parameters:
      life - 目標怪物
      effect - 生成特效類型(作為 spawnType
      Returns:
      封包位元組陣列
    • moveMonsterResponse

      public static byte[] moveMonsterResponse(int objectid, short moveid, int currentMp, boolean useSkills, int skillId, int skillLevel)
      建構伺服器對怪物移動請求的回應封包。

      夾帶怪物物件 ID、移動序號、是否允許使用技能、當前 MP,以及核准的技能 ID 與等級, 供客戶端確認該怪物的移動與技能施放。

      Parameters:
      objectid - 怪物的物件 ID
      moveid - 移動請求序號
      currentMp - 怪物當前 MP
      useSkills - 是否允許使用技能
      skillId - 核准的技能 ID
      skillLevel - 核准的技能等級
      Returns:
      封包位元組陣列
    • applyMonsterStatus

      public static byte[] applyMonsterStatus(int oid, MonsterStatus mse, int x, MobSkill skil)
      建構對怪物套用單一狀態效果的封包(以 MonsterStatus 與怪物技能指定)。

      寫出怪物物件 ID、單一狀態遮罩(透過 PacketHelper.writeSingleMask(MaplePacketLittleEndianWriter, E))、數值 x、 來源怪物技能(MobSkill)的 ID 與等級等。

      Parameters:
      oid - 怪物的物件 ID
      mse - 要套用的怪物狀態
      x - 狀態數值
      skil - 來源怪物技能
      Returns:
      封包位元組陣列
    • applyMonsterStatus

      public static byte[] applyMonsterStatus(MapleMonster mons, MonsterStatusEffect ms)
      建構對怪物套用單一狀態效果的封包(以 MonsterStatusEffect 指定)。

      寫出怪物物件 ID、單一狀態遮罩、效果數值,並依該效果為怪物技能或一般技能寫出對應的 技能 / 怪物技能 ID 與等級。

      Parameters:
      mons - 目標怪物
      ms - 要套用的怪物狀態效果
      Returns:
      封包位元組陣列
    • applyMonsterStatus

      public static byte[] applyMonsterStatus(MapleMonster mons, List<MonsterStatusEffect> mse)
      建構對怪物套用一組狀態效果的封包(以 MonsterStatusEffect 清單指定)。

      以清單首筆狀態決定分支:若為 MonsterStatus.POISON(含燃燒),逐筆寫出來源角色 ID、 技能資訊、傷害、延遲與依 cancelTask 與目前時間推算的剩餘秒數;否則退化為寫出首筆的 單一狀態遮罩與數值。

      若清單為空或首筆為 null,改回傳 CWvsContext.enableActions()。讀取目前系統時間 (System.currentTimeMillis())以計算狀態剩餘時間。

      Parameters:
      mons - 目標怪物
      mse - 要套用的怪物狀態效果清單
      Returns:
      封包位元組陣列;清單為空時為 CWvsContext.enableActions()
    • applyMonsterStatus

      public static byte[] applyMonsterStatus(int oid, Map<MonsterStatus, Integer> stati, List<Integer> reflection, MobSkill skil)
      建構對怪物套用多重狀態效果(含反射)的封包。

      寫出怪物物件 ID 與整組狀態遮罩(透過 PacketHelper.writeMask(MaplePacketLittleEndianWriter, Collection)),逐筆寫出每個狀態的 數值與來源怪物技能(MobSkill)的 ID 與等級,再寫出各反射值。最後寫出狀態筆數作為 size, 當存在反射值時 size 折半(每個反射對應兩筆但實為一個 buff)。

      Parameters:
      oid - 怪物的物件 ID
      stati - 狀態與其數值的對應表
      reflection - 反射值清單
      skil - 來源怪物技能
      Returns:
      封包位元組陣列
    • cancelMonsterStatus

      public static byte[] cancelMonsterStatus(int oid, MonsterStatus stat)
      建構取消怪物單一狀態效果的封包。

      沿用 CANCEL_MONSTER_STATUS opcode,夾帶怪物物件 ID 與要取消的單一狀態遮罩 (透過 PacketHelper.writeSingleMask(MaplePacketLittleEndianWriter, E))。

      Parameters:
      oid - 怪物的物件 ID
      stat - 要取消的怪物狀態
      Returns:
      封包位元組陣列
    • cancelPoison

      public static byte[] cancelPoison(int oid, MonsterStatusEffect m)
      建構取消怪物中毒(含燃燒)狀態的封包。

      沿用 CANCEL_MONSTER_STATUS opcode,以空狀態遮罩(MonsterStatus.EMPTY)配合 來源角色 ID 與技能 / 怪物技能資訊,移除指定的中毒效果。

      Parameters:
      oid - 怪物的物件 ID
      m - 要取消的中毒狀態效果
      Returns:
      封包位元組陣列
    • talkMonster

      public static byte[] talkMonster(int oid, int itemId, String msg)
      建構怪物對話(怪物頭上顯示訊息泡泡)的封包。

      夾帶怪物物件 ID、關聯道具 ID 與旗標;當 msg 非空時以 writeMapleAsciiString 寫出對話文字。

      Parameters:
      oid - 怪物的物件 ID
      itemId - 關聯道具 ID(小於等於 0 時旗標寫 0)
      msg - 對話訊息;null 或空字串表示不顯示文字
      Returns:
      封包位元組陣列
    • removeTalkMonster

      public static byte[] removeTalkMonster(int oid)
      建構移除怪物對話泡泡的封包。

      夾帶怪物物件 ID,使先前以 talkMonster(int, int, String) 顯示的訊息泡泡消失。

      Parameters:
      oid - 怪物的物件 ID
      Returns:
      封包位元組陣列
    • getNodeProperties

      public static final byte[] getNodeProperties(MapleMonster objectid, MapleMap map)
      建構怪物節點移動屬性(依地圖節點路徑移動)的封包。

      寫出怪物物件 ID、地圖節點數、怪物座標,以及每個 MapleNodes.MapleNodeInfo 節點的座標與屬性(屬性為 2 的訊息節點額外寫出一個欄位)。讀取怪物與地圖 (MapleMap.getNodes())的狀態。

      快取:若怪物已有快取的節點封包(getNodePacket()null)則直接回傳; 否則建構後透過 setNodePacket(...) 寫回怪物以供重用。

      Parameters:
      objectid - 來源怪物
      map - 怪物所在地圖(提供節點清單)
      Returns:
      封包位元組陣列
    • showMagnet

      public static byte[] showMagnet(int mobid, boolean success)
      建構顯示怪物被磁吸(捕捉前置動畫)的封包。

      夾帶怪物 ID 與成功旗標(successtrue 寫 1),供捕捉類技能 / 道具的磁吸演出。

      Parameters:
      mobid - 怪物 ID
      success - 磁吸是否成功
      Returns:
      封包位元組陣列
    • catchMonster

      public static byte[] catchMonster(int mobid, int itemid, byte success)
      建構捕捉怪物結果的封包。

      夾帶怪物 ID、所用道具 ID 與捕捉結果旗標,供捕捉類道具(如怪物收服)顯示成功與否。

      Parameters:
      mobid - 怪物 ID
      itemid - 捕捉所用道具 ID
      success - 捕捉結果旗標
      Returns:
      封包位元組陣列