Class MobPacket
本類別以靜態方法提供 ChannelServer 遊戲頻道所需的怪物封包,包括:
- 生成與消滅:
spawnMonster、killMonster(支援淡出 / 特殊動畫)、suckMonster。 - 移動:
moveMonster以LifeMovementFragment序列描述移動路徑。 - 傷害顯示:
damageMonster、damageFriendlyMob(顯示友善怪血量比例)。 - 狀態與技能:
applyMonsterStatus(套用MonsterStatus)、cancelMonsterStatus、useSkillSpecial。 - 控制者指定、攻擊廣播、節點移動、魔力消耗等輔助封包。
所有方法使用 MaplePacketLittleEndianWriter 組裝位元組,
送出 opcode 來自 SendPacketOpcode;怪物實體為 MapleMonster。
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidaddMonsterStatus(MaplePacketLittleEndianWriter mplew, MapleMonster life) 將怪物的狀態效果(MonsterStatus遮罩與各狀態資料)寫入指定的封包寫入器。static byte[]applyMonsterStatus(int oid, MonsterStatus mse, int x, MobSkill skil) 建構對怪物套用單一狀態效果的封包(以MonsterStatus與怪物技能指定)。static byte[]applyMonsterStatus(int oid, Map<MonsterStatus, Integer> stati, List<Integer> reflection, MobSkill skil) 建構對怪物套用多重狀態效果(含反射)的封包。static byte[]建構對怪物套用單一狀態效果的封包(以MonsterStatusEffect指定)。static byte[]applyMonsterStatus(MapleMonster mons, List<MonsterStatusEffect> mse) 建構對怪物套用一組狀態效果的封包(以MonsterStatusEffect清單指定)。static byte[]cancelMonsterStatus(int oid, MonsterStatus stat) 建構取消怪物單一狀態效果的封包。static byte[]cancelPoison(int oid, MonsterStatusEffect m) 建構取消怪物中毒(含燃燒)狀態的封包。static byte[]catchMonster(int mobid, int itemid, byte success) 建構捕捉怪物結果的封包。static byte[]controlMonster(MapleMonster life, boolean newSpawn, boolean aggro) 建構指派客戶端為怪物控制者的封包。static byte[]damageFriendlyMob(MapleMonster mob, long damage, boolean display) 建構對友善怪(Friendly Mob)造成傷害並更新其血量顯示的封包。static byte[]damageMonster(int oid, long damage) 建構對怪物造成傷害的封包。static byte[]getMobCoolEffect(int oid, int itemid) 建構怪物道具效果(冷卻 / 特殊道具特效)的封包。static byte[]getMobSkillEffect(int oid, int skillid, int cid, int skilllevel) 建構怪物施放技能效果的封包。static final byte[]getNodeProperties(MapleMonster objectid, MapleMap map) 建構怪物節點移動屬性(依地圖節點路徑移動)的封包。static byte[]healMonster(int oid, int heal) 建構治療怪物(顯示回血數字)的封包。static byte[]killMonster(int oid, int animation) 建構怪物死亡(消滅)的封包。static byte[]makeMonsterEffect(MapleMonster life, int effect) 建構以指定生成特效顯示怪物的封包。static byte[]makeMonsterFake(MapleMonster life) 建構生成假怪(不可攻擊的幻影)的封包。static byte[]makeMonsterReal(MapleMonster life) 建構將假怪轉為真實怪物的封包。static byte[]MobToMobDamage(int oid, int dmg, int mobid) 建構怪物對怪物造成傷害的封包。static byte[]moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves) 建構怪物移動的封包(無附加技能清單的簡化重載)。static byte[]moveMonster(boolean useskill, int skill, int unk, int oid, Point startPos, List<LifeMovementFragment> moves, List<Integer> unk2, List<Pair<Integer, Integer>> unk3) 建構怪物移動的封包(完整重載)。static byte[]moveMonsterResponse(int objectid, short moveid, int currentMp, boolean useSkills, int skillId, int skillLevel) 建構伺服器對怪物移動請求的回應封包。static byte[]removeTalkMonster(int oid) 建構移除怪物對話泡泡的封包。static byte[]showBossHP(int monsterId, long currentHp, long maxHp) 建構畫面下方 BOSS 血條(環境 UI)的封包,直接指定數值。static byte[]showBossHP(MapleMonster mob) 建構畫面下方 BOSS 血條(環境 UI)的封包。static byte[]showCygnusAttack(int oid) 建構天使(Cygnus)攻擊動畫的封包。static byte[]showMagnet(int mobid, boolean success) 建構顯示怪物被磁吸(捕捉前置動畫)的封包。static byte[]showMonsterHP(int oid, int remhppercentage) 建構顯示怪物血量百分比(血條)的封包。static byte[]showMonsterResist(int oid) 建構顯示怪物抵抗(免疫 / 抗性觸發)的封包。static byte[]spawnMonster(MapleMonster life, int spawnType, int link) 建構怪物生成(出現於地圖)的封包。static byte[]stopControllingMonster(int oid) 建構解除客戶端對怪物控制權的封包。static byte[]suckMonster(int oid, int chr) 建構怪物被吸取(吸怪)消滅的封包。static byte[]talkMonster(int oid, int itemId, String msg) 建構怪物對話(怪物頭上顯示訊息泡泡)的封包。
-
Constructor Details
-
MobPacket
public MobPacket()
-
-
Method Details
-
damageMonster
public static byte[] damageMonster(int oid, long damage) 建構對怪物造成傷害的封包。傷害值以 32 位元有號整數寫出,超過
Integer.MAX_VALUE時夾擠為MAX_VALUE。 此封包僅顯示傷害數字,不夾帶怪物當前血量。- Parameters:
oid- 怪物的物件 IDdamage- 造成的傷害量- Returns:
- 封包位元組陣列
-
damageFriendlyMob
建構對友善怪(Friendly Mob)造成傷害並更新其血量顯示的封包。除傷害值外,另寫出
mob的當前血量與最大血量(超過Integer.MAX_VALUE時依比例縮放或夾擠),供客戶端顯示友善怪的血量比例。display為false用於 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- 怪物的物件 IDanimation- 死亡動畫類型(0=消失、1=淡出、2+=特殊)- Returns:
- 封包位元組陣列
-
suckMonster
public static byte[] suckMonster(int oid, int chr) 建構怪物被吸取(吸怪)消滅的封包。沿用
KILL_MONSTERopcode,死亡動畫固定為4,並夾帶吸取此怪物的角色 ID。- Parameters:
oid- 怪物的物件 IDchr- 吸取此怪物的角色 ID- Returns:
- 封包位元組陣列
-
healMonster
public static byte[] healMonster(int oid, int heal) 建構治療怪物(顯示回血數字)的封包。沿用
DAMAGE_MONSTERopcode,以負傷害值-heal表示回血。- Parameters:
oid- 怪物的物件 IDheal- 回復的血量- Returns:
- 封包位元組陣列
-
MobToMobDamage
public static byte[] MobToMobDamage(int oid, int dmg, int mobid) 建構怪物對怪物造成傷害的封包。用於某怪物攻擊另一怪物的情境,夾帶受擊怪物 ID、傷害值與來源怪物 ID。
- Parameters:
oid- 受擊怪物的物件 IDdmg- 造成的傷害量mobid- 發動攻擊的來源怪物 ID- Returns:
- 封包位元組陣列
-
getMobSkillEffect
public static byte[] getMobSkillEffect(int oid, int skillid, int cid, int skilllevel) 建構怪物施放技能效果的封包。夾帶怪物物件 ID、技能 ID、施法角色 ID 與技能等級,供客戶端播放對應的怪物技能特效。
- Parameters:
oid- 怪物的物件 IDskillid- 技能 IDcid- 觸發效果的角色 IDskilllevel- 技能等級- Returns:
- 封包位元組陣列
-
getMobCoolEffect
public static byte[] getMobCoolEffect(int oid, int itemid) 建構怪物道具效果(冷卻 / 特殊道具特效)的封包。夾帶怪物物件 ID 與道具 ID,供客戶端在該怪物身上播放對應道具特效。
- Parameters:
oid- 怪物的物件 IDitemid- 道具 ID- Returns:
- 封包位元組陣列
-
showMonsterHP
public static byte[] showMonsterHP(int oid, int remhppercentage) 建構顯示怪物血量百分比(血條)的封包。夾帶怪物物件 ID 與剩餘血量百分比(0–100),供客戶端在怪物上方顯示血條。
- Parameters:
oid- 怪物的物件 IDremhppercentage- 剩餘血量百分比- 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
建構畫面下方 BOSS 血條(環境 UI)的封包。沿用
BOSS_ENVopcode,依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_ENVopcode,以傳入的怪物 ID 與當前 / 最大血量(超過Integer.MAX_VALUE時依比例縮放或夾擠;當前血量小於等於 0 時寫出-1)顯示血條, 顏色固定為6(前景)與5(背景)。顏色對照:- 1=紅、2=深藍、3=淺綠、4=深綠、5=黑、6=淺藍、7=紫。
- Parameters:
monsterId- 顯示用的怪物 IDcurrentHp- 當前血量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- 怪物的物件 IDstartPos- 移動起始座標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- 怪物的物件 IDstartPos- 移動起始座標moves- 以LifeMovementFragment描述的移動路徑序列unk2- 附加清單(每筆寫出一個 short),可為nullunk3- 附加清單(每筆寫出兩個 short),可為null- Returns:
- 封包位元組陣列
-
spawnMonster
建構怪物生成(出現於地圖)的封包。寫出怪物物件 ID、怪物 ID、透過
addMonsterStatus(MaplePacketLittleEndianWriter, MapleMonster)附加的狀態遮罩、座標、姿態與 Foothold 等。spawnType為-3或大於等於 0 時額外寫出link;特定怪物 (9300498 / 9300507)追加固定座標欄位;位於 961xxxxx 系列地圖時附加空字串。讀取怪物的即時狀態。- Parameters:
life- 要生成的怪物spawnType- 生成類型(影響是否寫出link與動畫)link- 連結 ID(依spawnType條件寫出)- Returns:
- 封包位元組陣列
-
addMonsterStatus
將怪物的狀態效果(MonsterStatus遮罩與各狀態資料)寫入指定的封包寫入器。由
spawnMonster(MapleMonster, int, int)與controlMonster(MapleMonster, boolean, boolean)共用:先寫出變更後屬性 (changedStats,若有則寫 HP/MP/EXP/攻防等),再透過長遮罩列出各MonsterStatusEffect,並依狀態種類寫出對應的數值、技能 / 怪物技能 ID 與等級。 武器 / 魔法反射狀態存在時會略過免疫類狀態。副作用:當怪物狀態少於等於一筆時呼叫
life.addEmpty()補一筆空狀態; 並讀取怪物的即時狀態。本方法直接寫入傳入的mplew,不回傳位元組陣列。- Parameters:
mplew- 目標封包寫入器life- 來源怪物
-
controlMonster
建構指派客戶端為怪物控制者的封包。沿用
SPAWN_MONSTER_CONTROLopcode:先寫出控制模式(aggro為true寫 2、否則 1),再寫出怪物物件 ID、怪物 ID、addMonsterStatus(MaplePacketLittleEndianWriter, MapleMonster)狀態、座標與姿態等; 生成標記依假怪 / 新生成 / 既有分別寫-4 / -2 / -1。讀取怪物的即時狀態。- Parameters:
life- 要交由客戶端控制的怪物newSpawn- 是否為新生成(影響生成標記)aggro- 是否為主動仇恨控制- Returns:
- 封包位元組陣列
-
stopControllingMonster
public static byte[] stopControllingMonster(int oid) 建構解除客戶端對怪物控制權的封包。沿用
SPAWN_MONSTER_CONTROLopcode,控制模式寫0並夾帶怪物物件 ID。- Parameters:
oid- 怪物的物件 ID- Returns:
- 封包位元組陣列
-
makeMonsterReal
建構將假怪轉為真實怪物的封包。委派至
spawnMonster(MapleMonster, int, int),生成類型固定為-1。- Parameters:
life- 目標怪物- Returns:
- 封包位元組陣列
-
makeMonsterFake
建構生成假怪(不可攻擊的幻影)的封包。委派至
spawnMonster(MapleMonster, int, int),生成類型固定為-4。- Parameters:
life- 目標怪物- Returns:
- 封包位元組陣列
-
makeMonsterEffect
建構以指定生成特效顯示怪物的封包。委派至
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- 怪物的物件 IDmoveid- 移動請求序號currentMp- 怪物當前 MPuseSkills- 是否允許使用技能skillId- 核准的技能 IDskillLevel- 核准的技能等級- Returns:
- 封包位元組陣列
-
applyMonsterStatus
建構對怪物套用單一狀態效果的封包(以MonsterStatus與怪物技能指定)。寫出怪物物件 ID、單一狀態遮罩(透過
PacketHelper.writeSingleMask(MaplePacketLittleEndianWriter, E))、數值x、 來源怪物技能(MobSkill)的 ID 與等級等。- Parameters:
oid- 怪物的物件 IDmse- 要套用的怪物狀態x- 狀態數值skil- 來源怪物技能- Returns:
- 封包位元組陣列
-
applyMonsterStatus
建構對怪物套用單一狀態效果的封包(以MonsterStatusEffect指定)。寫出怪物物件 ID、單一狀態遮罩、效果數值,並依該效果為怪物技能或一般技能寫出對應的 技能 / 怪物技能 ID 與等級。
- Parameters:
mons- 目標怪物ms- 要套用的怪物狀態效果- Returns:
- 封包位元組陣列
-
applyMonsterStatus
建構對怪物套用一組狀態效果的封包(以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- 怪物的物件 IDstati- 狀態與其數值的對應表reflection- 反射值清單skil- 來源怪物技能- Returns:
- 封包位元組陣列
-
cancelMonsterStatus
建構取消怪物單一狀態效果的封包。沿用
CANCEL_MONSTER_STATUSopcode,夾帶怪物物件 ID 與要取消的單一狀態遮罩 (透過PacketHelper.writeSingleMask(MaplePacketLittleEndianWriter, E))。- Parameters:
oid- 怪物的物件 IDstat- 要取消的怪物狀態- Returns:
- 封包位元組陣列
-
cancelPoison
建構取消怪物中毒(含燃燒)狀態的封包。沿用
CANCEL_MONSTER_STATUSopcode,以空狀態遮罩(MonsterStatus.EMPTY)配合 來源角色 ID 與技能 / 怪物技能資訊,移除指定的中毒效果。- Parameters:
oid- 怪物的物件 IDm- 要取消的中毒狀態效果- Returns:
- 封包位元組陣列
-
talkMonster
建構怪物對話(怪物頭上顯示訊息泡泡)的封包。夾帶怪物物件 ID、關聯道具 ID 與旗標;當
msg非空時以writeMapleAsciiString寫出對話文字。- Parameters:
oid- 怪物的物件 IDitemId- 關聯道具 ID(小於等於 0 時旗標寫 0)msg- 對話訊息;null或空字串表示不顯示文字- Returns:
- 封包位元組陣列
-
removeTalkMonster
public static byte[] removeTalkMonster(int oid) 建構移除怪物對話泡泡的封包。夾帶怪物物件 ID,使先前以
talkMonster(int, int, String)顯示的訊息泡泡消失。- Parameters:
oid- 怪物的物件 ID- Returns:
- 封包位元組陣列
-
getNodeProperties
建構怪物節點移動屬性(依地圖節點路徑移動)的封包。寫出怪物物件 ID、地圖節點數、怪物座標,以及每個
MapleNodes.MapleNodeInfo節點的座標與屬性(屬性為 2 的訊息節點額外寫出一個欄位)。讀取怪物與地圖 (MapleMap.getNodes())的狀態。快取:若怪物已有快取的節點封包(
getNodePacket()非null)則直接回傳; 否則建構後透過setNodePacket(...)寫回怪物以供重用。- Parameters:
objectid- 來源怪物map- 怪物所在地圖(提供節點清單)- Returns:
- 封包位元組陣列
-
showMagnet
public static byte[] showMagnet(int mobid, boolean success) 建構顯示怪物被磁吸(捕捉前置動畫)的封包。夾帶怪物 ID 與成功旗標(
success為true寫 1),供捕捉類技能 / 道具的磁吸演出。- Parameters:
mobid- 怪物 IDsuccess- 磁吸是否成功- Returns:
- 封包位元組陣列
-
catchMonster
public static byte[] catchMonster(int mobid, int itemid, byte success) 建構捕捉怪物結果的封包。夾帶怪物 ID、所用道具 ID 與捕捉結果旗標,供捕捉類道具(如怪物收服)顯示成功與否。
- Parameters:
mobid- 怪物 IDitemid- 捕捉所用道具 IDsuccess- 捕捉結果旗標- Returns:
- 封包位元組陣列
-