Class MapleMonsterKillManager

java.lang.Object
server.maps.MapleMonsterKillManager

public final class MapleMonsterKillManager extends Object
地圖怪物的「擊殺(kill)與掉落(drop-loot)子系統」協作者,由 P5 God class 拆分自 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 Type
    Method
    Description
    final void
    killAllMonsters(boolean animate)
    清除地圖上所有怪物(無玩家歸屬、無掉落、無成就)。
    final void
    killMonster(int monsId)
    依怪物 id 擊殺地圖上第一隻符合的怪物(無玩家歸屬、無掉落、無成就)。
    void
    以「自爆 / removeAfter」方式擊殺怪物(無玩家歸屬、無掉落、無成就)。
    final void
    killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation)
    由玩家擊殺怪物(便利重載,等同最後技能 id 為 0)。
    final void
    killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation, int lastSkill)
    由玩家擊殺怪物的核心方法,處理整條死亡流程:移除、經驗分配、掉落、boss 專屬效果、成就、遠征隊計時與武陵排名。
    void
    將怪物自地圖移除,但不視為被擊殺(不觸發復活/自爆動畫、掉落或成就)。

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • removeMonster

      public void removeMonster(MapleMonster monster)
      將怪物自地圖移除,但不視為被擊殺(不觸發復活/自爆動畫、掉落或成就)。

      遞減地圖怪物計數 spawnedMonstersOnMap、以動畫代碼 0 廣播 MobPacket.killMonster(int, int) 給全圖玩家、自地圖物件集合移除該怪物,最後呼叫 MapleMonster.killed()monsternull 時直接返回(no-op)。

      Parameters:
      monster - 欲移除的怪物;null 時不做任何事
    • killMonster

      public void killMonster(MapleMonster monster)
      以「自爆 / removeAfter」方式擊殺怪物(無玩家歸屬、無掉落、無成就)。

      遞減地圖怪物計數、將怪物 HP 歸零;若怪物未連動其他怪物(getLinkCID() <= 0)則先 生成其 revives(召喚出的後續怪物),接著以怪物的自爆動畫代碼(其 getSelfD();若為負則用 1)廣播 MobPacket.killMonster(int, int)、自地圖移除並呼叫 MapleMonster.killed()monsternull 時直接返回(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),失敗僅記錄錯誤。
      • 遠征隊計時:若設定了 ExpeditionTypemap.speedRunStart > 0 且有隊長,計算通關時間、 廣播公告、寫入排名(map.getRankAndAdd)並結束計時(map.endSpeedRun)。
      • 掉落:withDropstrue 時,依 dropOwner 決定歸屬者(找不到則退回 chr) 並呼叫私有的 dropFromMonster 滾動掉落表。

      執行緒安全:遍歷全圖玩家的成就 / buff 區塊皆在 map.charactersLock 的讀鎖內進行。 副作用包含:封包廣播、地圖物件移除、掉落物生成、玩家成就 / 楓幣點數變更,以及武陵排名的資料庫寫入。

      Parameters:
      monster - 被擊殺的怪物
      chr - 擊殺者(掉落歸屬與成就的判定對象)
      withDrops - true 時依掉落表生成掉落物
      second - 是否為多階段 boss 的第二次延遲擊殺呼叫;false 為首次,可避免重複排程
      animation - 死亡動畫代碼;負值表示不廣播死亡動畫(部分怪物會於方法內被覆寫)
      lastSkill - 造成致命一擊的技能 id,轉交 MapleMonster.killBy(MapleCharacter, int) 作經驗分配判定
    • 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