Class MapleMap

java.lang.Object
server.maps.MapleMap

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

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

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

  • Constructor Details

  • Method Details

    • getChannelServer

      public final ChannelServer getChannelServer()
      取得本地圖所屬的頻道伺服器。
      Returns:
      對應 channel 的 ChannelServer 實例
    • 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:
      怪物清單
    • getAllMonsters

      public List<MapleMonster> getAllMonsters()
      取得地圖上所有怪物的清單(getAllMonstersThreadsafe() 的別名)。
      Returns:
      怪物清單
    • getMonsters

      public List<MapleMonster> getMonsters()
      取得地圖上所有怪物的清單(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 - 參考座標(會落至其下方地面)
    • spawnReactor

      public final void spawnReactor(MapleReactor mob, Point pos)
      於指定座標生成一個自訂反應爐(行為同 spawnReactorOnGroundBelow(MapleReactor, Point))。

      委派至 MapReactorManager.spawnReactor(MapleReactor, Point)。

      Parameters:
      mob - 要生成的反應爐
      pos - 生成座標
    • spawnReactor

      public final void spawnReactor(int reactor_id, Point pos)
      依反應爐 ID 與座標生成一個自訂反應爐。

      委派至 MapReactorManager.spawnReactor(int, Point)。

      Parameters:
      reactor_id - 反應爐 WZ ID
      pos - 生成座標
    • spawnReactor

      public final void spawnReactor(int reactor_id, int x, int y)
      依反應爐 ID 與 XY 座標生成一個自訂反應爐。

      委派至 MapReactorManager.spawnReactor(int, int, int)。

      Parameters:
      reactor_id - 反應爐 WZ ID
      x - X 座標
      y - Y 座標
    • 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 時僅進行中玩家可見)
    • spawnExclusiveMobDrop

      public final void spawnExclusiveMobDrop(Item idrop, Point dropPos, MapleMonster mob, MapleCharacter chr, byte droptype, int questid)
      生成一筆「獨立掉寶」道具於地圖上——僅指定玩家可見、可撿取(連同隊玩家都看不到也撿不到)。

      結構與 spawnMobDrop(Item, Point, MapleMonster, MapleCharacter, byte, int) 相同,但會將掉落物標記為專屬於 chr (MapleMapItem.setExclusiveOwner(int))。可見性由統一判斷 MapleMapItem.canBeSeenBy(MapleCharacter) 把關:生成瞬間(此處的 MapleMap.DelayedPacketCreation)與玩家離開地圖後於 120 秒存活期內重新進入 (sendObjectPlacement → MapleMapItem.sendSpawnData(MapleClient))兩條路徑, 都只有 chr 收得到顯示封包;撿取端 (Pickup_Player/Pickup_Pet/寵物自動撿取/GM 吸物)則以 MapleMapItem.isExclusiveBlockedFor(MapleCharacter) 擋下任何非擁有者。

      與 spawnMobDrop 的差異:刻意不註冊 FFA(不開放他人自由拾取)、 也不觸發道具反應爐(activateItemReactors)——獨立掉寶屬個人獎勵, 不參與地圖共用反應爐機制;仍註冊 120 秒到期(離開地圖於期限內回來仍看得到)。

      本方法僅處理「道具」掉落;楓幣(meso)目前無對應的獨立掉寶方法。

      Parameters:
      idrop - 掉落的道具
      dropPos - 落點座標
      mob - 掉落來源怪物(決定起始座標)
      chr - 專屬擁有者(唯一可見、可撿取者)
      droptype - 掉落歸屬類型(傳入 MapleMapItem 作為 type;專屬限制由 exclusiveOwner 強制,與此參數無關)
      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), jukebox 帶 false。
      Parameters:
      msg - 效果訊息文字
      itemId - 效果對應的道具 ID
    • startMapEffect

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

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

      結束時除廣播原效果的結束封包外,另呼叫 removeMapEffect() 以空白特效 覆蓋客戶端可能殘留的跑馬燈,並於再過 3 秒後解除互斥鎖,讓玩家能再次使用訊息道具。

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

      public final void removeMapEffect()
      以空白地圖特效覆蓋並清除客戶端可能殘留的跑馬燈,再於 3 秒後解除互斥鎖。

      建立一個空白(msg=""、itemId=0)的 MapleMapEffect 設為目前 效果並廣播其開始封包——藉由送出新的有效特效「取代」舊橫幅,以解決部分客戶端對結束 封包不會清除既有橫幅的問題;3 秒後廣播其結束封包,並在目前效果仍為此空白特效時清為 null。期間 mapEffect 維持非 null 以延續互斥(故 3 秒內無法啟動 新效果)。通常由 startMapEffect(String, int, boolean) 於效果結束時自動呼叫。

    • 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), jukebox 帶 true(持續 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(),無隊時直接返回。依地圖判定模式 (混沌炎魔/炎魔/龍王/混沌龍王),廣播對應神殿封包;spawned 為 true(王已現身)時另廣播 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 對映到事件名稱(如 ZakumBattle、HorntailBattle 等), 再向本頻道的事件腳本管理器取得對應 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); repeatToSource 為 true 時來源帶 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)
    • dropMessage

      public void dropMessage(int type, String message)
      以指定類型向「本地圖內的全部玩家」廣播一則訊息封包。

      對應 MapleCharacter.dropMessage(int, String) 的地圖版本:同樣依 type 選擇訊息通道,但改以 broadcastMessage(byte[]) 送給地圖內所有玩家,而非單一角色。 負值對應特殊顯示通道:-1 畫面上方訊息、-2 商店聊天、-3/-4 一般聊天框(顯示/隱藏;地圖廣播無單一 來源角色,故以角色 id 0、非 GM 送出)、-5/-6 系統公告(粉紅/白底)、-7/-8 畫面中央訊息; 其餘(正值)則作為 CWvsContext.serverNotice(int, String) 的訊息類型。

      Parameters:
      type - 訊息類型;負值對應上述特殊通道,其餘透過 CWvsContext.serverNotice(int, String) 送出
      message - 要顯示的訊息文字
    • changeMusic

      public final void changeMusic(String music)
    • showEffect

      public final void showEffect(String effect)
    • playSound

      public final void playSound(String sound)
    • 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:
      範圍內的掉落物件清單(可能為空)
    • getItemCount

      public final int getItemCount()
      取得本地圖上「掉落道具」物件的數量。

      於 MapleMapObjectType.ITEM 讀鎖下回傳容器大小(O(1)),成本遠低於 getMapObjectsInRange(Point, double)。供寵物自動撿取(PetLootProcessor) 判斷地面道具是否多到需要把掃描改以執行緒池非同步處理。

      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:
      本地圖玩家的複本清單(可能為空)
    • getAllCharacters

      public final List<MapleCharacter> getAllCharacters()
      取得本地圖玩家的快照清單(getCharactersThreadsafe() 的別名)。
      Returns:
      本地圖玩家的複本清單(可能為空)
    • getAllPlayers

      public final List<MapleCharacter> getAllPlayers()
      取得本地圖玩家的快照清單(getCharactersThreadsafe() 的別名)。
      Returns:
      本地圖玩家的複本清單(可能為空)
    • getPlayers

      public final List<MapleCharacter> getPlayers()
      取得本地圖玩家的快照清單(getCharactersThreadsafe() 的別名)。
      Returns:
      本地圖玩家的複本清單(可能為空)
    • getAllPlayersThreadsafe

      public final List<MapleCharacter> getAllPlayersThreadsafe()
      取得本地圖玩家的快照清單(getCharacters() 的別名)。
      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) 重新指派控制者。chr 為 null 或為分身時直接略過。

      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:
      真實玩家數量
    • getPlayerSize

      public final int getPlayerSize()
    • getPlayerCount

      public final int getPlayerCount()
    • 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 與生成點、清除斷線標記、結束競速、 取消遠征排程、重設傳送點並清空環境設定;respawn 為 true 時最後強制重生怪物。

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

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

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

      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 - 消耗道具冷卻時間
    • isBanDropMeso

      public final boolean isBanDropMeso()
      取得本地圖是否禁止玩家丟出楓幣(地圖效果)。
      Returns:
      禁止時傳回 true
    • setBanDropMeso

      public final void setBanDropMeso(boolean ban)
      設定本地圖是否禁止玩家丟出楓幣(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • isBanDropItem

      public final boolean isBanDropItem()
      取得本地圖是否禁止玩家丟出道具(地圖效果)。
      Returns:
      禁止時傳回 true
    • setBanDropItem

      public final void setBanDropItem(boolean ban)
      設定本地圖是否禁止玩家丟出道具(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • isBanPet

      public final boolean isBanPet()
      取得本地圖是否禁止使用寵物(地圖效果)。玩家進場時會自動收回已召喚寵物(不卸下其穿戴)。
      Returns:
      禁止時傳回 true
    • setBanPet

      public final void setBanPet(boolean ban)
      設定本地圖是否禁止使用寵物(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • isBanChair

      public final boolean isBanChair()
      取得本地圖是否禁止使用椅子(地圖效果)。
      Returns:
      禁止時傳回 true
    • setBanChair

      public final void setBanChair(boolean ban)
      設定本地圖是否禁止使用椅子(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • isBanSpeak

      public final boolean isBanSpeak()
      取得本地圖是否禁止說話(地圖效果,僅地圖內對話泡泡)。
      Returns:
      禁止時傳回 true
    • setBanSpeak

      public final void setBanSpeak(boolean ban)
      設定本地圖是否禁止說話(地圖效果,僅地圖內對話泡泡)。
      Parameters:
      ban - true 表示禁止
    • isBanPickup

      public final boolean isBanPickup()
      取得本地圖是否禁止撿取道具(地圖效果,含人物與寵物代撿)。
      Returns:
      禁止時傳回 true
    • setBanPickup

      public final void setBanPickup(boolean ban)
      設定本地圖是否禁止撿取道具(地圖效果,含人物與寵物代撿)。
      Parameters:
      ban - true 表示禁止
    • isBanUseItem

      public final boolean isBanUseItem()
      取得本地圖是否禁止使用藥水/消耗類道具(地圖效果)。
      Returns:
      禁止時傳回 true
    • setBanUseItem

      public final void setBanUseItem(boolean ban)
      設定本地圖是否禁止使用藥水/消耗類道具(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • isBanWear

      public final boolean isBanWear()
      取得本地圖是否禁止穿戴與脫下裝備(地圖效果)。
      Returns:
      禁止時傳回 true
    • setBanWear

      public final void setBanWear(boolean ban)
      設定本地圖是否禁止穿戴與脫下裝備(地圖效果)。
      Parameters:
      ban - true 表示禁止
    • getItemUseCooldownMillis

      public final int getItemUseCooldownMillis()
      取得本地圖的「使用道具冷卻時間」(毫秒;地圖效果)。

      大於 0 時,玩家於上次使用道具後須間隔此毫秒數方可再次使用;0 代表不限制。 與既有的 getConsumeItemCoolTime()(秒)/MapleCharacter.nextConsume 各自獨立, 上次使用時間記於 MapleCharacter.lastItemUseTime。

      Returns:
      冷卻毫秒數(0 表示不限制)
    • setItemUseCooldownMillis

      public final void setItemUseCooldownMillis(int millis)
      設定本地圖的「使用道具冷卻時間」(毫秒;地圖效果)。
      Parameters:
      millis - 冷卻毫秒數(0 表示不限制)
    • 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()
      取得本地圖的移動平台清單。委派至 nodes 的 MapleNodes.getPlatforms()。
      Returns:
      MapleNodes.MaplePlatform 清單
    • getNodes

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

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

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

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

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

      public final Rectangle getArea(int index)
      取得指定索引的區域矩形範圍。委派至 nodes 的 MapleNodes.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」玩家廣播封包。

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

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

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

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

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

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

      public final List<Integer> getSkillIds()
      取得本地圖相關的技能 ID 清單。委派至 nodes 的 MapleNodes.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()
      取得本地圖的守護獸生成設定(位置與類型的配對)。委派至 nodes 的 MapleNodes.getGuardians()。
      Returns:
      守護獸設定的 Pair 清單
    • getDirectionInfo

      public MapleNodes.DirectionInfo getDirectionInfo(int i)
      取得指定索引的方向資訊(用於路徑/移動)。委派至 nodes 的 MapleNodes.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 - 重設後的怪物等級