Class MapleMap

java.lang.Object
server.maps.MapleMap

public final class MapleMap extends Object
單一遊戲地圖實例,承載其上所有地圖物件與在場玩家。

本類別以依 MapleMapObjectType 分群、各自加鎖的 mapobjects 容器,管理 NPC、怪物(MapleMonster)、 掉落物、傳送點(MaplePortal)、召喚物、門與反應爐等地圖物件,並維護在場玩家集合 characters; 由 MapleMapFactory 建立與快取,是怪物生成、掉落、傳送與廣播等遊戲玩法的舞台。為控制其規模, P5 重構已將數個子系統抽成同 package 的協作者,本類別保留簽名相同的一行委派:

地圖與在場玩家透過 MapleCharacterChannelServerWorld 協作, 並被 handling.channel.handler.* 處理器與 scripts/ 腳本大量取用。

  • Constructor Details

  • Method Details

    • getChannelServer

      public final ChannelServer getChannelServer()
      取得本地圖所屬的頻道伺服器。
      Returns:
      對應 channelChannelServer 實例
    • getSpawns

      public final boolean getSpawns()
      取得本地圖是否允許怪物刷新。
      Returns:
      允許刷新傳回 true
    • setSpawns

      public final void setSpawns(boolean fm)
      設定本地圖是否允許怪物刷新。
      Parameters:
      fm - true 表示允許刷新
    • setFixedMob

      public final void setFixedMob(int fm)
      設定本地圖的固定怪物數量。
      Parameters:
      fm - 固定怪物數量
    • getForceMove

      public final int getForceMove()
      取得強制移動所需的等級門檻。
      Returns:
      等級門檻
    • setForceMove

      public final void setForceMove(int fm)
      設定強制移動所需的等級門檻。
      Parameters:
      fm - 等級門檻
    • getLevelLimit

      public final int getLevelLimit()
      取得進入本地圖的等級上限/限制。
      Returns:
      等級限制
    • setLevelLimit

      public final void setLevelLimit(int fm)
      設定進入本地圖的等級上限/限制。
      Parameters:
      fm - 等級限制
    • setSoaring

      public final void setSoaring(boolean b)
      設定本地圖是否允許飛行(御劍/滑翔)。
      Parameters:
      b - true 表示允許
    • canSoar

      public final boolean canSoar()
      取得本地圖是否允許飛行(御劍/滑翔)。
      Returns:
      允許傳回 true
    • toggleDrops

      public final void toggleDrops()
      切換本地圖的掉落開關(取反)。
    • setDrops

      public final void setDrops(boolean b)
      設定本地圖是否停用掉落。
      Parameters:
      b - true 表示停用掉落
    • toggleGDrops

      public final void toggleGDrops()
      切換本地圖的全域掉落開關(取反)。
    • getId

      public final int getId()
      取得本地圖編號。
      Returns:
      地圖編號
    • getReturnMap

      public final MapleMap getReturnMap()
      取得返回地圖物件(由地圖工廠依 returnMapId 解析)。
      Returns:
      返回地圖的 MapleMap
    • getReturnMapId

      public final int getReturnMapId()
      取得返回地圖編號。
      Returns:
      返回地圖編號
    • setReturnMapId

      public final void setReturnMapId(int rmi)
      設定返回地圖編號。
      Parameters:
      rmi - 返回地圖編號
    • getForcedReturnId

      public final int getForcedReturnId()
      取得強制返回地圖編號。
      Returns:
      強制返回地圖編號
    • getForcedReturnMap

      public final MapleMap getForcedReturnMap()
      取得強制返回地圖物件(由地圖工廠依 forcedReturnMap 解析)。
      Returns:
      強制返回地圖的 MapleMap;頻道伺服器不存在時傳回 null
    • setForcedReturnMap

      public final void setForcedReturnMap(int map)
      設定強制返回地圖編號。
      Parameters:
      map - 強制返回地圖編號
    • getRecoveryRate

      public final float getRecoveryRate()
      取得本地圖的 HP/MP 恢復倍率。
      Returns:
      恢復倍率
    • setRecoveryRate

      public final void setRecoveryRate(float recoveryRate)
      設定本地圖的 HP/MP 恢復倍率。
      Parameters:
      recoveryRate - 恢復倍率
    • getFieldLimit

      public final int getFieldLimit()
      取得本地圖的場地限制旗標(fieldLimit,位元遮罩控制傳送/召喚等行為)。
      Returns:
      場地限制旗標
    • setFieldLimit

      public final void setFieldLimit(int fieldLimit)
      設定本地圖的場地限制旗標。
      Parameters:
      fieldLimit - 場地限制旗標(位元遮罩)
    • setCreateMobInterval

      public final void setCreateMobInterval(short createMobInterval)
      設定怪物產生的間隔時間。
      Parameters:
      createMobInterval - 產怪間隔(毫秒)
    • setTimeLimit

      public final void setTimeLimit(int timeLimit)
      設定本地圖的停留時間限制。
      Parameters:
      timeLimit - 時間限制(秒)
    • getMapName

      public final String getMapName()
      取得地圖名稱。
      Returns:
      地圖名稱
    • setMapName

      public final void setMapName(String mapName)
      設定地圖名稱。
      Parameters:
      mapName - 地圖名稱
    • getStreetName

      public final String getStreetName()
      取得地圖所屬的街道名稱。
      Returns:
      街道名稱
    • setStreetName

      public final void setStreetName(String streetName)
      設定地圖所屬的街道名稱。
      Parameters:
      streetName - 街道名稱
    • getFirstUserEnter

      public final String getFirstUserEnter()
      取得「首位玩家進入」時觸發的腳本名稱。
      Returns:
      首位進入腳本名稱
    • setFirstUserEnter

      public final void setFirstUserEnter(String onFirstUserEnter)
      設定「首位玩家進入」時觸發的腳本名稱。
      Parameters:
      onFirstUserEnter - 首位進入腳本名稱
    • getUserEnter

      public final String getUserEnter()
      取得「玩家進入」時觸發的腳本名稱。
      Returns:
      進入腳本名稱
    • setUserEnter

      public final void setUserEnter(String onUserEnter)
      設定「玩家進入」時觸發的腳本名稱。
      Parameters:
      onUserEnter - 進入腳本名稱
    • hasClock

      public final boolean hasClock()
      取得本地圖是否設有時鐘。
      Returns:
      有時鐘傳回 true
    • setClock

      public final void setClock(boolean hasClock)
      設定本地圖是否設有時鐘。
      Parameters:
      hasClock - true 表示有時鐘
    • isTown

      public final boolean isTown()
      取得本地圖是否為城鎮。
      Returns:
      為城鎮傳回 true
    • setTown

      public final void setTown(boolean town)
      設定本地圖是否為城鎮。
      Parameters:
      town - true 表示為城鎮
    • allowPersonalShop

      public final boolean allowPersonalShop()
      取得本地圖是否允許開設個人商店/雇傭商人。
      Returns:
      允許傳回 true
    • setPersonalShop

      public final void setPersonalShop(boolean personalShop)
      設定本地圖是否允許開設個人商店/雇傭商人。
      Parameters:
      personalShop - true 表示允許
    • getEverlast

      public final boolean getEverlast()
      取得本地圖的掉落物是否永不消失(everlast)。
      Returns:
      永不消失傳回 true
    • setEverlast

      public final void setEverlast(boolean everlast)
      設定本地圖的掉落物是否永不消失(everlast)。
      Parameters:
      everlast - true 表示永不消失
    • getHPDec

      public final int getHPDec()
      取得本地圖每次扣血的 HP 量。
      Returns:
      每次扣除的 HP
    • setHPDec

      public final void setHPDec(int delta)
      設定本地圖每次扣血的 HP 量。

      delta 為正、或地圖為 749040100(pmd)時,會重設 lastHurtTime 為現在時間以啟動扣血計時。內部存為 short

      Parameters:
      delta - 每次扣除的 HP
    • getHPDecInterval

      public final int getHPDecInterval()
      取得本地圖扣血的間隔時間。
      Returns:
      扣血間隔
    • setHPDecInterval

      public final void setHPDecInterval(int delta)
      設定本地圖扣血的間隔時間。
      Parameters:
      delta - 扣血間隔
    • getHPDecProtect

      public final int getHPDecProtect()
      取得可免除本地圖扣血的保護道具編號。
      Returns:
      保護道具編號
    • setHPDecProtect

      public final void setHPDecProtect(int delta)
      設定可免除本地圖扣血的保護道具編號。
      Parameters:
      delta - 保護道具編號
    • getCurrentPartyId

      public final int getCurrentPartyId()
      取得本地圖中第一位有隊伍的玩家所屬的隊伍編號。

      charactersLock 讀鎖下走訪 characters,回傳第一個非 null 隊伍的編號。

      Returns:
      隊伍編號;若無任何玩家在隊伍中則傳回 -1
    • addMapObject

      public final void addMapObject(MapleMapObject mapobject)
      將地圖物件加入本地圖(不通知任何玩家)。

      runningOidLock 下配發遞增的物件 ID 並寫入物件,再於該物件型別對應的 ReentrantReadWriteLock 寫鎖(mapobjectlocks.get(type))下將其放入 mapobjects。此方法只登錄物件,產生封包與通知玩家由 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 等路徑負責。

      Parameters:
      mapobject - 要加入的地圖物件
    • removeMapObject

      public final void removeMapObject(MapleMapObject obj)
      將地圖物件自本地圖移除。

      於該物件型別對應的 ReentrantReadWriteLock 寫鎖 (mapobjectlocks.get(type))下,依物件 ID 自 mapobjects 移除; 不會主動通知玩家。

      Parameters:
      obj - 要移除的地圖物件
    • calcPointBelow

      public final Point calcPointBelow(Point initial)
      計算 initial 正下方落在地面(足板)上的座標。

      footholds.findBelow 找出下方的 MapleFoothold;若為斜坡則依其 斜率內插出對應的 Y 座標。

      Parameters:
      initial - 起始座標
      Returns:
      地面上的落點座標;若下方無足板則傳回 null
    • calcDropPos

      public final Point calcDropPos(Point initial, Point fallback)
      計算掉落物應落下的地面座標。

      initial 上方 50 像素處呼叫 calcPointBelow(Point);若找不到地面則回傳 fallback

      Parameters:
      initial - 掉落起始座標
      fallback - 找不到地面時的備援座標
      Returns:
      落點座標,或 fallback
    • removeMonster

      public void removeMonster(MapleMonster monster)
      自本地圖移除指定怪物。

      委派至 MapleMonsterKillManager.removeMonster(MapleMonster)

      Parameters:
      monster - 要移除的怪物
    • killMonster

      public void killMonster(MapleMonster monster)
      擊殺指定怪物(適用於設有 removeAfter 的怪物)。

      委派至 MapleMonsterKillManager.killMonster(MapleMonster)

      Parameters:
      monster - 要擊殺的怪物
    • killMonster

      public final void killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation)
      由指定玩家擊殺怪物。

      委派至 MapleMonsterKillManager.killMonster(MapleMonster, MapleCharacter, boolean, boolean, byte), 由協作者負責經驗值分配、掉落生成與從地圖移除該怪物。

      Parameters:
      monster - 被擊殺的怪物
      chr - 造成擊殺的玩家(用於計算經驗與掉落擁有者)
      withDrops - 是否產生掉落物
      second - 是否為第二次擊殺處理
      animation - 死亡動畫類型
    • killMonster

      public final void killMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation, int lastSkill)
      由指定玩家擊殺怪物,並記錄最後造成擊殺的技能。

      委派至 MapleMonsterKillManager.killMonster(MapleMonster, MapleCharacter, boolean, boolean, byte, int)

      Parameters:
      monster - 被擊殺的怪物
      chr - 造成擊殺的玩家
      withDrops - 是否產生掉落物
      second - 是否為第二次擊殺處理
      animation - 死亡動畫類型
      lastSkill - 造成最後一擊的技能 ID
    • getAllReactor

      public List<MapleReactor> getAllReactor()
      取得地圖上所有反應爐的清單。

      委派至 MapReactorManager.getAllReactor()

      Returns:
      反應爐清單
    • getAllReactorsThreadsafe

      public List<MapleReactor> getAllReactorsThreadsafe()
      以執行緒安全方式取得地圖上所有反應爐的清單。

      委派至 MapReactorManager.getAllReactorsThreadsafe()(於 REACTOR 讀鎖下複製)。

      Returns:
      反應爐清單
    • getAllSummonsThreadsafe

      public List<MapleSummon> getAllSummonsThreadsafe()
      以執行緒安全方式取得地圖上所有召喚獸的清單。

      於 SUMMON 型別的讀鎖(mapobjectlocks.get(SUMMON))下遍歷並複製為新清單後回傳。

      Returns:
      召喚獸清單
    • getAllDoor

      public List<MapleMapObject> getAllDoor()
      取得地圖上所有傳送門(玩家門)物件的清單。

      委派至 getAllDoorsThreadsafe()

      Returns:
      傳送門物件清單
    • getAllDoorsThreadsafe

      public List<MapleMapObject> getAllDoorsThreadsafe()
      以執行緒安全方式取得地圖上所有 MapleDoor(玩家傳送門)的清單。

      於 DOOR 型別的讀鎖下遍歷,僅挑選 MapleDoor 實例後複製回傳; MechDoor 不會被納入。

      Returns:
      傳送門物件清單
    • getAllMechDoorsThreadsafe

      public List<MapleMapObject> getAllMechDoorsThreadsafe()
      以執行緒安全方式取得地圖上所有 MechDoor(機械門)的清單。

      於 DOOR 型別的讀鎖下遍歷,僅挑選 MechDoor 實例後複製回傳。

      Returns:
      機械門物件清單
    • getAllMerchant

      public List<MapleMapObject> getAllMerchant()
      取得地圖上所有雇用商人的清單。

      委派至 getAllHiredMerchantsThreadsafe()

      Returns:
      雇用商人物件清單
    • getAllHiredMerchantsThreadsafe

      public List<MapleMapObject> getAllHiredMerchantsThreadsafe()
      以執行緒安全方式取得地圖上所有雇用商人的清單。

      於 HIRED_MERCHANT 型別的讀鎖下遍歷並複製為新清單後回傳。

      Returns:
      雇用商人物件清單
    • getAllMonster

      public List<MapleMonster> getAllMonster()
      取得地圖上所有怪物的清單。

      委派至 getAllMonstersThreadsafe()

      Returns:
      怪物清單
    • getAllMonstersThreadsafe

      public List<MapleMonster> getAllMonstersThreadsafe()
      以執行緒安全方式取得地圖上所有怪物的清單。

      於 MONSTER 型別的讀鎖下遍歷並複製為新清單後回傳。

      Returns:
      怪物清單
    • getAllUniqueMonsters

      public List<Integer> getAllUniqueMonsters()
      取得地圖上出現的所有不重複怪物 ID 清單。

      於 MONSTER 型別的讀鎖下遍歷所有怪物,去除重複的怪物 ID 後回傳。

      Returns:
      不重複的怪物 ID 清單
    • killAllMonsters

      public final void killAllMonsters(boolean animate)
      擊殺地圖上所有怪物。

      委派至 MapleMonsterKillManager.killAllMonsters(boolean)

      Parameters:
      animate - 是否播放死亡動畫
    • killMonster

      public final void killMonster(int monsId)
      依怪物 ID 擊殺地圖上對應的怪物。

      委派至 MapleMonsterKillManager.killMonster(int)

      Parameters:
      monsId - 要擊殺的怪物 ID
    • limitReactor

      public final void limitReactor(int rid, int num)
      限制指定反應爐 ID 在地圖上的數量。

      委派至 MapReactorManager.limitReactor(int, int)

      Parameters:
      rid - 反應爐 ID
      num - 允許保留的數量
    • destroyReactors

      public final void destroyReactors(int first, int last)
      銷毀 ID 介於指定範圍內的所有反應爐。

      委派至 MapReactorManager.destroyReactors(int, int)

      Parameters:
      first - 反應爐 ID 範圍下界
      last - 反應爐 ID 範圍上界
    • destroyReactor

      public final void destroyReactor(int oid)
      依物件 ID 銷毀指定反應爐。

      委派至 MapReactorManager.destroyReactor(int)

      Parameters:
      oid - 反應爐的物件 ID
    • reloadReactors

      public final void reloadReactors()
      重新載入地圖上的反應爐。

      委派至 MapReactorManager.reloadReactors()

    • resetReactors

      public final void resetReactors()
      重設地圖上所有反應爐的狀態。

      委派至 MapReactorManager.resetReactors()

    • setReactorState

      public final void setReactorState()
      將地圖上所有反應爐設為預設狀態。

      委派至 MapReactorManager.setReactorState()

    • setReactorState

      public final void setReactorState(byte state)
      將地圖上所有反應爐設為指定狀態。

      委派至 MapReactorManager.setReactorState(byte)

      Parameters:
      state - 目標反應爐狀態
    • setReactorDelay

      public final void setReactorDelay(int state)
      設定地圖上反應爐的重生延遲。

      委派至 MapReactorManager.setReactorDelay(int)

      Parameters:
      state - 延遲時間(毫秒)
    • shuffleReactors

      public final void shuffleReactors()
      隨機重新排列地圖上所有反應爐的位置。

      委派至 MapReactorManager.shuffleReactors()

    • shuffleReactors

      public final void shuffleReactors(int first, int last)
      隨機重新排列 ID 介於指定範圍內反應爐的位置。

      委派至 MapReactorManager.shuffleReactors(int, int)

      Parameters:
      first - 反應爐 ID 範圍下界
      last - 反應爐 ID 範圍上界
    • updateMonsterController

      public final void updateMonsterController(MapleMonster monster)
      Automagically finds a new controller for the given monster from the chars on the map...
      Parameters:
      monster -
    • getMapObject

      public final MapleMapObject getMapObject(int oid, MapleMapObjectType type)
      依物件 ID 與型別取得地圖物件。

      於對應 type 型別的讀鎖下查詢;若不存在則回傳 null

      Parameters:
      oid - 物件 ID
      type - 地圖物件型別
      Returns:
      對應的地圖物件,不存在時為 null
    • containsNPC

      public final boolean containsNPC(int npcid)
      判斷地圖上是否存在指定 ID 的 NPC。

      於 NPC 型別的讀鎖下遍歷所有 NPC 比對其 ID。

      Parameters:
      npcid - 要檢查的 NPC ID
      Returns:
      若存在該 NPC 則為 true
    • getNPCById

      public MapleNPC getNPCById(int id)
      依 NPC ID 取得地圖上第一個符合的 NPC。

      於 NPC 型別的讀鎖下遍歷比對 ID;找不到時回傳 null

      Parameters:
      id - NPC ID
      Returns:
      符合的 NPC,找不到時為 null
    • getMonsterById

      public MapleMonster getMonsterById(int id)
      依怪物 ID 取得地圖上第一個符合的怪物。

      於 MONSTER 型別的讀鎖下遍歷比對 ID;找不到時回傳 null

      Parameters:
      id - 怪物 ID
      Returns:
      符合的怪物,找不到時為 null
    • countMonsterById

      public int countMonsterById(int id)
      統計地圖上指定 ID 的怪物數量。

      於 MONSTER 型別的讀鎖下遍歷並計數。

      Parameters:
      id - 怪物 ID
      Returns:
      符合該 ID 的怪物數量
    • getReactorById

      public MapleReactor getReactorById(int id)
      依反應爐 ID 取得地圖上對應的反應爐。

      委派至 MapReactorManager.getReactorById(int);找不到時回傳 null

      Parameters:
      id - 反應爐 ID
      Returns:
      符合的反應爐,找不到時為 null
    • getMonsterByOid

      public final MapleMonster getMonsterByOid(int oid)
      returns a monster with the given oid, if no such monster exists returns null
      Parameters:
      oid -
      Returns:
    • getNPCByOid

      public final MapleNPC getNPCByOid(int oid)
      依物件 ID 取得地圖上的 NPC。

      getMapObject(int, MapleMapObjectType) 查詢;找不到時回傳 null

      Parameters:
      oid - NPC 的物件 ID
      Returns:
      對應的 NPC,找不到時為 null
    • getReactorByOid

      public final MapleReactor getReactorByOid(int oid)
      依物件 ID 取得地圖上的反應爐。

      委派至 MapReactorManager.getReactorByOid(int);找不到時回傳 null

      Parameters:
      oid - 反應爐的物件 ID
      Returns:
      對應的反應爐,找不到時為 null
    • getFamiliarByOid

      public final MonsterFamiliar getFamiliarByOid(int oid)
      依物件 ID 取得地圖上的怪物夥伴(familiar)。

      getMapObject(int, MapleMapObjectType) 查詢;找不到時回傳 null

      Parameters:
      oid - 怪物夥伴的物件 ID
      Returns:
      對應的怪物夥伴,找不到時為 null
    • getReactorByName

      public final MapleReactor getReactorByName(String name)
      依名稱取得地圖上的反應爐。

      委派至 MapReactorManager.getReactorByName(String);找不到時回傳 null

      Parameters:
      name - 反應爐名稱
      Returns:
      對應的反應爐,找不到時為 null
    • spawnNpc

      public final void spawnNpc(int id, Point pos)
      於指定座標生成一個自訂 NPC 並廣播給全地圖玩家。

      透過 MapleLifeFactory.getNPC(int) 建立 NPC、設定其位置與基準座標、加入地圖物件後, 對地圖內所有玩家廣播 NPCPacket.spawnNPC 顯示封包。整段以 try/catch 包覆,發生例外時僅記錄錯誤。

      Parameters:
      id - NPC ID
      pos - 生成座標
    • spawnNpcForPlayer

      public final void spawnNpcForPlayer(MapleClient c, int id, Point pos)
      於指定座標生成一個自訂 NPC,但僅對單一玩家送出顯示封包。

      spawnNpc(int, Point) 類似,但 NPC 顯示封包只傳給 c 一名玩家, 其餘地圖玩家不會看見。NPC 仍會加入地圖物件集合。

      Parameters:
      c - 接收顯示封包的玩家連線
      id - NPC ID
      pos - 生成座標
    • removeNpc

      public final void removeNpc(int npcid)
      移除地圖上的自訂 NPC。

      於 NPC 型別的寫鎖下遍歷所有 NPC,對符合條件且為自訂(isCustom())的 NPC 廣播移除控制與移除顯示封包後,自地圖物件集合中刪除。傳入 -1 時移除所有自訂 NPC。

      Parameters:
      npcid - 要移除的 NPC ID,或 -1 表示移除全部自訂 NPC
    • hideNpc

      public final void hideNpc(int npcid)
      隱藏地圖上的 NPC(僅送出移除封包,不從地圖物件集合刪除)。

      於 NPC 型別的讀鎖下遍歷,對符合條件的 NPC 廣播移除控制與移除顯示封包, 使其於客戶端消失,但 NPC 物件仍保留在地圖中。傳入 -1 時隱藏所有 NPC。

      Parameters:
      npcid - 要隱藏的 NPC ID,或 -1 表示隱藏全部
    • spawnReactorOnGroundBelow

      public final void spawnReactorOnGroundBelow(MapleReactor mob, Point pos)
      將反應爐生成於指定座標正下方的地面上。

      委派至 MapReactorManager.spawnReactorOnGroundBelow(MapleReactor, Point)

      Parameters:
      mob - 要生成的反應爐
      pos - 參考座標(會落至其下方地面)
    • spawnMonster_sSack

      public final void spawnMonster_sSack(MapleMonster mob, Point pos, int spawnType)
      於指定座標生成怪物(沙包/指定生成型別版本)。

      委派至 MapleMonsterSpawnManager.spawnMonster_sSack(MapleMonster, Point, int)

      Parameters:
      mob - 要生成的怪物
      pos - 生成座標
      spawnType - 生成效果型別
    • spawnMonsterOnGroundBelow

      public final void spawnMonsterOnGroundBelow(MapleMonster mob, Point pos)
      將怪物生成於指定座標正下方的地面上。

      委派至 MapleMonsterSpawnManager.spawnMonsterOnGroundBelow(MapleMonster, Point)

      Parameters:
      mob - 要生成的怪物
      pos - 參考座標(會落至其下方地面)
    • spawnMonsterWithEffectBelow

      public final int spawnMonsterWithEffectBelow(MapleMonster mob, Point pos, int effect)
      將怪物生成於指定座標正下方地面,並附帶生成特效。

      委派至 MapleMonsterSpawnManager.spawnMonsterWithEffectBelow(MapleMonster, Point, int)

      Parameters:
      mob - 要生成的怪物
      pos - 參考座標(會落至其下方地面)
      effect - 生成特效編號
      Returns:
      生成怪物的物件 ID
    • spawnZakum

      public final void spawnZakum(int x, int y)
      於指定座標生成炎魔(Zakum)。

      委派至 MapleMonsterSpawnManager.spawnZakum(int, int)

      Parameters:
      x - 生成 X 座標
      y - 生成 Y 座標
    • spawnChaosZakum

      public final void spawnChaosZakum(int x, int y)
      於指定座標生成混沌炎魔(Chaos Zakum)。

      委派至 MapleMonsterSpawnManager.spawnChaosZakum(int, int)

      Parameters:
      x - 生成 X 座標
      y - 生成 Y 座標
    • spawnFakeMonsterOnGroundBelow

      public final void spawnFakeMonsterOnGroundBelow(MapleMonster mob, Point pos)
      將假怪物(不可攻擊的展示用怪物)生成於指定座標正下方地面。

      委派至 MapleMonsterSpawnManager.spawnFakeMonsterOnGroundBelow(MapleMonster, Point)

      Parameters:
      mob - 要生成的假怪物
      pos - 參考座標(會落至其下方地面)
    • spawnRevives

      public final void spawnRevives(MapleMonster monster, int oid)
      生成由另一隻怪物分裂/召喚而來的怪物(revive)。

      委派至 MapleMonsterSpawnManager.spawnRevives(MapleMonster, int)

      Parameters:
      monster - 要生成的怪物
      oid - 來源怪物的物件 ID
    • spawnMonster

      public final void spawnMonster(MapleMonster monster, int spawnType)
      生成怪物並以指定生成型別播放出場效果。

      委派至 MapleMonsterSpawnManager.spawnMonster(MapleMonster, int)

      Parameters:
      monster - 要生成的怪物
      spawnType - 生成效果型別
    • spawnMonster

      public final void spawnMonster(MapleMonster monster, int spawnType, boolean overwrite)
      生成怪物並以指定生成型別播放出場效果,可選擇覆寫既有控制狀態。

      委派至 MapleMonsterSpawnManager.spawnMonster(MapleMonster, int, boolean)

      Parameters:
      monster - 要生成的怪物
      spawnType - 生成效果型別
      overwrite - 是否覆寫既有狀態
    • spawnMonsterWithEffect

      public final int spawnMonsterWithEffect(MapleMonster monster, int effect, Point pos)
      於指定座標生成怪物並附帶生成特效。

      委派至 MapleMonsterSpawnManager.spawnMonsterWithEffect(MapleMonster, int, Point)

      Parameters:
      monster - 要生成的怪物
      effect - 生成特效編號
      pos - 生成座標
      Returns:
      生成怪物的物件 ID
    • spawnFakeMonster

      public final void spawnFakeMonster(MapleMonster monster)
      生成假怪物(不可攻擊的展示用怪物)。

      委派至 MapleMonsterSpawnManager.spawnFakeMonster(MapleMonster)

      Parameters:
      monster - 要生成的假怪物
    • spawnReactor

      public final void spawnReactor(MapleReactor reactor)
      將反應爐生成於其自身座標。

      委派至 MapReactorManager.spawnReactor(MapleReactor)

      Parameters:
      reactor - 要生成的反應爐
    • spawnDoor

      public final void spawnDoor(MapleDoor door)
      將玩家傳送門(MapleDoor)生成於地圖上。

      透過 spawnAndAddRangedMapObject 加入地圖物件,並對視野範圍內玩家以延遲封包送出傳送門 生成資料(door.sendSpawnData)後附加 CWvsContext.enableActions() 解除動作鎖。

      Parameters:
      door - 要生成的傳送門
    • spawnMechDoor

      public final void spawnMechDoor(MechDoor door)
      將機械門(MechDoor,機械師技能產生的門)生成於地圖上。

      透過 spawnAndAddRangedMapObject 加入地圖物件,並對視野範圍內玩家以延遲封包送出 CField.spawnMechDoor 生成封包後附加 CWvsContext.enableActions() 解除動作鎖。

      Parameters:
      door - 要生成的機械門
    • spawnSummon

      public final void spawnSummon(MapleSummon summon)
      將召喚獸生成於地圖上,並對視野範圍內玩家送出召喚封包。

      先以 MapleSummon.updateMap(MapleMap) 綁定本地圖,再經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入地圖物件並廣播; sendPackets 僅在召喚獸未換地圖、或接收者即為召喚主時才送出 SummonPacket.spawnSummon(MapleSummon, boolean)

      Parameters:
      summon - 欲生成的召喚獸
    • spawnFamiliar

      public final void spawnFamiliar(MonsterFamiliar familiar)
      將怪物夥伴生成於地圖上,並對視野範圍內玩家送出生成封包。

      spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入地圖物件並廣播 CField.spawnFamiliar(MonsterFamiliar, boolean)(接收者玩家須存在)。

      Parameters:
      familiar - 欲生成的怪物夥伴
    • spawnExtractor

      public final void spawnExtractor(MapleExtractor ex)
      將採集器生成於地圖上,並對視野範圍內玩家送出其生成資料。

      spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入地圖物件並由 MapleExtractor.sendSpawnData(MapleClient) 送出封包。

      Parameters:
      ex - 欲生成的採集器
    • spawnMist

      public final void spawnMist(MapleMist mist, int duration, boolean fake)
      將煙霧(毒霧/補血霧等)生成於地圖上並依類型排定週期效果與到期清除。

      先經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 廣播生成資料;接著依 MapleMist.isPoisonMist() 註冊週期排程:類型 1 對範圍內目標 (PVP 為玩家、否則為怪物)施加中毒,類型 4 對範圍內玩家回復 HP/MP, 其餘無週期效果。最後排定 duration 毫秒後廣播 CField.removeMist(int, boolean) 並移除物件、取消週期排程。會持有 MapTimer 排程。

      Parameters:
      mist - 欲生成的煙霧物件
      duration - 持續時間(毫秒),亦作為到期移除的延遲
      fake - 是否為假煙霧(目前未於本方法使用)
    • disappearingItemDrop

      public final void disappearingItemDrop(MapleMapObject dropper, MapleCharacter owner, Item item, Point pos)
      產生一個立即消失的掉落物動畫(不會真正落在地上供拾取)。

      calcDropPos(Point, Point) 計算落點後,直接以 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte) 廣播「飛出後消失」(動畫類型 3) 給範圍內玩家,並不將其加入地圖物件。

      Parameters:
      dropper - 掉落來源物件(決定起始座標)
      owner - 掉落物擁有者
      item - 掉落的道具
      pos - 掉落的目標座標
    • spawnMesoDrop

      public final void spawnMesoDrop(int meso, Point position, MapleMapObject dropper, MapleCharacter owner, boolean playerDrop, byte droptype)
      生成一筆楓幣掉落物於地圖上(落點會經地形修正)。

      calcDropPos(Point, Point) 修正落點後,經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入地圖並對範圍內玩家廣播 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte)。 非 everlast 地圖會註冊 120 秒到期;droptype 為 0 或 1 時 另註冊 30 秒後開放自由拾取(FFA)。

      Parameters:
      meso - 楓幣數量
      position - 預定落點座標
      dropper - 掉落來源物件(決定起始座標)
      owner - 掉落物擁有者
      playerDrop - 是否為玩家主動丟出
      droptype - 掉落歸屬類型(0/1 為擁有者專屬並適用 FFA 計時)
    • spawnMobMesoDrop

      public final void spawnMobMesoDrop(int meso, Point position, MapleMapObject dropper, MapleCharacter owner, boolean playerDrop, byte droptype)
      生成一筆由怪物掉落的楓幣於地圖上(落點不另作地形修正,沿用傳入座標)。

      spawnMesoDrop(int, Point, MapleMapObject, MapleCharacter, boolean, byte) 類似,但直接使用 position 作為落點。 經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入並廣播 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte),註冊 120 秒到期; droptype 為 0 或 1 時另註冊 30 秒後開放自由拾取(FFA)。

      Parameters:
      meso - 楓幣數量
      position - 落點座標
      dropper - 掉落來源物件(決定起始座標)
      owner - 掉落物擁有者
      playerDrop - 是否為玩家主動丟出
      droptype - 掉落歸屬類型(0/1 為擁有者專屬並適用 FFA 計時)
    • spawnMobDrop

      public final void spawnMobDrop(Item idrop, Point dropPos, MapleMonster mob, MapleCharacter chr, byte droptype, int questid)
      生成一筆由怪物掉落的道具於地圖上,並觸發道具反應爐檢查。

      spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入地圖;每位接收者僅在符合條件時 才收到 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte):任務道具須該玩家正進行對應任務、 怪物卡(itemId/10000==238)須該玩家卡片等級 >= 2。隨後註冊 120 秒到期、 對 droptype 0/1 註冊 30 秒 FFA,最後呼叫 activateItemReactors(MapleMapItem, MapleClient) 檢查掉落是否觸發反應爐。

      Parameters:
      idrop - 掉落的道具
      dropPos - 落點座標
      mob - 掉落來源怪物(決定起始座標)
      chr - 擊殺者(其 client 用於反應爐觸發)
      droptype - 掉落歸屬類型(0/1 為擁有者專屬並適用 FFA 計時)
      questid - 關聯任務 ID(> 0 時僅進行中玩家可見)
    • spawnRandDrop

      public final void spawnRandDrop()
      於自由市場(地圖 910000000、頻道 1)排定一次隨機道具掉落。

      僅限自由市場第一頻道生效,其餘地圖/頻道直接返回。會在 ITEM 型別讀鎖下 檢查場上是否已有隨機掉落物,若有則不重複排定。否則排定 20 秒後依機率 (normal/rare/super)抽取 GameConstants 掉落表中的道具並呼叫 spawnAutoDrop(int, Point)

    • spawnAutoDrop

      public final void spawnAutoDrop(int itemid, Point pos)
      於指定座標自動生成一個無主掉落物並對全地圖廣播。

      裝備類道具會經 MapleItemInformationProvider.randomizeStats(Equip) 隨機化能力值, 其餘為數量 1 的一般道具。經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入並另對全地圖 廣播 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte);除點券類(itemid/10000==291)外註冊 120 秒到期。

      Parameters:
      itemid - 道具 ID
      pos - 落點座標
    • spawnItemDrop

      public final void spawnItemDrop(MapleMapObject dropper, MapleCharacter owner, Item item, Point pos, boolean ffaDrop, boolean playerDrop)
      生成一個道具掉落物於地圖上並對全地圖廣播,依設定觸發反應爐。

      calcDropPos(Point, Point) 修正落點後,經 spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation) 加入並另對全地圖廣播 CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte)。非 everlast 地圖會註冊 120 秒到期並呼叫 activateItemReactors(MapleMapItem, MapleClient) 檢查反應爐觸發。

      Parameters:
      dropper - 掉落來源物件(決定起始座標)
      owner - 掉落物擁有者(其 client 用於反應爐觸發)
      item - 掉落的道具
      pos - 預定落點座標
      ffaDrop - 是否為自由拾取掉落(目前未於本方法使用)
      playerDrop - 是否為玩家主動丟出
    • getItemsSize

      public int getItemsSize()
      取得地圖上掉落物(ITEM 型別物件)的數量。

      未持鎖讀取,僅供概略統計參考。

      Returns:
      掉落物數量
    • getExtractorSize

      public int getExtractorSize()
      取得地圖上採集器(EXTRACTOR 型別物件)的數量。

      未持鎖讀取,僅供概略統計參考。

      Returns:
      採集器數量
    • getMobsSize

      public int getMobsSize()
      取得地圖上怪物(MONSTER 型別物件)的數量。

      未持鎖讀取,僅供概略統計參考;需安全讀取請用 getNumMonsters()

      Returns:
      怪物數量
    • getAllItems

      public List<MapleMapItem> getAllItems()
      取得地圖上所有掉落物的快照清單。委派至 getAllItemsThreadsafe()
      Returns:
      掉落物清單(快照)
    • getAllItemsThreadsafe

      public List<MapleMapItem> getAllItemsThreadsafe()
      在 ITEM 型別讀鎖保護下,取得地圖上所有掉落物的快照清單。
      Returns:
      掉落物清單(快照,可能為空)
    • getPointOfItem

      public Point getPointOfItem(int itemid)
      在 ITEM 型別讀鎖保護下,尋找場上指定道具 ID 的掉落物座標。
      Parameters:
      itemid - 欲尋找的道具 ID
      Returns:
      第一個符合者的座標;找不到時為 null
    • getAllMistsThreadsafe

      public List<MapleMist> getAllMistsThreadsafe()
      在 MIST 型別讀鎖保護下,取得地圖上所有煙霧的快照清單。
      Returns:
      煙霧清單(快照,可能為空)
    • returnEverLastItem

      public final void returnEverLastItem(MapleCharacter chr)
      將永久地圖(everlast)上屬於指定玩家的掉落物全數返還給該玩家。

      逐一檢視場上掉落物,凡擁有者為 chr 者:標記已拾取、廣播 CField.removeItemFromMap(int, int, int) 後,楓幣經 MapleCharacter.gainMeso(int, boolean) 入帳、道具經 MapleInventoryManipulator.addFromDrop(MapleClient, Item, boolean) 加入背包,並移除地圖物件。 完成後呼叫 spawnRandDrop() 重新排定隨機掉落。會修改玩家狀態並送出封包。

      Parameters:
      chr - 離開地圖、需返還掉落物的玩家
    • talkMonster

      public final void talkMonster(String msg, int itemId, int objectid)
      讓指定怪物說話(顯示對話泡泡)並隨即移除該泡泡,必要時觸發地圖效果。

      itemId > 0 時先呼叫 startMapEffect(String, int) 顯示地圖訊息, 接著對全地圖廣播 MobPacket.talkMonster(int, int, String)MobPacket.removeTalkMonster(int)

      Parameters:
      msg - 怪物對話文字
      itemId - 關聯的地圖效果道具 ID(> 0 時觸發地圖效果)
      objectid - 目標怪物的物件 ID
    • startMapEffect

      public final void startMapEffect(String msg, int itemId)
      顯示一般地圖效果(橫幅訊息)。委派至 startMapEffect(String, int, boolean)jukeboxfalse
      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
    • startMapEffect

      public final void startMapEffect(String msg, int itemId, boolean jukebox)
      啟動地圖效果(橫幅訊息/點唱機)並排定自動結束。

      若已有 mapEffect 進行中則直接返回(同時間僅允許一個)。否則建立 MapleMapEffect、廣播開始封包,並排定一段時間後廣播結束封包並清除: 點唱機(jukeboxtrue)為 300 秒,一般效果為 30 秒。

      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
      jukebox - 是否為點唱機效果(影響持續時間)
    • startExtendedMapEffect

      public final void startExtendedMapEffect(String msg, int itemId)
      啟動延長型地圖效果(橫幅訊息長駐顯示)。

      先廣播 CField.startMapEffect(String, int, boolean) 開始橫幅;60 秒後廣播 CField.removeMapEffect() 並再次以非開始模式廣播 CField.startMapEffect(String, int, boolean)(保留效果不移除)。不使用單一 mapEffect 互斥旗標。

      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
    • startSimpleMapEffect

      public final void startSimpleMapEffect(String msg, int itemId)
      啟動簡易地圖效果:僅廣播 CField.startMapEffect(String, int, boolean) 開始橫幅,不排定結束。
      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
    • startJukebox

      public final void startJukebox(String msg, int itemId)
      啟動點唱機效果。委派至 startMapEffect(String, int, boolean)jukeboxtrue(持續 300 秒)。
      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
    • addPlayer

      public final void addPlayer(MapleCharacter chr)
      將玩家加入本地圖,完成進場所需的全部初始化與封包同步。

      本方法為玩家進場的核心流程,主要步驟包含:

      • 在 PLAYER 型別寫鎖下加入 mapobjects,並在 charactersLock 寫鎖下加入 characters
      • 對其他玩家廣播角色生成封包(隱身時僅對 GM 廣播);自由市場進場若有遠征隊 進行中且為內部帳號會結束遠征。
      • 送出本地圖既有物件擺放(sendObjectPlacement)、執行 onFirstUserEnter / onUserEnter 腳本、處理船隻、隊伍 HP、寵物/機器人/龍/召喚獸重生、時鐘、 遠征隊神殿、BGM、道場計時、組隊更新、永久天氣與移動平台等。
      • 依地圖/職業套用特殊狀態並取消不合規的增益(飛行、SOARING、AURA 等)。
      牽涉大量封包送出、廣播與玩家狀態變更;複製分身(clone)會略過多數對外流程並遞迴加入。
      Parameters:
      chr - 進場的玩家
    • getNumItems

      public int getNumItems()
      在 ITEM 型別讀鎖保護下,取得地圖上掉落物的數量。
      Returns:
      掉落物數量
    • getNumMonsters

      public int getNumMonsters()
      在 MONSTER 型別讀鎖保護下,取得地圖上怪物的數量。
      Returns:
      怪物數量
    • doShrine

      public void doShrine(boolean spawned)
      處理王怪神殿(蠟燭/號角等)的進場顯示與限時排程,逾時則強制將全地圖玩家送出。

      取得本地圖對應遠征隊 getSquadByMap(),無隊時直接返回。依地圖判定模式 (混沌炎魔/炎魔/龍王/混沌龍王),廣播對應神殿封包;spawnedtrue(王已現身)時另廣播 5 分鐘時鐘。隨後排定 5 分鐘後的檢查:若同一遠征隊 仍存在且狀態相符,將全地圖玩家經 MapleCharacter.changeMap(int) 送回,並呼叫 checkStates(String)resetFully()。會送出封包、變更玩家所在地圖、 並持有 MapTimer 排程(先取消既有的 squadSchedule)。

      Parameters:
      spawned - false 表進入地圖、true 表王已被擊敗/現身
    • getSquadByMap

      public final MapleSquad getSquadByMap()
      依本地圖的地圖 ID 解析其對應的遠征隊並回傳。

      以地圖 ID 對映到 MapleSquad.MapleSquadType(炎魔/札昆/龍王/粉紅熊/各地獄王等), 再向本頻道的 ChannelServer.getMapleSquad(String) 取得隊伍實例。

      Returns:
      對應的遠征隊;地圖不屬任何王怪戰時為 null
    • getSquadBegin

      public final MapleSquad getSquadBegin()
      取得本地圖已設定之 squad 型別所對應的遠征隊。
      Returns:
      對應的遠征隊;squad 未設定時為 null
    • getEMByMap

      public final EventManager getEMByMap()
      依本地圖的地圖 ID 解析其對應的事件管理器(EventManager)。

      以地圖 ID 對映到事件名稱(如 ZakumBattleHorntailBattle 等), 再向本頻道的事件腳本管理器取得對應 EventManager

      Returns:
      對應的事件管理器;地圖不屬任何王怪戰時為 null
    • removePlayer

      public final void removePlayer(MapleCharacter chr)
      將玩家自本地圖移除,並清理其相關地圖物件與廣播離場。

      主要步驟:永久地圖先返還掉落物(returnEverLastItem(MapleCharacter));在 charactersLock 寫鎖下自 characters 移除,再移除其地圖物件、 檢查跟隨、移除採集器並廣播 CField.removePlayerFromMap(int);移除其召喚獸 (定點型召喚獸另行取消增益)與怪物夥伴。非複製分身會呼叫 checkStates(String)、遞迴移除分身並呼叫 MapleCharacter.leaveMap(MapleMap)。會送出廣播並變更玩家狀態。

      Parameters:
      chr - 離場的玩家
    • mobCount

      public final int mobCount()
      計算地圖上的怪物數量。

      透過 getMapObjectsInRange(Point, double) 以無限範圍取得全部 MONSTER 物件後計數。

      Returns:
      怪物數量
    • broadcastMessage

      public final void broadcastMessage(byte[] packet)
      對地圖內所有玩家廣播封包(無範圍限制)。

      委派至 broadcastMessage(MapleCharacter, byte[], double, Point), 來源為 null、範圍為無限大。

      Parameters:
      packet - 欲廣播的封包位元組
    • broadcastMessage

      public final void broadcastMessage(MapleCharacter source, byte[] packet, boolean repeatToSource)
      對地圖內玩家廣播封包(無範圍限制),可選擇是否同時送回來源玩家。

      委派至 broadcastMessage(MapleCharacter, byte[], double, Point)repeatToSourcetrue 時來源帶 null(連同來源一併送出), 否則排除來源玩家。

      Parameters:
      source - 來源玩家(其座標作為廣播基準)
      packet - 欲廣播的封包位元組
      repeatToSource - 是否同時送回來源玩家
    • broadcastMessage

      public final void broadcastMessage(byte[] packet, Point rangedFrom)
      對指定座標視野範圍內的所有玩家廣播封包。

      委派至 broadcastMessage(MapleCharacter, byte[], double, Point), 來源為 null、範圍為 GameConstants.maxViewRangeSq()

      Parameters:
      packet - 欲廣播的封包位元組
      rangedFrom - 範圍判定的中心座標
    • broadcastMessage

      public final void broadcastMessage(MapleCharacter source, byte[] packet, Point rangedFrom)
      對指定座標視野範圍內的玩家廣播封包,排除來源玩家。

      委派至 broadcastMessage(MapleCharacter, byte[], double, Point), 範圍為 GameConstants.maxViewRangeSq()

      Parameters:
      source - 排除廣播的來源玩家
      packet - 欲廣播的封包位元組
      rangedFrom - 範圍判定的中心座標
    • broadcastMessage

      public void broadcastMessage(MapleCharacter source, byte[] packet, double rangeSq, Point rangedFrom)
      廣播的核心實作:在 charactersLock 讀鎖保護下對符合條件的玩家送出封包。

      逐一檢視 characters,跳過 source;當 rangeSq 為有限值時, 僅對與 rangedFrom 距離平方在範圍內的玩家送出,否則對全部玩家送出。 其餘 broadcastMessage 重載皆委派至此。

      Parameters:
      source - 排除廣播的來源玩家(null 表不排除)
      packet - 欲廣播的封包位元組
      rangeSq - 範圍的距離平方上限(Double.POSITIVE_INFINITY 表無限制)
      rangedFrom - 範圍判定的中心座標(rangeSq 有限時不可為 null
    • getPortalsInRange

      public final List<MaplePortal> getPortalsInRange(Point from, double rangeSq)
      取得指定座標一定距離平方範圍內的傳送點清單。

      會排除目標地圖即為本地圖、以及目標地圖為 999999999(無目標/重生點)的傳送點。

      Parameters:
      from - 中心座標
      rangeSq - 範圍的距離平方上限
      Returns:
      範圍內符合條件的傳送點清單(可能為空)
    • getMapObjectsInRange

      public final List<MapleMapObject> getMapObjectsInRange(Point from, double rangeSq)
      取得指定座標一定距離平方範圍內的所有地圖物件。

      會逐一掃描每一種 MapleMapObjectType,各自於對應的 mapobjectlocks 讀鎖下走訪。

      Parameters:
      from - 中心座標
      rangeSq - 範圍的距離平方上限
      Returns:
      範圍內所有型別的地圖物件清單(可能為空)
    • getItemsInRange

      public List<MapleMapObject> getItemsInRange(Point from, double rangeSq)
      取得指定座標一定距離平方範圍內的掉落物件。

      等同呼叫 getMapObjectsInRange(Point, double, List) 並限定型別為 MapleMapObjectType.ITEM

      Parameters:
      from - 中心座標
      rangeSq - 範圍的距離平方上限
      Returns:
      範圍內的掉落物件清單(可能為空)
    • getMapObjectsInRange

      public final List<MapleMapObject> getMapObjectsInRange(Point from, double rangeSq, List<MapleMapObjectType> MapObject_types)
      取得指定座標一定距離平方範圍內、且屬於指定型別的地圖物件。

      僅掃描傳入的型別清單,各型別於對應的 mapobjectlocks 讀鎖下走訪。

      Parameters:
      from - 中心座標
      rangeSq - 範圍的距離平方上限
      MapObject_types - 欲納入的地圖物件型別清單
      Returns:
      範圍內符合型別的地圖物件清單(可能為空)
    • getMapObjectsInRect

      public final List<MapleMapObject> getMapObjectsInRect(Rectangle box, List<MapleMapObjectType> MapObject_types)
      取得位於指定矩形範圍內、且屬於指定型別的地圖物件。

      僅掃描傳入的型別清單,各型別於對應的 mapobjectlocks 讀鎖下走訪。

      Parameters:
      box - 矩形範圍
      MapObject_types - 欲納入的地圖物件型別清單
      Returns:
      矩形內符合型別的地圖物件清單(可能為空)
    • getCharactersIntersect

      public final List<MapleCharacter> getCharactersIntersect(Rectangle box)
      取得邊界與指定矩形相交的所有玩家。

      charactersLock 讀鎖下走訪本地圖玩家。

      Parameters:
      box - 矩形範圍
      Returns:
      邊界與矩形相交的玩家清單(可能為空)
    • getPlayersInRectAndInList

      public final List<MapleCharacter> getPlayersInRectAndInList(Rectangle box, List<MapleCharacter> chrList)
      取得同時位於指定矩形範圍內、且存在於指定玩家清單中的玩家。

      charactersLock 讀鎖下走訪本地圖玩家,回傳同時通過清單成員檢查與矩形包含檢查者。

      Parameters:
      box - 矩形範圍
      chrList - 用於過濾的玩家清單
      Returns:
      同時符合兩項條件的玩家清單(可能為空)
    • addPortal

      public final void addPortal(MaplePortal myPortal)
      將傳送點加入本地圖,以其 id 為索引。
      Parameters:
      myPortal - 要加入的傳送點
    • getPortal

      public final MaplePortal getPortal(String portalname)
      依名稱取得傳送點。
      Parameters:
      portalname - 傳送點名稱
      Returns:
      對應的傳送點;找不到時為 null
    • getPortal

      public final MaplePortal getPortal(int portalid)
      依 id 取得傳送點。
      Parameters:
      portalid - 傳送點 id
      Returns:
      對應的傳送點;找不到時為 null
    • resetPortals

      public final void resetPortals()
      重設本地圖所有傳送點為開啟狀態。
    • getFootholds

      public final MapleFootholdTree getFootholds()
      取得本地圖的踏板(foothold)樹。
      Returns:
      踏板樹
    • setFootholds

      public final void setFootholds(MapleFootholdTree footholds)
      設定本地圖的踏板(foothold)樹。
      Parameters:
      footholds - 踏板樹
    • getNumSpawnPoints

      public final int getNumSpawnPoints()
      取得本地圖的怪物生成點數量。委派至 MapleMonsterSpawnManager.getNumSpawnPoints()
      Returns:
      生成點數量
    • loadMonsterRate

      public final void loadMonsterRate(boolean first)
      載入並套用本地圖的怪物生成倍率。委派至 MapleMonsterSpawnManager.loadMonsterRate(boolean)
      Parameters:
      first - 是否為首次載入
    • addMonsterSpawn

      public final SpawnPoint addMonsterSpawn(MapleMonster monster, int mobTime, byte carnivalTeam, String msg)
      Parameters:
      monster - 要生成的怪物原型
      mobTime - 重生間隔(秒)
      carnivalTeam - 怪物迷宮(CPQ)所屬隊伍編號
      msg - 生成時顯示的訊息
      Returns:
      建立的生成點
    • addMonsterSpawn

      public final SpawnPoint addMonsterSpawn(MapleMonster monster, int mobTime, byte carnivalTeam, String msg, boolean spawn)
      新增一個怪物生成點,並可指定是否立即生成。 委派至 MapleMonsterSpawnManager.addMonsterSpawn(MapleMonster, int, byte, String, boolean)
      Parameters:
      monster - 要生成的怪物原型
      mobTime - 重生間隔(秒)
      carnivalTeam - 怪物迷宮(CPQ)所屬隊伍編號
      msg - 生成時顯示的訊息
      spawn - 是否在加入時立即生成
      Returns:
      建立的生成點
    • addAreaMonsterSpawn

      public final void addAreaMonsterSpawn(MapleMonster monster, Point pos1, Point pos2, Point pos3, int mobTime, String msg, boolean shouldSpawn)
      新增一個區域型怪物生成點(怪物會在三個座標間移動生成)。 委派至 MapleMonsterSpawnManager.addAreaMonsterSpawn(MapleMonster, Point, Point, Point, int, String, boolean)
      Parameters:
      monster - 要生成的怪物原型
      pos1 - 區域座標一
      pos2 - 區域座標二
      pos3 - 區域座標三
      mobTime - 重生間隔(秒)
      msg - 生成時顯示的訊息
      shouldSpawn - 是否在加入時立即生成
    • getCharacters

      public final List<MapleCharacter> getCharacters()
      取得本地圖玩家的快照清單。委派至 getCharactersThreadsafe()
      Returns:
      本地圖玩家的複本清單(可能為空)
    • getCharactersThreadsafe

      public final List<MapleCharacter> getCharactersThreadsafe()
      取得本地圖玩家的執行緒安全快照清單。

      charactersLock 讀鎖下複製,回傳的是獨立清單,可在鎖外安全走訪。

      Returns:
      本地圖玩家的複本清單(可能為空)
    • getCharacterByName

      public final MapleCharacter getCharacterByName(String id)
      依名稱(不分大小寫)取得本地圖中的玩家。

      charactersLock 讀鎖下走訪本地圖玩家。

      Parameters:
      id - 玩家名稱
      Returns:
      對應的玩家;找不到時為 null
    • getCharacterById_InMap

      public final MapleCharacter getCharacterById_InMap(int id)
      依玩家 id 取得本地圖中的玩家。委派至 getCharacterById(int)
      Parameters:
      id - 玩家 id
      Returns:
      對應的玩家;找不到時為 null
    • getCharacterById

      public final MapleCharacter getCharacterById(int id)
      依玩家 id 取得本地圖中的玩家。

      charactersLock 讀鎖下走訪本地圖玩家。

      Parameters:
      id - 玩家 id
      Returns:
      對應的玩家;找不到時為 null
    • updateMapObjectVisibility

      public final void updateMapObjectVisibility(MapleCharacter chr, MapleMapObject mo)
      依玩家與地圖物件的距離,更新該物件對該玩家的可見性。

      物件由不可見進入視野時,送出生成封包並登記為可見;離開視野時送出消失封包並移除登記。 迷霧/萃取器/召喚獸/夥伴/機械門等型別一旦可見便維持可見(不因距離移除)。怪物未離開視野且仍在半視野範圍內時, 會呼叫 updateMonsterController(MapleMonster) 重新指派控制者。chrnull 或為分身時直接略過。

      Parameters:
      chr - 觀察的玩家
      mo - 要更新可見性的地圖物件
    • moveMonster

      public void moveMonster(MapleMonster monster, Point reportedPos)
      更新怪物座標,並對本地圖所有玩家刷新該怪物的可見性。

      charactersLock 讀鎖下逐一呼叫 updateMapObjectVisibility(MapleCharacter, MapleMapObject)

      Parameters:
      monster - 移動的怪物
      reportedPos - 客戶端回報的新座標
    • movePlayer

      public void movePlayer(MapleCharacter player, Point newPosition)
      更新玩家座標,並重新計算其周遭地圖物件的可見集合。

      在玩家可見物件集合的寫鎖保護下:先逐一更新目前可見物件的可見性(已不在地圖者自集合移除), 再將進入視野範圍但尚未可見的物件送出生成封包並加入集合。player 為分身時直接略過。

      Parameters:
      player - 移動的玩家
      newPosition - 玩家的新座標
    • findClosestSpawnpoint

      public MaplePortal findClosestSpawnpoint(Point from)
      取得距離指定座標最近的重生點。

      僅納入型別介於 0 至 2 之間、且目標地圖為 999999999(重生用)的傳送點; 以距離平方比較。預設值為 0 號傳送點。

      Parameters:
      from - 參考座標
      Returns:
      最近的重生點傳送點
    • findClosestPortal

      public MaplePortal findClosestPortal(Point from)
      取得距離指定座標最近的傳送點(不限型別)。

      以距離平方比較所有傳送點,預設值為 0 號傳送點。

      Parameters:
      from - 參考座標
      Returns:
      最近的傳送點
    • spawnDebug

      public String spawnDebug()
      組出本地圖怪物生成相關狀態的除錯字串。

      包含怪物數量、spawnedMonstersOnMap、生成點數、最大常駐生成數、實際怪物數、生成倍率與固定怪數等。

      Returns:
      除錯用的單行狀態字串
    • characterSize

      public int characterSize()
      取得本地圖玩家集合的原始大小(含分身,未加鎖)。
      Returns:
      玩家集合的元素數量
    • getMapObjectSize

      public final int getMapObjectSize()
      取得本地圖地圖物件的概略總數(排除分身後的玩家計入)。
      Returns:
      地圖物件數量
    • getCharactersSize

      public final int getCharactersSize()
      取得本地圖中非分身的真實玩家數量。

      charactersLock 讀鎖下走訪並排除分身。

      Returns:
      真實玩家數量
    • getPortals

      public Collection<MaplePortal> getPortals()
      取得本地圖所有傳送點的唯讀檢視。
      Returns:
      不可修改的傳送點集合
    • getSpawnedMonstersOnMap

      public int getSpawnedMonstersOnMap()
      取得本地圖目前已生成的怪物計數。
      Returns:
      已生成怪物數
    • respawn

      public void respawn(boolean force)
      觸發本地圖怪物重生。委派至 MapleMonsterSpawnManager.respawn(boolean)
      Parameters:
      force - 是否強制重生(忽略生成節流)
    • respawn

      public void respawn(boolean force, long now)
      以指定時間戳觸發本地圖怪物重生。委派至 MapleMonsterSpawnManager.respawn(boolean, long)
      Parameters:
      force - 是否強制重生(忽略生成節流)
      now - 當前時間戳(毫秒)
    • getSnowballPortal

      public String getSnowballPortal()
      依本地圖玩家分布判定雪球賽(snowball)的起始傳送點。

      charactersLock 讀鎖下,以 y 座標 -80 為界統計兩隊人數;上半隊較多回傳 "st01",否則回傳 "st00"

      Returns:
      雪球賽起始傳送點名稱("st00""st01"
    • isDisconnected

      public boolean isDisconnected(int id)
      查詢指定玩家 id 是否已標記為在本地圖斷線。
      Parameters:
      id - 玩家 id
      Returns:
      已標記斷線時為 true
    • addDisconnected

      public void addDisconnected(int id)
      將指定玩家 id 標記為在本地圖斷線。
      Parameters:
      id - 玩家 id
    • resetDisconnected

      public void resetDisconnected()
      清除本地圖所有斷線標記。
    • startSpeedRun

      public void startSpeedRun()
      以本地圖隊伍隊長為計時者開始競速計時。

      取得本地圖的 MapleSquad,於 charactersLock 讀鎖下尋找名稱與隊長相符且非管理身分的玩家, 找到後委派至 startSpeedRun(String)。無隊伍或找不到隊長時不做任何事。

    • startSpeedRun

      public void startSpeedRun(String leader)
      開始競速計時,記錄起始時間與指定的隊長名稱。
      Parameters:
      leader - 競速隊長名稱
    • endSpeedRun

      public void endSpeedRun()
      結束競速計時,清除起始時間與隊長名稱。
    • getRankAndAdd

      public void getRankAndAdd(String leader, String time, ExpeditionType type, long timz, Collection<String> squad)
      將一筆競速紀錄寫入資料庫並更新對應遠征型別的競速排行。

      副作用:speedruns 資料表執行 INSERT;接著視先前是否已有紀錄, 直接加入或重載 SpeedRunner 的快取排行。squad 成員以逗號串接寫入。整段以 try/catch 包覆, 發生例外時記錄錯誤而不向外拋出。

      Parameters:
      leader - 隊長名稱
      time - 競速耗時的顯示字串
      type - 遠征(競速)型別
      timz - 競速耗時(毫秒)
      squad - 參與成員名稱集合;可為 null
    • getSpeedRunStart

      public long getSpeedRunStart()
      取得本地圖競速的起始時間戳。
      Returns:
      競速起始時間戳(毫秒);未進行時為 0
    • disconnectAll

      public final void disconnectAll()
      中斷本地圖所有非 GM 玩家的連線。

      副作用:對每位非 GM 玩家呼叫 disconnect 並關閉其連線 session。走訪 getCharactersThreadsafe() 的快照。

    • getAllNPCs

      public List<MapleNPC> getAllNPCs()
      取得本地圖所有 NPC 的快照清單。委派至 getAllNPCsThreadsafe()
      Returns:
      本地圖 NPC 的複本清單(可能為空)
    • getAllNPCsThreadsafe

      public List<MapleNPC> getAllNPCsThreadsafe()
      取得本地圖所有 NPC 的執行緒安全快照清單。

      MapleMapObjectType.NPC 對應的 mapobjectlocks 讀鎖下複製,回傳獨立清單。

      Returns:
      本地圖 NPC 的複本清單(可能為空)
    • resetNPCs

      public final void resetNPCs()
      移除本地圖所有 NPC(以 removeNpc(-1) 表示全部)。
    • resetPQ

      public final void resetPQ(int level)
      重設本地圖(組隊任務用),並將怪物與生成點等級調整為指定值。

      resetFully(),再對所有怪物 changeLevel,最後 resetSpawnLevel(int)

      Parameters:
      level - 目標等級
    • resetSpawnLevel

      public final void resetSpawnLevel(int level)
      將本地圖所有 SpawnPoint 型生成點的怪物等級設為指定值。
      Parameters:
      level - 目標等級
    • resetFully

      public final void resetFully()
      完整重設本地圖並重新生成怪物。等同 resetFully(true)
    • resetFully

      public final void resetFully(boolean respawn)
      完整重設本地圖狀態,並可選擇是否立即重生怪物。

      副作用:依序殺光怪物、重載反應爐、清除掉落物、重設 NPC 與生成點、清除斷線標記、結束競速、 取消遠征排程、重設傳送點並清空環境設定;respawntrue 時最後強制重生怪物。

      Parameters:
      respawn - 重設後是否立即重生怪物
    • cancelSquadSchedule

      public final void cancelSquadSchedule(boolean interrupt)
      取消本地圖的遠征隊伍(squad)排程。

      清除 squadTimer 旗標、設定 checkStatestrue,並取消既有的排程任務(若有)。

      Parameters:
      interrupt - 是否中斷正在執行中的排程任務
    • removeDrops

      public final void removeDrops()
      清除本地圖所有掉落物。

      getAllItemsThreadsafe() 快照中的每個掉落物呼叫 expire(this)

    • resetAllSpawnPoint

      public final void resetAllSpawnPoint(int mobid, int mobTime)
      重設本地圖所有生成點為指定怪物與重生間隔。委派至 MapleMonsterSpawnManager.resetAllSpawnPoint(int, int)
      Parameters:
      mobid - 怪物 id
      mobTime - 重生間隔(秒)
    • resetSpawns

      public final void resetSpawns()
      重設本地圖的怪物生成狀態。委派至 MapleMonsterSpawnManager.resetSpawns()
    • makeCarnivalSpawn

      public final boolean makeCarnivalSpawn(int team, MapleMonster newMons, int num)
      為指定隊伍生成怪物迷宮(CPQ)怪物。委派至 MapleMonsterSpawnManager.makeCarnivalSpawn(int, MapleMonster, int)
      Parameters:
      team - 隊伍編號
      newMons - 要生成的怪物
      num - 生成數量
      Returns:
      是否成功生成
    • makeCarnivalReactor

      public final boolean makeCarnivalReactor(int team, int num)
      為指定隊伍生成怪物迷宮(CPQ)反應爐。委派至 MapReactorManager.makeCarnivalReactor(int, int)
      Parameters:
      team - 隊伍編號
      num - 生成數量
      Returns:
      是否成功生成
    • blockAllPortal

      public final void blockAllPortal()
      關閉本地圖所有傳送點,將每個 MaplePortal 的狀態設為不可用。
    • getAndSwitchTeam

      public boolean getAndSwitchTeam()
      依目前在場玩家數的奇偶決定新加入者的分隊。
      Returns:
      在場玩家數為奇數時回傳 true,偶數時回傳 false
    • setSquad

      public void setSquad(MapleSquad.MapleSquadType s)
      設定本地圖所屬的遠征隊/組隊類型。
      Parameters:
      s - 要設定的 MapleSquad.MapleSquadType
    • getChannel

      public int getChannel()
      取得本地圖所在的頻道編號。
      Returns:
      頻道編號
    • getConsumeItemCoolTime

      public int getConsumeItemCoolTime()
      取得本地圖的消耗類道具冷卻時間(毫秒)。
      Returns:
      消耗道具冷卻時間
    • setConsumeItemCoolTime

      public void setConsumeItemCoolTime(int ciit)
      設定本地圖的消耗類道具冷卻時間(毫秒)。
      Parameters:
      ciit - 消耗道具冷卻時間
    • getPermanentWeather

      public int getPermanentWeather()
      取得本地圖的永久天氣特效代碼。
      Returns:
      永久天氣特效代碼
    • setPermanentWeather

      public void setPermanentWeather(int pw)
      設定本地圖的永久天氣特效代碼。
      Parameters:
      pw - 永久天氣特效代碼
    • checkStates

      public void checkStates(String chr)
      當玩家離開本地圖時,檢查並重置與之相關的遠征隊(squad)、事件(EventManager)與極速通關狀態。

      僅在 checkStates 旗標為 true 時作用。若本地圖綁定處於進行中(status 2)的遠征隊, 會將該玩家自隊伍移除;若離開者為隊長則將事件屬性 leader 設為 false; 當地圖已無玩家(size 為 0)或傳入空名稱時,重置事件 state/leader 屬性、 透過 cancelSquadSchedule(boolean) 取消排程並清空隊伍。地圖清空且有極速通關進行中時,呼叫 endSpeedRun()

      Parameters:
      chr - 離開地圖的玩家名稱(空字串代表整批離開)
    • setCheckStates

      public void setCheckStates(boolean b)
      設定是否啟用 checkStates(String) 的離開狀態檢查。
      Parameters:
      b - true 表示啟用
    • getPlatforms

      public final List<MapleNodes.MaplePlatform> getPlatforms()
      取得本地圖的移動平台清單。委派至 nodesMapleNodes.getPlatforms()
      Returns:
      MapleNodes.MaplePlatform 清單
    • getNodes

      取得本地圖的節點集合(用於護衛/移動路徑等)。委派至 nodesMapleNodes.getNodes()
      Returns:
      MapleNodes.MapleNodeInfo 集合
    • setNodes

      public void setNodes(MapleNodes mn)
      設定本地圖的節點資料容器。
      Parameters:
      mn - 要設定的 MapleNodes
    • getNode

      public MapleNodes.MapleNodeInfo getNode(int index)
      取得指定索引的節點資訊。委派至 nodesMapleNodes.getNode(int)
      Parameters:
      index - 節點索引
      Returns:
      對應的 MapleNodes.MapleNodeInfo
    • isLastNode

      public boolean isLastNode(int index)
      判斷指定索引是否為最後一個節點。委派至 nodesMapleNodes.isLastNode(int)
      Parameters:
      index - 節點索引
      Returns:
      為最後一個節點時回傳 true
    • getAreas

      public final List<Rectangle> getAreas()
      取得本地圖定義的區域(矩形範圍)清單。委派至 nodesMapleNodes.getAreas()
      Returns:
      Rectangle 清單
    • getArea

      public final Rectangle getArea(int index)
      取得指定索引的區域矩形範圍。委派至 nodesMapleNodes.getArea(int)
      Parameters:
      index - 區域索引
      Returns:
      對應的 Rectangle
    • changeEnvironment

      public final void changeEnvironment(String ms, int type)
      變更地圖環境物件(如機關)的狀態,並向場上所有玩家廣播環境變更封包。
      Parameters:
      ms - 環境物件名稱
      type - 變更後的狀態類型
    • toggleEnvironment

      public final void toggleEnvironment(String ms)
      切換地圖環境物件的狀態(在 1 與 2 之間切換),尚未記錄者預設切到 1。

      透過 moveEnvironment(String, int) 廣播並更新 environment 對照表。

      Parameters:
      ms - 環境物件名稱
    • moveEnvironment

      public final void moveEnvironment(String ms, int type)
      移動/設定地圖環境物件的狀態,向場上所有玩家廣播後將狀態記入 environment 對照表。
      Parameters:
      ms - 環境物件名稱
      type - 目標狀態類型
    • getEnvironment

      public final Map<String,Integer> getEnvironment()
      取得本地圖環境物件狀態的對照表(名稱對狀態)。
      Returns:
      環境狀態對照 Map
    • getNumPlayersInArea

      public final int getNumPlayersInArea(int index)
      計算指定索引區域內的玩家人數。委派至 getNumPlayersInRect(Rectangle),矩形取自 getArea(int)
      Parameters:
      index - 區域索引
      Returns:
      該區域內的玩家人數
    • getNumPlayersInRect

      public final int getNumPlayersInRect(Rectangle rect)
      計算指定矩形範圍內的玩家人數。

      遍歷在場玩家集合期間持有 charactersLock 讀鎖。

      Parameters:
      rect - 要檢查的矩形範圍
      Returns:
      範圍內的玩家人數
    • getNumPlayersItemsInArea

      public final int getNumPlayersItemsInArea(int index)
      計算指定索引區域內的玩家與掉落物總數。委派至 getNumPlayersItemsInRect(Rectangle),矩形取自 getArea(int)
      Parameters:
      index - 區域索引
      Returns:
      該區域內玩家數與掉落物數的總和
    • getNumPlayersItemsInRect

      public final int getNumPlayersItemsInRect(Rectangle rect)
      計算指定矩形範圍內的玩家與掉落物總數。

      先以 getNumPlayersInRect(Rectangle) 取得玩家數(其內部持有 charactersLock 讀鎖), 再於遍歷 ITEM 類地圖物件期間持有對應的 mapobjectlocks 讀鎖累加掉落物數。

      Parameters:
      rect - 要檢查的矩形範圍
      Returns:
      範圍內玩家數與掉落物數的總和
    • broadcastNONGMMessage

      public void broadcastNONGMMessage(MapleCharacter source, byte[] packet, boolean repeatToSource)
      向場上所有「非 GM」玩家廣播封包。

      repeatToSourcetrue 時連同 source 本身一併送出;為 false 時排除 source。 實際送出於私有多載中進行,期間持有 charactersLock 讀鎖。

      Parameters:
      source - 來源玩家
      packet - 要廣播的封包位元組
      repeatToSource - 是否一併送給來源玩家
    • broadcastGMMessage

      public void broadcastGMMessage(MapleCharacter source, byte[] packet, boolean repeatToSource)
      向場上所有「GM」玩家廣播封包。

      repeatToSourcetrue 時連同 source 本身一併送出;為 false 時僅送給 GM 等級不低於 source 者。 實際送出於私有多載中進行,期間持有 charactersLock 讀鎖。

      Parameters:
      source - 來源玩家
      packet - 要廣播的封包位元組
      repeatToSource - 是否一併送給來源玩家
    • getMobsToSpawn

      public final List<Pair<Integer,Integer>> getMobsToSpawn()
      取得本地圖預定生成的怪物清單(怪物 ID 與相關值的配對)。委派至 nodesMapleNodes.getMobsToSpawn()
      Returns:
      怪物生成設定的 Pair 清單
    • getSkillIds

      public final List<Integer> getSkillIds()
      取得本地圖相關的技能 ID 清單。委派至 nodesMapleNodes.getSkillIds()
      Returns:
      技能 ID 清單
    • canSpawn

      public final boolean canSpawn(long now)
      依時間判斷此刻是否允許怪物生成。委派至 MapleMonsterSpawnManager.canSpawn(long)
      Parameters:
      now - 當前時間戳(毫秒)
      Returns:
      允許生成時回傳 true
    • canHurt

      public final boolean canHurt(long now)
      依扣血間隔判斷此刻是否可對地圖內玩家造成持續傷害(如毒沼地圖),可傷害時同時更新上次傷害時間。
      Parameters:
      now - 當前時間戳(毫秒)
      Returns:
      距上次傷害已達 decHPInterval 時回傳 true,否則 false
    • setDocked

      public void setDocked(boolean isDocked)
      設定本地圖(船類地圖)是否處於停靠狀態。
      Parameters:
      isDocked - true 表示已停靠
    • resetShammos

      public final void resetShammos(MapleClient c)
      重置「夏蘭島逃脫(Shammos)」關卡:清除所有怪物並廣播提示,延遲 500 毫秒後將玩家傳回起點。

      呼叫 killAllMonsters(boolean) 後廣播伺服器訊息,並透過 Timer.EtcTimer 排程: 若玩家仍在線則將其 changeMap 回 0 號傳送點;若場上人數大於 1,另以 MapScriptMethods.startScript_FirstUser(MapleClient, String) 啟動 shammos_Fenter 腳本。延遲是為避免時序競態(dl)。

      Parameters:
      c - 觸發重置的玩家連線
    • getInstanceId

      public int getInstanceId()
      取得本地圖的副本實例 ID。
      Returns:
      副本實例 ID
    • setInstanceId

      public void setInstanceId(int ii)
      設定本地圖的副本實例 ID。
      Parameters:
      ii - 副本實例 ID
    • getPartyBonusRate

      public int getPartyBonusRate()
      取得本地圖的組隊額外加成率。
      Returns:
      組隊加成率
    • setPartyBonusRate

      public void setPartyBonusRate(int ii)
      設定本地圖的組隊額外加成率。
      Parameters:
      ii - 組隊加成率
    • getTop

      public short getTop()
      取得本地圖邊界的上緣座標。
      Returns:
      上緣座標
    • setTop

      public void setTop(int ii)
      設定本地圖邊界的上緣座標。
      Parameters:
      ii - 上緣座標(截斷為 short
    • getBottom

      public short getBottom()
      取得本地圖邊界的下緣座標。
      Returns:
      下緣座標
    • setBottom

      public void setBottom(int ii)
      設定本地圖邊界的下緣座標。
      Parameters:
      ii - 下緣座標(截斷為 short
    • getLeft

      public short getLeft()
      取得本地圖邊界的左緣座標。
      Returns:
      左緣座標
    • setLeft

      public void setLeft(int ii)
      設定本地圖邊界的左緣座標。
      Parameters:
      ii - 左緣座標(截斷為 short
    • getRight

      public short getRight()
      取得本地圖邊界的右緣座標。
      Returns:
      右緣座標
    • setRight

      public void setRight(int ii)
      設定本地圖邊界的右緣座標。
      Parameters:
      ii - 右緣座標(截斷為 short
    • setChangeableMobOrigin

      public final void setChangeableMobOrigin(MapleCharacter d)
      以弱參照記錄觸發怪物變更(如變身機關)的來源玩家。
      Parameters:
      d - 來源玩家
    • getChangeableMobOrigin

      public final MapleCharacter getChangeableMobOrigin()
      取得觸發怪物變更的來源玩家。
      Returns:
      來源玩家;若從未設定或弱參照已被回收則回傳 null
    • getGuardians

      public List<Pair<Point,Integer>> getGuardians()
      取得本地圖的守護獸生成設定(位置與類型的配對)。委派至 nodesMapleNodes.getGuardians()
      Returns:
      守護獸設定的 Pair 清單
    • getDirectionInfo

      public MapleNodes.DirectionInfo getDirectionInfo(int i)
      取得指定索引的方向資訊(用於路徑/移動)。委派至 nodesMapleNodes.getDirection(int)
      Parameters:
      i - 方向索引
      Returns:
      對應的 MapleNodes.DirectionInfo
    • spawnKite

      public void spawnKite(MapleClient c, MapleKite kite)
      在本地圖生成一個風箏(招牌),廣播生成封包,並排程 1 小時後自動移除。

      透過 addMapObject(MapleMapObject) 加入地圖物件後廣播生成封包;以 Timer.EtcTimer 排程一小時後 removeMapObject(MapleMapObject) 並廣播銷毀封包。

      Parameters:
      c - 生成風箏的玩家連線
      kite - 要生成的 MapleKite
    • addMaxMobInMap

      public void addMaxMobInMap()
      將本地圖怪物補滿至上限。委派至 MapleMonsterSpawnManager.addMaxMobInMap()
    • resetAriantPQ

      public final void resetAriantPQ(int level)
      重置「阿里安鬥技場(Ariant PQ)」並依等級重設怪物。

      依序清除所有怪物、重載反應爐、移除掉落物、重置 NPC/生成點/斷線玩家、結束極速通關、取消遠征隊排程、 重置傳送點、清空環境狀態並重新生成;最後將場上每隻怪物與生成設定的等級調整為 level。 此方法會引發大量地圖狀態變更與封包廣播。

      Parameters:
      level - 重設後的怪物等級