Class MapleMonsterKillManager
MapleMap。
本類別封裝怪物死亡的整條流程:單純移除(removeMonster)、自爆/removeAfter 擊殺
(killMonster(MapleMonster))、玩家擊殺含掉落/成就/遠征隊計時/武陵排名(killMonster
重載 ×2)、全圖清怪(killAllMonsters)、指定怪物 id 清除(killMonster(int)),以及
由擊殺觸發的掉落表計算(dropFromMonster:一般掉落 + 全域掉落 + 楓幣點數)。MapleMap
以**逐字搬移**的方式把這些方法移入此處,並對每個對外公開方法保留**簽名完全相同**的委派(delegate),
因此 src/ 的呼叫端與 ~2,700 支腳本完全不受影響。
所有狀態仍存放在所屬 MapleMap(同 package 存取的 package-private 成員:玩家集合
characters 與其讀寫鎖 charactersLock、掉落開關 dropsDisabled /
gDropsDisabled、遠征隊計時 speedRunStart / speedRunLeader、以及既有的
spawnedMonstersOnMap / mapid / channel / mapobjects);本協作者
僅持有對該地圖的回參考,並透過 map. 委派回 MapleMap 的廣播 / 物件移除 / 掉落生成
(spawnMobDrop 等仍留在 MapleMap)/ 遠征隊與道場等公開方法。怪物的經驗分配仍由
MapleMonster.killBy 負責(不在本類別)。
-
Method Summary
Modifier and TypeMethodDescriptionfinal voidkillAllMonsters(boolean animate) 清除地圖上所有怪物(無玩家歸屬、無掉落、無成就)。final voidkillMonster(int monsId) 依怪物 id 擊殺地圖上第一隻符合的怪物(無玩家歸屬、無掉落、無成就)。voidkillMonster(MapleMonster monster) 以「自爆 / removeAfter」方式擊殺怪物(無玩家歸屬、無掉落、無成就)。final voidkillMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation) 由玩家擊殺怪物(便利重載,等同最後技能 id 為0)。final voidkillMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation, int lastSkill) 由玩家擊殺怪物的核心方法,處理整條死亡流程:移除、經驗分配、掉落、boss 專屬效果、成就、遠征隊計時與武陵排名。voidremoveMonster(MapleMonster monster) 將怪物自地圖移除,但不視為被擊殺(不觸發復活/自爆動畫、掉落或成就)。
-
Method Details
-
removeMonster
將怪物自地圖移除,但不視為被擊殺(不觸發復活/自爆動畫、掉落或成就)。遞減地圖怪物計數
spawnedMonstersOnMap、以動畫代碼0廣播MobPacket.killMonster(int, int)給全圖玩家、自地圖物件集合移除該怪物,最後呼叫MapleMonster.killed()。monster為null時直接返回(no-op)。- Parameters:
monster- 欲移除的怪物;null時不做任何事
-
killMonster
以「自爆 / removeAfter」方式擊殺怪物(無玩家歸屬、無掉落、無成就)。遞減地圖怪物計數、將怪物 HP 歸零;若怪物未連動其他怪物(
getLinkCID() <= 0)則先 生成其 revives(召喚出的後續怪物),接著以怪物的自爆動畫代碼(其getSelfD();若為負則用1)廣播MobPacket.killMonster(int, int)、自地圖移除並呼叫MapleMonster.killed()。monster為null時直接返回(no-op)。- Parameters:
monster- 欲擊殺的怪物;null時不做任何事
-
killMonster
public final void killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation) 由玩家擊殺怪物(便利重載,等同最後技能 id 為0)。直接委派至
killMonster(MapleMonster, MapleCharacter, boolean, boolean, byte, int), 將lastSkill帶為0;完整的擊殺/掉落/成就/遠征隊計時/武陵排名流程請見該方法。- Parameters:
monster- 被擊殺的怪物chr- 擊殺者(掉落歸屬與成就的判定對象)withDrops-true時依掉落表生成掉落物second- 是否為(闇黑龍王等多階段 boss 的)第二次延遲擊殺呼叫;false為首次animation- 死亡動畫代碼;負值表示不廣播死亡動畫
-
killMonster
public final void killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation, int lastSkill) 由玩家擊殺怪物的核心方法,處理整條死亡流程:移除、經驗分配、掉落、boss 專屬效果、成就、遠征隊計時與武陵排名。主要步驟:
- 特殊多階段 boss 處理:闇黑龍王(
8810018)/ 混沌闇黑龍王(8810122)首次擊殺時排程 3 秒後再次以second=true擊殺並清空全圖;炎魔海綿 (8820014)會先連鎖擊殺8820000;阿里安特 PQ 炸彈(9300166)改用動畫 2。 - 遞減怪物計數、自地圖移除、
MapleMonster.killed(),並呼叫MapleMonster.killBy(MapleCharacter, int)進行 經驗分配(EXP 分配邏輯本身在MapleMonster.killBy,不在本類別)以取得掉落歸屬者dropOwner;animation >= 0時廣播死亡動畫封包。 - 若怪物帶有給予 buff(
getBuffToGive() > -1),在map.charactersLock讀鎖保護下,對全圖 存活玩家套用該 buff(對闇黑龍王等指定 boss 另送九尾妖狐效果封包)。 - 大量 boss/地圖 id 比對:對各遠征隊 boss(闇黑龍王、皮卡啾、西格諾斯、凡雷恩、炎魔、阿卡伊農…)在讀鎖下
對全圖玩家發成就、廣播伺服器公告、設定
ExpeditionType並呼叫map.doShrine;炎魔/炎魔(W) 與炎魔雕像、闇黑龍王分身等會連鎖擊殺或重生本體;怪物公園清圖送monsterPark/clear(F)地圖效果。 - 武陵道場 boss(
9300215):排名模式下將通關秒數寫入dojo_ranks資料表(若更快則UPDATE,否則INSERT),失敗僅記錄錯誤。 - 遠征隊計時:若設定了
ExpeditionType且map.speedRunStart > 0且有隊長,計算通關時間、 廣播公告、寫入排名(map.getRankAndAdd)並結束計時(map.endSpeedRun)。 - 掉落:
withDrops為true時,依dropOwner決定歸屬者(找不到則退回chr) 並呼叫私有的dropFromMonster滾動掉落表。
執行緒安全:遍歷全圖玩家的成就 / buff 區塊皆在
map.charactersLock的讀鎖內進行。 副作用包含:封包廣播、地圖物件移除、掉落物生成、玩家成就 / 楓幣點數變更,以及武陵排名的資料庫寫入。- Parameters:
monster- 被擊殺的怪物chr- 擊殺者(掉落歸屬與成就的判定對象)withDrops-true時依掉落表生成掉落物second- 是否為多階段 boss 的第二次延遲擊殺呼叫;false為首次,可避免重複排程animation- 死亡動畫代碼;負值表示不廣播死亡動畫(部分怪物會於方法內被覆寫)lastSkill- 造成致命一擊的技能 id,轉交MapleMonster.killBy(MapleCharacter, int)作經驗分配判定
- 特殊多階段 boss 處理:闇黑龍王(
-
killAllMonsters
public final void killAllMonsters(boolean animate) 清除地圖上所有怪物(無玩家歸屬、無掉落、無成就)。透過
map.getAllMonstersThreadsafe()取得當前怪物快照後逐一處理:遞減怪物計數、HP 歸零、 以動畫代碼animate ? 1 : 0廣播MobPacket.killMonster(int, int)、自地圖移除並呼叫MapleMonster.killed()。常用於 boss 階段轉換或活動 / PQ 強制清場。- Parameters:
animate-true時播放死亡動畫,false則無動畫直接移除
-
killMonster
public final void killMonster(int monsId) 依怪物 id 擊殺地圖上第一隻符合的怪物(無玩家歸屬、無掉落、無成就)。掃描
map.getAllMonstersThreadsafe(),找到第一隻getId()等於monsId的怪物後: 遞減怪物計數、自地圖移除、以動畫代碼1廣播MobPacket.killMonster(int, int)、呼叫MapleMonster.killed(),隨即停止(僅處理一隻)。若無相符怪物則為 no-op。- Parameters:
monsId- 欲擊殺的怪物 id
-