Class MapleMap
本類別以依 MapleMapObjectType 分群、各自加鎖的 mapobjects 容器,管理 NPC、怪物(MapleMonster)、
掉落物、傳送點(MaplePortal)、召喚物、門與反應爐等地圖物件,並維護在場玩家集合 characters;
由 MapleMapFactory 建立與快取,是怪物生成、掉落、傳送與廣播等遊戲玩法的舞台。為控制其規模,
P5 重構已將數個子系統抽成同 package 的協作者,本類別保留簽名相同的一行委派:
MapReactorManager(反應爐)、MapleMonsterSpawnManager(怪物生成)、MapleMonsterKillManager(怪物擊殺與掉落表)。
地圖與在場玩家透過 MapleCharacter、ChannelServer 及 World 協作,
並被 handling.channel.handler.* 處理器與 scripts/ 腳本大量取用。
-
Constructor Summary
ConstructorsConstructorDescriptionMapleMap(int mapid, int channel, int returnMapId, float monsterRate) 建立一張地圖,並初始化各型別的地圖物件容器與其讀寫鎖。 -
Method Summary
Modifier and TypeMethodDescriptionfinal voidaddAreaMonsterSpawn(MapleMonster monster, Point pos1, Point pos2, Point pos3, int mobTime, String msg, boolean shouldSpawn) 新增一個區域型怪物生成點(怪物會在三個座標間移動生成)。voidaddDisconnected(int id) 將指定玩家 id 標記為在本地圖斷線。final voidaddMapObject(MapleMapObject mapobject) 將地圖物件加入本地圖(不通知任何玩家)。void將本地圖怪物補滿至上限。final SpawnPointaddMonsterSpawn(MapleMonster monster, int mobTime, byte carnivalTeam, String msg) 新增一個怪物生成點。final SpawnPointaddMonsterSpawn(MapleMonster monster, int mobTime, byte carnivalTeam, String msg, boolean spawn) 新增一個怪物生成點,並可指定是否立即生成。final voidaddPlayer(MapleCharacter chr) 將玩家加入本地圖,完成進場所需的全部初始化與封包同步。final voidaddPortal(MaplePortal myPortal) 將傳送點加入本地圖,以其 id 為索引。final boolean取得本地圖是否允許開設個人商店/雇傭商人。final void關閉本地圖所有傳送點,將每個MaplePortal的狀態設為不可用。voidbroadcastGMMessage(MapleCharacter source, byte[] packet, boolean repeatToSource) 向場上所有「GM」玩家廣播封包。final voidbroadcastMessage(byte[] packet) 對地圖內所有玩家廣播封包(無範圍限制)。final voidbroadcastMessage(byte[] packet, Point rangedFrom) 對指定座標視野範圍內的所有玩家廣播封包。final voidbroadcastMessage(MapleCharacter source, byte[] packet, boolean repeatToSource) 對地圖內玩家廣播封包(無範圍限制),可選擇是否同時送回來源玩家。voidbroadcastMessage(MapleCharacter source, byte[] packet, double rangeSq, Point rangedFrom) 廣播的核心實作:在charactersLock讀鎖保護下對符合條件的玩家送出封包。final voidbroadcastMessage(MapleCharacter source, byte[] packet, Point rangedFrom) 對指定座標視野範圍內的玩家廣播封包,排除來源玩家。voidbroadcastNONGMMessage(MapleCharacter source, byte[] packet, boolean repeatToSource) 向場上所有「非 GM」玩家廣播封包。final PointcalcDropPos(Point initial, Point fallback) 計算掉落物應落下的地面座標。final PointcalcPointBelow(Point initial) 計算initial正下方落在地面(足板)上的座標。final voidcancelSquadSchedule(boolean interrupt) 取消本地圖的遠征隊伍(squad)排程。final booleancanHurt(long now) 依扣血間隔判斷此刻是否可對地圖內玩家造成持續傷害(如毒沼地圖),可傷害時同時更新上次傷害時間。final booleancanSoar()取得本地圖是否允許飛行(御劍/滑翔)。final booleancanSpawn(long now) 依時間判斷此刻是否允許怪物生成。final voidchangeEnvironment(String ms, int type) 變更地圖環境物件(如機關)的狀態,並向場上所有玩家廣播環境變更封包。int取得本地圖玩家集合的原始大小(含分身,未加鎖)。voidcheckStates(String chr) 當玩家離開本地圖時,檢查並重置與之相關的遠征隊(squad)、事件(EventManager)與極速通關狀態。final booleancontainsNPC(int npcid) 判斷地圖上是否存在指定 ID 的 NPC。intcountMonsterById(int id) 統計地圖上指定 ID 的怪物數量。final voiddestroyReactor(int oid) 依物件 ID 銷毀指定反應爐。final voiddestroyReactors(int first, int last) 銷毀 ID 介於指定範圍內的所有反應爐。final voiddisappearingItemDrop(MapleMapObject dropper, MapleCharacter owner, Item item, Point pos) 產生一個立即消失的掉落物動畫(不會真正落在地上供拾取)。final void中斷本地圖所有非 GM 玩家的連線。voiddoShrine(boolean spawned) 處理王怪神殿(蠟燭/號角等)的進場顯示與限時排程,逾時則強制將全地圖玩家送出。void結束競速計時,清除起始時間與隊長名稱。findClosestPortal(Point from) 取得距離指定座標最近的傳送點(不限型別)。findClosestSpawnpoint(Point from) 取得距離指定座標最近的重生點。取得地圖上所有傳送門(玩家門)物件的清單。以執行緒安全方式取得地圖上所有MapleDoor(玩家傳送門)的清單。以執行緒安全方式取得地圖上所有雇用商人的清單。取得地圖上所有掉落物的快照清單。在 ITEM 型別讀鎖保護下,取得地圖上所有掉落物的快照清單。以執行緒安全方式取得地圖上所有MechDoor(機械門)的清單。取得地圖上所有雇用商人的清單。在 MIST 型別讀鎖保護下,取得地圖上所有煙霧的快照清單。取得地圖上所有怪物的清單。以執行緒安全方式取得地圖上所有怪物的清單。取得本地圖所有 NPC 的快照清單。取得本地圖所有 NPC 的執行緒安全快照清單。取得地圖上所有反應爐的清單。以執行緒安全方式取得地圖上所有反應爐的清單。以執行緒安全方式取得地圖上所有召喚獸的清單。取得地圖上出現的所有不重複怪物 ID 清單。boolean依目前在場玩家數的奇偶決定新加入者的分隊。final RectanglegetArea(int index) 取得指定索引的區域矩形範圍。getAreas()取得本地圖定義的區域(矩形範圍)清單。short取得本地圖邊界的下緣座標。final MapleCharacter取得觸發怪物變更的來源玩家。int取得本地圖所在的頻道編號。final ChannelServer取得本地圖所屬的頻道伺服器。final MapleCharactergetCharacterById(int id) 依玩家 id 取得本地圖中的玩家。final MapleCharactergetCharacterById_InMap(int id) 依玩家 id 取得本地圖中的玩家。final MapleCharacter依名稱(不分大小寫)取得本地圖中的玩家。final List<MapleCharacter> 取得本地圖玩家的快照清單。final List<MapleCharacter> 取得邊界與指定矩形相交的所有玩家。final int取得本地圖中非分身的真實玩家數量。final List<MapleCharacter> 取得本地圖玩家的執行緒安全快照清單。int取得本地圖的消耗類道具冷卻時間(毫秒)。final int取得本地圖中第一位有隊伍的玩家所屬的隊伍編號。getDirectionInfo(int i) 取得指定索引的方向資訊(用於路徑/移動)。final EventManager依本地圖的地圖 ID 解析其對應的事件管理器(EventManager)。取得本地圖環境物件狀態的對照表(名稱對狀態)。final boolean取得本地圖的掉落物是否永不消失(everlast)。int取得地圖上採集器(EXTRACTOR 型別物件)的數量。final MonsterFamiliargetFamiliarByOid(int oid) 依物件 ID 取得地圖上的怪物夥伴(familiar)。final int取得本地圖的場地限制旗標(fieldLimit,位元遮罩控制傳送/召喚等行為)。final String取得「首位玩家進入」時觸發的腳本名稱。final MapleFootholdTree取得本地圖的踏板(foothold)樹。final int取得強制返回地圖編號。final MapleMap取得強制返回地圖物件(由地圖工廠依forcedReturnMap解析)。final int取得強制移動所需的等級門檻。取得本地圖的守護獸生成設定(位置與類型的配對)。final intgetHPDec()取得本地圖每次扣血的 HP 量。final int取得本地圖扣血的間隔時間。final int取得可免除本地圖扣血的保護道具編號。final intgetId()取得本地圖編號。int取得本地圖的副本實例 ID。getItemsInRange(Point from, double rangeSq) 取得指定座標一定距離平方範圍內的掉落物件。int取得地圖上掉落物(ITEM 型別物件)的數量。shortgetLeft()取得本地圖邊界的左緣座標。final int取得進入本地圖的等級上限/限制。final String取得地圖名稱。final MapleMapObjectgetMapObject(int oid, MapleMapObjectType type) 依物件 ID 與型別取得地圖物件。final List<MapleMapObject> getMapObjectsInRange(Point from, double rangeSq) 取得指定座標一定距離平方範圍內的所有地圖物件。final List<MapleMapObject> getMapObjectsInRange(Point from, double rangeSq, List<MapleMapObjectType> MapObject_types) 取得指定座標一定距離平方範圍內、且屬於指定型別的地圖物件。final List<MapleMapObject> getMapObjectsInRect(Rectangle box, List<MapleMapObjectType> MapObject_types) 取得位於指定矩形範圍內、且屬於指定型別的地圖物件。final int取得本地圖地圖物件的概略總數(排除分身後的玩家計入)。int取得地圖上怪物(MONSTER 型別物件)的數量。取得本地圖預定生成的怪物清單(怪物 ID 與相關值的配對)。getMonsterById(int id) 依怪物 ID 取得地圖上第一個符合的怪物。final MapleMonstergetMonsterByOid(int oid) returns a monster with the given oid, if no such monster exists returns nullgetNode(int index) 取得指定索引的節點資訊。getNodes()取得本地圖的節點集合(用於護衛/移動路徑等)。getNPCById(int id) 依 NPC ID 取得地圖上第一個符合的 NPC。final MapleNPCgetNPCByOid(int oid) 依物件 ID 取得地圖上的 NPC。int在 ITEM 型別讀鎖保護下,取得地圖上掉落物的數量。int在 MONSTER 型別讀鎖保護下,取得地圖上怪物的數量。final intgetNumPlayersInArea(int index) 計算指定索引區域內的玩家人數。final intgetNumPlayersInRect(Rectangle rect) 計算指定矩形範圍內的玩家人數。final intgetNumPlayersItemsInArea(int index) 計算指定索引區域內的玩家與掉落物總數。final int計算指定矩形範圍內的玩家與掉落物總數。final int取得本地圖的怪物生成點數量。int取得本地圖的組隊額外加成率。int取得本地圖的永久天氣特效代碼。final List<MapleNodes.MaplePlatform> 取得本地圖的移動平台清單。final List<MapleCharacter> getPlayersInRectAndInList(Rectangle box, List<MapleCharacter> chrList) 取得同時位於指定矩形範圍內、且存在於指定玩家清單中的玩家。getPointOfItem(int itemid) 在 ITEM 型別讀鎖保護下,尋找場上指定道具 ID 的掉落物座標。final MaplePortalgetPortal(int portalid) 依 id 取得傳送點。final MaplePortal依名稱取得傳送點。取得本地圖所有傳送點的唯讀檢視。final List<MaplePortal> getPortalsInRange(Point from, double rangeSq) 取得指定座標一定距離平方範圍內的傳送點清單。voidgetRankAndAdd(String leader, String time, ExpeditionType type, long timz, Collection<String> squad) 將一筆競速紀錄寫入資料庫並更新對應遠征型別的競速排行。getReactorById(int id) 依反應爐 ID 取得地圖上對應的反應爐。final MapleReactorgetReactorByName(String name) 依名稱取得地圖上的反應爐。final MapleReactorgetReactorByOid(int oid) 依物件 ID 取得地圖上的反應爐。final float取得本地圖的 HP/MP 恢復倍率。final MapleMap取得返回地圖物件(由地圖工廠依returnMapId解析)。final int取得返回地圖編號。shortgetRight()取得本地圖邊界的右緣座標。取得本地圖相關的技能 ID 清單。依本地圖玩家分布判定雪球賽(snowball)的起始傳送點。int取得本地圖目前已生成的怪物計數。final boolean取得本地圖是否允許怪物刷新。long取得本地圖競速的起始時間戳。final MapleSquad取得本地圖已設定之squad型別所對應的遠征隊。final MapleSquad依本地圖的地圖 ID 解析其對應的遠征隊並回傳。final String取得地圖所屬的街道名稱。shortgetTop()取得本地圖邊界的上緣座標。final String取得「玩家進入」時觸發的腳本名稱。final booleanhasClock()取得本地圖是否設有時鐘。final voidhideNpc(int npcid) 隱藏地圖上的 NPC(僅送出移除封包,不從地圖物件集合刪除)。booleanisDisconnected(int id) 查詢指定玩家 id 是否已標記為在本地圖斷線。booleanisLastNode(int index) 判斷指定索引是否為最後一個節點。final booleanisTown()取得本地圖是否為城鎮。final voidkillAllMonsters(boolean animate) 擊殺地圖上所有怪物。final voidkillMonster(int monsId) 依怪物 ID 擊殺地圖上對應的怪物。voidkillMonster(MapleMonster monster) 擊殺指定怪物(適用於設有removeAfter的怪物)。final voidkillMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation) 由指定玩家擊殺怪物。final voidkillMonster(MapleMonster monster, MapleCharacter chr, boolean withDrops, boolean second, byte animation, int lastSkill) 由指定玩家擊殺怪物,並記錄最後造成擊殺的技能。final voidlimitReactor(int rid, int num) 限制指定反應爐 ID 在地圖上的數量。final voidloadMonsterRate(boolean first) 載入並套用本地圖的怪物生成倍率。final booleanmakeCarnivalReactor(int team, int num) 為指定隊伍生成怪物迷宮(CPQ)反應爐。final booleanmakeCarnivalSpawn(int team, MapleMonster newMons, int num) 為指定隊伍生成怪物迷宮(CPQ)怪物。final intmobCount()計算地圖上的怪物數量。final voidmoveEnvironment(String ms, int type) 移動/設定地圖環境物件的狀態,向場上所有玩家廣播後將狀態記入environment對照表。voidmoveMonster(MapleMonster monster, Point reportedPos) 更新怪物座標,並對本地圖所有玩家刷新該怪物的可見性。voidmovePlayer(MapleCharacter player, Point newPosition) 更新玩家座標,並重新計算其周遭地圖物件的可見集合。final void重新載入地圖上的反應爐。final void清除本地圖所有掉落物。final void將地圖物件自本地圖移除。voidremoveMonster(MapleMonster monster) 自本地圖移除指定怪物。final voidremoveNpc(int npcid) 移除地圖上的自訂 NPC。final void將玩家自本地圖移除,並清理其相關地圖物件與廣播離場。final voidresetAllSpawnPoint(int mobid, int mobTime) 重設本地圖所有生成點為指定怪物與重生間隔。final voidresetAriantPQ(int level) 重置「阿里安鬥技場(Ariant PQ)」並依等級重設怪物。void清除本地圖所有斷線標記。final void完整重設本地圖並重新生成怪物。final voidresetFully(boolean respawn) 完整重設本地圖狀態,並可選擇是否立即重生怪物。final void移除本地圖所有 NPC(以removeNpc(-1)表示全部)。final void重設本地圖所有傳送點為開啟狀態。final voidresetPQ(int level) 重設本地圖(組隊任務用),並將怪物與生成點等級調整為指定值。final void重設地圖上所有反應爐的狀態。final void重置「夏蘭島逃脫(Shammos)」關卡:清除所有怪物並廣播提示,延遲 500 毫秒後將玩家傳回起點。final voidresetSpawnLevel(int level) 將本地圖所有SpawnPoint型生成點的怪物等級設為指定值。final void重設本地圖的怪物生成狀態。voidrespawn(boolean force) 觸發本地圖怪物重生。voidrespawn(boolean force, long now) 以指定時間戳觸發本地圖怪物重生。final void將永久地圖(everlast)上屬於指定玩家的掉落物全數返還給該玩家。voidsetBottom(int ii) 設定本地圖邊界的下緣座標。final void以弱參照記錄觸發怪物變更(如變身機關)的來源玩家。voidsetCheckStates(boolean b) 設定是否啟用checkStates(String)的離開狀態檢查。final voidsetClock(boolean hasClock) 設定本地圖是否設有時鐘。voidsetConsumeItemCoolTime(int ciit) 設定本地圖的消耗類道具冷卻時間(毫秒)。final voidsetCreateMobInterval(short createMobInterval) 設定怪物產生的間隔時間。voidsetDocked(boolean isDocked) 設定本地圖(船類地圖)是否處於停靠狀態。final voidsetDrops(boolean b) 設定本地圖是否停用掉落。final voidsetEverlast(boolean everlast) 設定本地圖的掉落物是否永不消失(everlast)。final voidsetFieldLimit(int fieldLimit) 設定本地圖的場地限制旗標。final voidsetFirstUserEnter(String onFirstUserEnter) 設定「首位玩家進入」時觸發的腳本名稱。final voidsetFixedMob(int fm) 設定本地圖的固定怪物數量。final voidsetFootholds(MapleFootholdTree footholds) 設定本地圖的踏板(foothold)樹。final voidsetForcedReturnMap(int map) 設定強制返回地圖編號。final voidsetForceMove(int fm) 設定強制移動所需的等級門檻。final voidsetHPDec(int delta) 設定本地圖每次扣血的 HP 量。final voidsetHPDecInterval(int delta) 設定本地圖扣血的間隔時間。final voidsetHPDecProtect(int delta) 設定可免除本地圖扣血的保護道具編號。voidsetInstanceId(int ii) 設定本地圖的副本實例 ID。voidsetLeft(int ii) 設定本地圖邊界的左緣座標。final voidsetLevelLimit(int fm) 設定進入本地圖的等級上限/限制。final voidsetMapName(String mapName) 設定地圖名稱。voidsetNodes(MapleNodes mn) 設定本地圖的節點資料容器。voidsetPartyBonusRate(int ii) 設定本地圖的組隊額外加成率。voidsetPermanentWeather(int pw) 設定本地圖的永久天氣特效代碼。final voidsetPersonalShop(boolean personalShop) 設定本地圖是否允許開設個人商店/雇傭商人。final voidsetReactorDelay(int state) 設定地圖上反應爐的重生延遲。final void將地圖上所有反應爐設為預設狀態。final voidsetReactorState(byte state) 將地圖上所有反應爐設為指定狀態。final voidsetRecoveryRate(float recoveryRate) 設定本地圖的 HP/MP 恢復倍率。final voidsetReturnMapId(int rmi) 設定返回地圖編號。voidsetRight(int ii) 設定本地圖邊界的右緣座標。final voidsetSoaring(boolean b) 設定本地圖是否允許飛行(御劍/滑翔)。final voidsetSpawns(boolean fm) 設定本地圖是否允許怪物刷新。void設定本地圖所屬的遠征隊/組隊類型。final voidsetStreetName(String streetName) 設定地圖所屬的街道名稱。final voidsetTimeLimit(int timeLimit) 設定本地圖的停留時間限制。voidsetTop(int ii) 設定本地圖邊界的上緣座標。final voidsetTown(boolean town) 設定本地圖是否為城鎮。final voidsetUserEnter(String onUserEnter) 設定「玩家進入」時觸發的腳本名稱。final void隨機重新排列地圖上所有反應爐的位置。final voidshuffleReactors(int first, int last) 隨機重新排列 ID 介於指定範圍內反應爐的位置。final voidspawnAutoDrop(int itemid, Point pos) 於指定座標自動生成一個無主掉落物並對全地圖廣播。final voidspawnChaosZakum(int x, int y) 於指定座標生成混沌炎魔(Chaos Zakum)。組出本地圖怪物生成相關狀態的除錯字串。final void將玩家傳送門(MapleDoor)生成於地圖上。final void將採集器生成於地圖上,並對視野範圍內玩家送出其生成資料。final voidspawnFakeMonster(MapleMonster monster) 生成假怪物(不可攻擊的展示用怪物)。final voidspawnFakeMonsterOnGroundBelow(MapleMonster mob, Point pos) 將假怪物(不可攻擊的展示用怪物)生成於指定座標正下方地面。final voidspawnFamiliar(MonsterFamiliar familiar) 將怪物夥伴生成於地圖上,並對視野範圍內玩家送出生成封包。final voidspawnItemDrop(MapleMapObject dropper, MapleCharacter owner, Item item, Point pos, boolean ffaDrop, boolean playerDrop) 生成一個道具掉落物於地圖上並對全地圖廣播,依設定觸發反應爐。voidspawnKite(MapleClient c, MapleKite kite) 在本地圖生成一個風箏(招牌),廣播生成封包,並排程 1 小時後自動移除。final voidspawnMechDoor(MechDoor door) 將機械門(MechDoor,機械師技能產生的門)生成於地圖上。final voidspawnMesoDrop(int meso, Point position, MapleMapObject dropper, MapleCharacter owner, boolean playerDrop, byte droptype) 生成一筆楓幣掉落物於地圖上(落點會經地形修正)。final void將煙霧(毒霧/補血霧等)生成於地圖上並依類型排定週期效果與到期清除。final voidspawnMobDrop(Item idrop, Point dropPos, MapleMonster mob, MapleCharacter chr, byte droptype, int questid) 生成一筆由怪物掉落的道具於地圖上,並觸發道具反應爐檢查。final voidspawnMobMesoDrop(int meso, Point position, MapleMapObject dropper, MapleCharacter owner, boolean playerDrop, byte droptype) 生成一筆由怪物掉落的楓幣於地圖上(落點不另作地形修正,沿用傳入座標)。final voidspawnMonster(MapleMonster monster, int spawnType) 生成怪物並以指定生成型別播放出場效果。final voidspawnMonster(MapleMonster monster, int spawnType, boolean overwrite) 生成怪物並以指定生成型別播放出場效果,可選擇覆寫既有控制狀態。final voidspawnMonster_sSack(MapleMonster mob, Point pos, int spawnType) 於指定座標生成怪物(沙包/指定生成型別版本)。final voidspawnMonsterOnGroundBelow(MapleMonster mob, Point pos) 將怪物生成於指定座標正下方的地面上。final intspawnMonsterWithEffect(MapleMonster monster, int effect, Point pos) 於指定座標生成怪物並附帶生成特效。final intspawnMonsterWithEffectBelow(MapleMonster mob, Point pos, int effect) 將怪物生成於指定座標正下方地面,並附帶生成特效。final void於指定座標生成一個自訂 NPC 並廣播給全地圖玩家。final voidspawnNpcForPlayer(MapleClient c, int id, Point pos) 於指定座標生成一個自訂 NPC,但僅對單一玩家送出顯示封包。final void於自由市場(地圖910000000、頻道 1)排定一次隨機道具掉落。final voidspawnReactor(MapleReactor reactor) 將反應爐生成於其自身座標。final voidspawnReactorOnGroundBelow(MapleReactor mob, Point pos) 將反應爐生成於指定座標正下方的地面上。final voidspawnRevives(MapleMonster monster, int oid) 生成由另一隻怪物分裂/召喚而來的怪物(revive)。final voidspawnSummon(MapleSummon summon) 將召喚獸生成於地圖上,並對視野範圍內玩家送出召喚封包。final voidspawnZakum(int x, int y) 於指定座標生成炎魔(Zakum)。final voidstartExtendedMapEffect(String msg, int itemId) 啟動延長型地圖效果(橫幅訊息長駐顯示)。final voidstartJukebox(String msg, int itemId) 啟動點唱機效果。final voidstartMapEffect(String msg, int itemId) 顯示一般地圖效果(橫幅訊息)。final voidstartMapEffect(String msg, int itemId, boolean jukebox) 啟動地圖效果(橫幅訊息/點唱機)並排定自動結束。final voidstartSimpleMapEffect(String msg, int itemId) 啟動簡易地圖效果:僅廣播CField.startMapEffect(String, int, boolean)開始橫幅,不排定結束。void以本地圖隊伍隊長為計時者開始競速計時。voidstartSpeedRun(String leader) 開始競速計時,記錄起始時間與指定的隊長名稱。final voidtalkMonster(String msg, int itemId, int objectid) 讓指定怪物說話(顯示對話泡泡)並隨即移除該泡泡,必要時觸發地圖效果。final void切換本地圖的掉落開關(取反)。final void切換地圖環境物件的狀態(在 1 與 2 之間切換),尚未記錄者預設切到 1。final void切換本地圖的全域掉落開關(取反)。final void依玩家與地圖物件的距離,更新該物件對該玩家的可見性。final voidupdateMonsterController(MapleMonster monster) Automagically finds a new controller for the given monster from the chars on the map...
-
Constructor Details
-
MapleMap
public MapleMap(int mapid, int channel, int returnMapId, float monsterRate) 建立一張地圖,並初始化各型別的地圖物件容器與其讀寫鎖。依
mapid套用組隊遊戲怪物倍率(GameConstants.getPartyPlay(int)> 0 時將monsterRate放大),並把returnMapId為999999999的哨兵值改回自身mapid。每種MapleMapObjectType各配一個LinkedHashMap與一把ReentrantReadWriteLock(皆以Collections.unmodifiableMap(Map)包裝為不可變對應), 並建立三個協作者MapReactorManager/MapleMonsterSpawnManager/MapleMonsterKillManager。- Parameters:
mapid- 地圖編號channel- 所屬頻道編號(內部存為byte)returnMapId- 返回地圖編號;999999999代表返回自身monsterRate- 怪物刷新倍率(組隊地圖會再放大)
-
-
Method Details
-
getChannelServer
-
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
-
getReturnMapId
public final int getReturnMapId()取得返回地圖編號。- Returns:
- 返回地圖編號
-
setReturnMapId
public final void setReturnMapId(int rmi) 設定返回地圖編號。- Parameters:
rmi- 返回地圖編號
-
getForcedReturnId
public final int getForcedReturnId()取得強制返回地圖編號。- Returns:
- 強制返回地圖編號
-
getForcedReturnMap
-
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
-
setMapName
-
getStreetName
-
setStreetName
-
getFirstUserEnter
-
setFirstUserEnter
設定「首位玩家進入」時觸發的腳本名稱。- Parameters:
onFirstUserEnter- 首位進入腳本名稱
-
getUserEnter
-
setUserEnter
設定「玩家進入」時觸發的腳本名稱。- 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
將地圖物件加入本地圖(不通知任何玩家)。於
runningOidLock下配發遞增的物件 ID 並寫入物件,再於該物件型別對應的ReentrantReadWriteLock寫鎖(mapobjectlocks.get(type))下將其放入mapobjects。此方法只登錄物件,產生封包與通知玩家由spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation)等路徑負責。- Parameters:
mapobject- 要加入的地圖物件
-
removeMapObject
將地圖物件自本地圖移除。於該物件型別對應的
ReentrantReadWriteLock寫鎖 (mapobjectlocks.get(type))下,依物件 ID 自mapobjects移除; 不會主動通知玩家。- Parameters:
obj- 要移除的地圖物件
-
calcPointBelow
計算initial正下方落在地面(足板)上的座標。以
footholds.findBelow找出下方的MapleFoothold;若為斜坡則依其 斜率內插出對應的 Y 座標。- Parameters:
initial- 起始座標- Returns:
- 地面上的落點座標;若下方無足板則傳回
null
-
calcDropPos
計算掉落物應落下的地面座標。以
initial上方 50 像素處呼叫calcPointBelow(Point);若找不到地面則回傳fallback。- Parameters:
initial- 掉落起始座標fallback- 找不到地面時的備援座標- Returns:
- 落點座標,或
fallback
-
removeMonster
自本地圖移除指定怪物。- Parameters:
monster- 要移除的怪物
-
killMonster
擊殺指定怪物(適用於設有removeAfter的怪物)。- 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
取得地圖上所有反應爐的清單。- Returns:
- 反應爐清單
-
getAllReactorsThreadsafe
以執行緒安全方式取得地圖上所有反應爐的清單。委派至
MapReactorManager.getAllReactorsThreadsafe()(於 REACTOR 讀鎖下複製)。- Returns:
- 反應爐清單
-
getAllSummonsThreadsafe
以執行緒安全方式取得地圖上所有召喚獸的清單。於 SUMMON 型別的讀鎖(
mapobjectlocks.get(SUMMON))下遍歷並複製為新清單後回傳。- Returns:
- 召喚獸清單
-
getAllDoor
取得地圖上所有傳送門(玩家門)物件的清單。- Returns:
- 傳送門物件清單
-
getAllDoorsThreadsafe
- Returns:
- 傳送門物件清單
-
getAllMechDoorsThreadsafe
以執行緒安全方式取得地圖上所有MechDoor(機械門)的清單。於 DOOR 型別的讀鎖下遍歷,僅挑選
MechDoor實例後複製回傳。- Returns:
- 機械門物件清單
-
getAllMerchant
取得地圖上所有雇用商人的清單。- Returns:
- 雇用商人物件清單
-
getAllHiredMerchantsThreadsafe
以執行緒安全方式取得地圖上所有雇用商人的清單。於 HIRED_MERCHANT 型別的讀鎖下遍歷並複製為新清單後回傳。
- Returns:
- 雇用商人物件清單
-
getAllMonster
取得地圖上所有怪物的清單。- Returns:
- 怪物清單
-
getAllMonstersThreadsafe
以執行緒安全方式取得地圖上所有怪物的清單。於 MONSTER 型別的讀鎖下遍歷並複製為新清單後回傳。
- Returns:
- 怪物清單
-
getAllUniqueMonsters
-
killAllMonsters
public final void killAllMonsters(boolean animate) 擊殺地圖上所有怪物。- Parameters:
animate- 是否播放死亡動畫
-
killMonster
public final void killMonster(int monsId) 依怪物 ID 擊殺地圖上對應的怪物。- Parameters:
monsId- 要擊殺的怪物 ID
-
limitReactor
public final void limitReactor(int rid, int num) 限制指定反應爐 ID 在地圖上的數量。- Parameters:
rid- 反應爐 IDnum- 允許保留的數量
-
destroyReactors
public final void destroyReactors(int first, int last) 銷毀 ID 介於指定範圍內的所有反應爐。- Parameters:
first- 反應爐 ID 範圍下界last- 反應爐 ID 範圍上界
-
destroyReactor
public final void destroyReactor(int oid) 依物件 ID 銷毀指定反應爐。- Parameters:
oid- 反應爐的物件 ID
-
reloadReactors
public final void reloadReactors()重新載入地圖上的反應爐。 -
resetReactors
public final void resetReactors()重設地圖上所有反應爐的狀態。 -
setReactorState
public final void setReactorState()將地圖上所有反應爐設為預設狀態。 -
setReactorState
public final void setReactorState(byte state) 將地圖上所有反應爐設為指定狀態。- Parameters:
state- 目標反應爐狀態
-
setReactorDelay
public final void setReactorDelay(int state) 設定地圖上反應爐的重生延遲。- Parameters:
state- 延遲時間(毫秒)
-
shuffleReactors
public final void shuffleReactors()隨機重新排列地圖上所有反應爐的位置。 -
shuffleReactors
public final void shuffleReactors(int first, int last) 隨機重新排列 ID 介於指定範圍內反應爐的位置。- Parameters:
first- 反應爐 ID 範圍下界last- 反應爐 ID 範圍上界
-
updateMonsterController
Automagically finds a new controller for the given monster from the chars on the map...- Parameters:
monster-
-
getMapObject
依物件 ID 與型別取得地圖物件。於對應
type型別的讀鎖下查詢;若不存在則回傳null。- Parameters:
oid- 物件 IDtype- 地圖物件型別- Returns:
- 對應的地圖物件,不存在時為
null
-
containsNPC
public final boolean containsNPC(int npcid) 判斷地圖上是否存在指定 ID 的 NPC。於 NPC 型別的讀鎖下遍歷所有 NPC 比對其 ID。
- Parameters:
npcid- 要檢查的 NPC ID- Returns:
- 若存在該 NPC 則為
true
-
getNPCById
依 NPC ID 取得地圖上第一個符合的 NPC。於 NPC 型別的讀鎖下遍歷比對 ID;找不到時回傳
null。- Parameters:
id- NPC ID- Returns:
- 符合的 NPC,找不到時為
null
-
getMonsterById
依怪物 ID 取得地圖上第一個符合的怪物。於 MONSTER 型別的讀鎖下遍歷比對 ID;找不到時回傳
null。- Parameters:
id- 怪物 ID- Returns:
- 符合的怪物,找不到時為
null
-
countMonsterById
public int countMonsterById(int id) 統計地圖上指定 ID 的怪物數量。於 MONSTER 型別的讀鎖下遍歷並計數。
- Parameters:
id- 怪物 ID- Returns:
- 符合該 ID 的怪物數量
-
getReactorById
依反應爐 ID 取得地圖上對應的反應爐。委派至
MapReactorManager.getReactorById(int);找不到時回傳null。- Parameters:
id- 反應爐 ID- Returns:
- 符合的反應爐,找不到時為
null
-
getMonsterByOid
returns a monster with the given oid, if no such monster exists returns null- Parameters:
oid-- Returns:
-
getNPCByOid
依物件 ID 取得地圖上的 NPC。經
getMapObject(int, MapleMapObjectType)查詢;找不到時回傳null。- Parameters:
oid- NPC 的物件 ID- Returns:
- 對應的 NPC,找不到時為
null
-
getReactorByOid
依物件 ID 取得地圖上的反應爐。委派至
MapReactorManager.getReactorByOid(int);找不到時回傳null。- Parameters:
oid- 反應爐的物件 ID- Returns:
- 對應的反應爐,找不到時為
null
-
getFamiliarByOid
依物件 ID 取得地圖上的怪物夥伴(familiar)。經
getMapObject(int, MapleMapObjectType)查詢;找不到時回傳null。- Parameters:
oid- 怪物夥伴的物件 ID- Returns:
- 對應的怪物夥伴,找不到時為
null
-
getReactorByName
依名稱取得地圖上的反應爐。委派至
MapReactorManager.getReactorByName(String);找不到時回傳null。- Parameters:
name- 反應爐名稱- Returns:
- 對應的反應爐,找不到時為
null
-
spawnNpc
於指定座標生成一個自訂 NPC 並廣播給全地圖玩家。透過
MapleLifeFactory.getNPC(int)建立 NPC、設定其位置與基準座標、加入地圖物件後, 對地圖內所有玩家廣播NPCPacket.spawnNPC顯示封包。整段以 try/catch 包覆,發生例外時僅記錄錯誤。- Parameters:
id- NPC IDpos- 生成座標
-
spawnNpcForPlayer
於指定座標生成一個自訂 NPC,但僅對單一玩家送出顯示封包。與
spawnNpc(int, Point)類似,但 NPC 顯示封包只傳給c一名玩家, 其餘地圖玩家不會看見。NPC 仍會加入地圖物件集合。- Parameters:
c- 接收顯示封包的玩家連線id- NPC IDpos- 生成座標
-
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
將反應爐生成於指定座標正下方的地面上。委派至
MapReactorManager.spawnReactorOnGroundBelow(MapleReactor, Point)。- Parameters:
mob- 要生成的反應爐pos- 參考座標(會落至其下方地面)
-
spawnMonster_sSack
於指定座標生成怪物(沙包/指定生成型別版本)。委派至
MapleMonsterSpawnManager.spawnMonster_sSack(MapleMonster, Point, int)。- Parameters:
mob- 要生成的怪物pos- 生成座標spawnType- 生成效果型別
-
spawnMonsterOnGroundBelow
將怪物生成於指定座標正下方的地面上。委派至
MapleMonsterSpawnManager.spawnMonsterOnGroundBelow(MapleMonster, Point)。- Parameters:
mob- 要生成的怪物pos- 參考座標(會落至其下方地面)
-
spawnMonsterWithEffectBelow
將怪物生成於指定座標正下方地面,並附帶生成特效。委派至
MapleMonsterSpawnManager.spawnMonsterWithEffectBelow(MapleMonster, Point, int)。- Parameters:
mob- 要生成的怪物pos- 參考座標(會落至其下方地面)effect- 生成特效編號- Returns:
- 生成怪物的物件 ID
-
spawnZakum
public final void spawnZakum(int x, int y) 於指定座標生成炎魔(Zakum)。- Parameters:
x- 生成 X 座標y- 生成 Y 座標
-
spawnChaosZakum
public final void spawnChaosZakum(int x, int y) 於指定座標生成混沌炎魔(Chaos Zakum)。- Parameters:
x- 生成 X 座標y- 生成 Y 座標
-
spawnFakeMonsterOnGroundBelow
將假怪物(不可攻擊的展示用怪物)生成於指定座標正下方地面。委派至
MapleMonsterSpawnManager.spawnFakeMonsterOnGroundBelow(MapleMonster, Point)。- Parameters:
mob- 要生成的假怪物pos- 參考座標(會落至其下方地面)
-
spawnRevives
生成由另一隻怪物分裂/召喚而來的怪物(revive)。委派至
MapleMonsterSpawnManager.spawnRevives(MapleMonster, int)。- Parameters:
monster- 要生成的怪物oid- 來源怪物的物件 ID
-
spawnMonster
生成怪物並以指定生成型別播放出場效果。委派至
MapleMonsterSpawnManager.spawnMonster(MapleMonster, int)。- Parameters:
monster- 要生成的怪物spawnType- 生成效果型別
-
spawnMonster
生成怪物並以指定生成型別播放出場效果,可選擇覆寫既有控制狀態。委派至
MapleMonsterSpawnManager.spawnMonster(MapleMonster, int, boolean)。- Parameters:
monster- 要生成的怪物spawnType- 生成效果型別overwrite- 是否覆寫既有狀態
-
spawnMonsterWithEffect
於指定座標生成怪物並附帶生成特效。委派至
MapleMonsterSpawnManager.spawnMonsterWithEffect(MapleMonster, int, Point)。- Parameters:
monster- 要生成的怪物effect- 生成特效編號pos- 生成座標- Returns:
- 生成怪物的物件 ID
-
spawnFakeMonster
生成假怪物(不可攻擊的展示用怪物)。委派至
MapleMonsterSpawnManager.spawnFakeMonster(MapleMonster)。- Parameters:
monster- 要生成的假怪物
-
spawnReactor
將反應爐生成於其自身座標。- Parameters:
reactor- 要生成的反應爐
-
spawnDoor
-
spawnMechDoor
-
spawnSummon
將召喚獸生成於地圖上,並對視野範圍內玩家送出召喚封包。先以
MapleSummon.updateMap(MapleMap)綁定本地圖,再經spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation)加入地圖物件並廣播;sendPackets僅在召喚獸未換地圖、或接收者即為召喚主時才送出SummonPacket.spawnSummon(MapleSummon, boolean)。- Parameters:
summon- 欲生成的召喚獸
-
spawnFamiliar
將怪物夥伴生成於地圖上,並對視野範圍內玩家送出生成封包。經
spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation)加入地圖物件並廣播CField.spawnFamiliar(MonsterFamiliar, boolean)(接收者玩家須存在)。- Parameters:
familiar- 欲生成的怪物夥伴
-
spawnExtractor
將採集器生成於地圖上,並對視野範圍內玩家送出其生成資料。經
spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation)加入地圖物件並由MapleExtractor.sendSpawnData(MapleClient)送出封包。- Parameters:
ex- 欲生成的採集器
-
spawnMist
將煙霧(毒霧/補血霧等)生成於地圖上並依類型排定週期效果與到期清除。先經
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 秒到期、 對droptype0/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
於指定座標自動生成一個無主掉落物並對全地圖廣播。裝備類道具會經
MapleItemInformationProvider.randomizeStats(Equip)隨機化能力值, 其餘為數量 1 的一般道具。經spawnAndAddRangedMapObject(MapleMapObject, MapleMap.DelayedPacketCreation)加入並另對全地圖 廣播CField.dropItemFromMapObject(MapleMapItem, Point, Point, byte);除點券類(itemid/10000==291)外註冊 120 秒到期。- Parameters:
itemid- 道具 IDpos- 落點座標
-
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
取得地圖上所有掉落物的快照清單。委派至getAllItemsThreadsafe()。- Returns:
- 掉落物清單(快照)
-
getAllItemsThreadsafe
在 ITEM 型別讀鎖保護下,取得地圖上所有掉落物的快照清單。- Returns:
- 掉落物清單(快照,可能為空)
-
getPointOfItem
在 ITEM 型別讀鎖保護下,尋找場上指定道具 ID 的掉落物座標。- Parameters:
itemid- 欲尋找的道具 ID- Returns:
- 第一個符合者的座標;找不到時為
null
-
getAllMistsThreadsafe
-
returnEverLastItem
將永久地圖(everlast)上屬於指定玩家的掉落物全數返還給該玩家。逐一檢視場上掉落物,凡擁有者為
chr者:標記已拾取、廣播CField.removeItemFromMap(int, int, int)後,楓幣經MapleCharacter.gainMeso(int, boolean)入帳、道具經MapleInventoryManipulator.addFromDrop(MapleClient, Item, boolean)加入背包,並移除地圖物件。 完成後呼叫spawnRandDrop()重新排定隨機掉落。會修改玩家狀態並送出封包。- Parameters:
chr- 離開地圖、需返還掉落物的玩家
-
talkMonster
讓指定怪物說話(顯示對話泡泡)並隨即移除該泡泡,必要時觸發地圖效果。itemId > 0時先呼叫startMapEffect(String, int)顯示地圖訊息, 接著對全地圖廣播MobPacket.talkMonster(int, int, String)與MobPacket.removeTalkMonster(int)。- Parameters:
msg- 怪物對話文字itemId- 關聯的地圖效果道具 ID(> 0 時觸發地圖效果)objectid- 目標怪物的物件 ID
-
startMapEffect
- Parameters:
msg- 效果訊息文字itemId- 效果對應的道具 ID
-
startMapEffect
啟動地圖效果(橫幅訊息/點唱機)並排定自動結束。若已有
mapEffect進行中則直接返回(同時間僅允許一個)。否則建立MapleMapEffect、廣播開始封包,並排定一段時間後廣播結束封包並清除: 點唱機(jukebox為true)為 300 秒,一般效果為 30 秒。- Parameters:
msg- 效果訊息文字itemId- 效果對應的道具 IDjukebox- 是否為點唱機效果(影響持續時間)
-
startExtendedMapEffect
啟動延長型地圖效果(橫幅訊息長駐顯示)。先廣播
CField.startMapEffect(String, int, boolean)開始橫幅;60 秒後廣播CField.removeMapEffect()並再次以非開始模式廣播CField.startMapEffect(String, int, boolean)(保留效果不移除)。不使用單一mapEffect互斥旗標。- Parameters:
msg- 效果訊息文字itemId- 效果對應的道具 ID
-
startSimpleMapEffect
啟動簡易地圖效果:僅廣播CField.startMapEffect(String, int, boolean)開始橫幅,不排定結束。- Parameters:
msg- 效果訊息文字itemId- 效果對應的道具 ID
-
startJukebox
- Parameters:
msg- 效果訊息文字itemId- 效果對應的道具 ID
-
addPlayer
將玩家加入本地圖,完成進場所需的全部初始化與封包同步。本方法為玩家進場的核心流程,主要步驟包含:
- 在 PLAYER 型別寫鎖下加入
mapobjects,並在charactersLock寫鎖下加入characters。 - 對其他玩家廣播角色生成封包(隱身時僅對 GM 廣播);自由市場進場若有遠征隊 進行中且為內部帳號會結束遠征。
- 送出本地圖既有物件擺放(
sendObjectPlacement)、執行 onFirstUserEnter / onUserEnter 腳本、處理船隻、隊伍 HP、寵物/機器人/龍/召喚獸重生、時鐘、 遠征隊神殿、BGM、道場計時、組隊更新、永久天氣與移動平台等。 - 依地圖/職業套用特殊狀態並取消不合規的增益(飛行、SOARING、AURA 等)。
- Parameters:
chr- 進場的玩家
- 在 PLAYER 型別寫鎖下加入
-
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
依本地圖的地圖 ID 解析其對應的遠征隊並回傳。以地圖 ID 對映到
MapleSquad.MapleSquadType(炎魔/札昆/龍王/粉紅熊/各地獄王等), 再向本頻道的ChannelServer.getMapleSquad(String)取得隊伍實例。- Returns:
- 對應的遠征隊;地圖不屬任何王怪戰時為
null
-
getSquadBegin
-
getEMByMap
依本地圖的地圖 ID 解析其對應的事件管理器(EventManager)。以地圖 ID 對映到事件名稱(如
ZakumBattle、HorntailBattle等), 再向本頻道的事件腳本管理器取得對應EventManager。- Returns:
- 對應的事件管理器;地圖不屬任何王怪戰時為
null
-
removePlayer
將玩家自本地圖移除,並清理其相關地圖物件與廣播離場。主要步驟:永久地圖先返還掉落物(
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
對地圖內玩家廣播封包(無範圍限制),可選擇是否同時送回來源玩家。委派至
broadcastMessage(MapleCharacter, byte[], double, Point);repeatToSource為true時來源帶null(連同來源一併送出), 否則排除來源玩家。- Parameters:
source- 來源玩家(其座標作為廣播基準)packet- 欲廣播的封包位元組repeatToSource- 是否同時送回來源玩家
-
broadcastMessage
對指定座標視野範圍內的所有玩家廣播封包。委派至
broadcastMessage(MapleCharacter, byte[], double, Point), 來源為null、範圍為GameConstants.maxViewRangeSq()。- Parameters:
packet- 欲廣播的封包位元組rangedFrom- 範圍判定的中心座標
-
broadcastMessage
對指定座標視野範圍內的玩家廣播封包,排除來源玩家。委派至
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
取得指定座標一定距離平方範圍內的傳送點清單。會排除目標地圖即為本地圖、以及目標地圖為
999999999(無目標/重生點)的傳送點。- Parameters:
from- 中心座標rangeSq- 範圍的距離平方上限- Returns:
- 範圍內符合條件的傳送點清單(可能為空)
-
getMapObjectsInRange
取得指定座標一定距離平方範圍內的所有地圖物件。會逐一掃描每一種
MapleMapObjectType,各自於對應的mapobjectlocks讀鎖下走訪。- Parameters:
from- 中心座標rangeSq- 範圍的距離平方上限- Returns:
- 範圍內所有型別的地圖物件清單(可能為空)
-
getItemsInRange
取得指定座標一定距離平方範圍內的掉落物件。等同呼叫
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
取得邊界與指定矩形相交的所有玩家。於
charactersLock讀鎖下走訪本地圖玩家。- Parameters:
box- 矩形範圍- Returns:
- 邊界與矩形相交的玩家清單(可能為空)
-
getPlayersInRectAndInList
public final List<MapleCharacter> getPlayersInRectAndInList(Rectangle box, List<MapleCharacter> chrList) 取得同時位於指定矩形範圍內、且存在於指定玩家清單中的玩家。於
charactersLock讀鎖下走訪本地圖玩家,回傳同時通過清單成員檢查與矩形包含檢查者。- Parameters:
box- 矩形範圍chrList- 用於過濾的玩家清單- Returns:
- 同時符合兩項條件的玩家清單(可能為空)
-
addPortal
將傳送點加入本地圖,以其 id 為索引。- Parameters:
myPortal- 要加入的傳送點
-
getPortal
依名稱取得傳送點。- Parameters:
portalname- 傳送點名稱- Returns:
- 對應的傳送點;找不到時為
null
-
getPortal
依 id 取得傳送點。- Parameters:
portalid- 傳送點 id- Returns:
- 對應的傳送點;找不到時為
null
-
resetPortals
public final void resetPortals()重設本地圖所有傳送點為開啟狀態。 -
getFootholds
-
setFootholds
設定本地圖的踏板(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
取得本地圖玩家的快照清單。委派至getCharactersThreadsafe()。- Returns:
- 本地圖玩家的複本清單(可能為空)
-
getCharactersThreadsafe
取得本地圖玩家的執行緒安全快照清單。於
charactersLock讀鎖下複製,回傳的是獨立清單,可在鎖外安全走訪。- Returns:
- 本地圖玩家的複本清單(可能為空)
-
getCharacterByName
依名稱(不分大小寫)取得本地圖中的玩家。於
charactersLock讀鎖下走訪本地圖玩家。- Parameters:
id- 玩家名稱- Returns:
- 對應的玩家;找不到時為
null
-
getCharacterById_InMap
依玩家 id 取得本地圖中的玩家。委派至getCharacterById(int)。- Parameters:
id- 玩家 id- Returns:
- 對應的玩家;找不到時為
null
-
getCharacterById
依玩家 id 取得本地圖中的玩家。於
charactersLock讀鎖下走訪本地圖玩家。- Parameters:
id- 玩家 id- Returns:
- 對應的玩家;找不到時為
null
-
updateMapObjectVisibility
依玩家與地圖物件的距離,更新該物件對該玩家的可見性。物件由不可見進入視野時,送出生成封包並登記為可見;離開視野時送出消失封包並移除登記。 迷霧/萃取器/召喚獸/夥伴/機械門等型別一旦可見便維持可見(不因距離移除)。怪物未離開視野且仍在半視野範圍內時, 會呼叫
updateMonsterController(MapleMonster)重新指派控制者。chr為null或為分身時直接略過。- Parameters:
chr- 觀察的玩家mo- 要更新可見性的地圖物件
-
moveMonster
更新怪物座標,並對本地圖所有玩家刷新該怪物的可見性。於
charactersLock讀鎖下逐一呼叫updateMapObjectVisibility(MapleCharacter, MapleMapObject)。- Parameters:
monster- 移動的怪物reportedPos- 客戶端回報的新座標
-
movePlayer
更新玩家座標,並重新計算其周遭地圖物件的可見集合。在玩家可見物件集合的寫鎖保護下:先逐一更新目前可見物件的可見性(已不在地圖者自集合移除), 再將進入視野範圍但尚未可見的物件送出生成封包並加入集合。
player為分身時直接略過。- Parameters:
player- 移動的玩家newPosition- 玩家的新座標
-
findClosestSpawnpoint
取得距離指定座標最近的重生點。僅納入型別介於 0 至 2 之間、且目標地圖為
999999999(重生用)的傳送點; 以距離平方比較。預設值為 0 號傳送點。- Parameters:
from- 參考座標- Returns:
- 最近的重生點傳送點
-
findClosestPortal
取得距離指定座標最近的傳送點(不限型別)。以距離平方比較所有傳送點,預設值為 0 號傳送點。
- Parameters:
from- 參考座標- Returns:
- 最近的傳送點
-
spawnDebug
組出本地圖怪物生成相關狀態的除錯字串。包含怪物數量、
spawnedMonstersOnMap、生成點數、最大常駐生成數、實際怪物數、生成倍率與固定怪數等。- Returns:
- 除錯用的單行狀態字串
-
characterSize
public int characterSize()取得本地圖玩家集合的原始大小(含分身,未加鎖)。- Returns:
- 玩家集合的元素數量
-
getMapObjectSize
public final int getMapObjectSize()取得本地圖地圖物件的概略總數(排除分身後的玩家計入)。- Returns:
- 地圖物件數量
-
getCharactersSize
public final int getCharactersSize()取得本地圖中非分身的真實玩家數量。於
charactersLock讀鎖下走訪並排除分身。- Returns:
- 真實玩家數量
-
getPortals
-
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
依本地圖玩家分布判定雪球賽(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
-
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
取得本地圖所有 NPC 的快照清單。委派至getAllNPCsThreadsafe()。- Returns:
- 本地圖 NPC 的複本清單(可能為空)
-
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- 怪物 idmobTime- 重生間隔(秒)
-
resetSpawns
public final void resetSpawns()重設本地圖的怪物生成狀態。委派至MapleMonsterSpawnManager.resetSpawns()。 -
makeCarnivalSpawn
為指定隊伍生成怪物迷宮(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
設定本地圖所屬的遠征隊/組隊類型。- 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
當玩家離開本地圖時,檢查並重置與之相關的遠征隊(squad)、事件(EventManager)與極速通關狀態。僅在
checkStates旗標為true時作用。若本地圖綁定處於進行中(status 2)的遠征隊, 會將該玩家自隊伍移除;若離開者為隊長則將事件屬性leader設為false; 當地圖已無玩家(size 為 0)或傳入空名稱時,重置事件state/leader屬性、 透過cancelSquadSchedule(boolean)取消排程並清空隊伍。地圖清空且有極速通關進行中時,呼叫endSpeedRun()。- Parameters:
chr- 離開地圖的玩家名稱(空字串代表整批離開)
-
setCheckStates
-
getPlatforms
取得本地圖的移動平台清單。委派至nodes的MapleNodes.getPlatforms()。- Returns:
MapleNodes.MaplePlatform清單
-
getNodes
取得本地圖的節點集合(用於護衛/移動路徑等)。委派至nodes的MapleNodes.getNodes()。- Returns:
MapleNodes.MapleNodeInfo集合
-
setNodes
-
getNode
取得指定索引的節點資訊。委派至nodes的MapleNodes.getNode(int)。- Parameters:
index- 節點索引- Returns:
- 對應的
MapleNodes.MapleNodeInfo
-
isLastNode
public boolean isLastNode(int index) 判斷指定索引是否為最後一個節點。委派至nodes的MapleNodes.isLastNode(int)。- Parameters:
index- 節點索引- Returns:
- 為最後一個節點時回傳
true
-
getAreas
取得本地圖定義的區域(矩形範圍)清單。委派至nodes的MapleNodes.getAreas()。- Returns:
Rectangle清單
-
getArea
取得指定索引的區域矩形範圍。委派至nodes的MapleNodes.getArea(int)。- Parameters:
index- 區域索引- Returns:
- 對應的
Rectangle
-
changeEnvironment
變更地圖環境物件(如機關)的狀態,並向場上所有玩家廣播環境變更封包。- Parameters:
ms- 環境物件名稱type- 變更後的狀態類型
-
toggleEnvironment
切換地圖環境物件的狀態(在 1 與 2 之間切換),尚未記錄者預設切到 1。透過
moveEnvironment(String, int)廣播並更新environment對照表。- Parameters:
ms- 環境物件名稱
-
moveEnvironment
移動/設定地圖環境物件的狀態,向場上所有玩家廣播後將狀態記入environment對照表。- Parameters:
ms- 環境物件名稱type- 目標狀態類型
-
getEnvironment
-
getNumPlayersInArea
public final int getNumPlayersInArea(int index) 計算指定索引區域內的玩家人數。委派至getNumPlayersInRect(Rectangle),矩形取自getArea(int)。- Parameters:
index- 區域索引- Returns:
- 該區域內的玩家人數
-
getNumPlayersInRect
計算指定矩形範圍內的玩家人數。遍歷在場玩家集合期間持有
charactersLock讀鎖。- Parameters:
rect- 要檢查的矩形範圍- Returns:
- 範圍內的玩家人數
-
getNumPlayersItemsInArea
public final int getNumPlayersItemsInArea(int index) 計算指定索引區域內的玩家與掉落物總數。委派至getNumPlayersItemsInRect(Rectangle),矩形取自getArea(int)。- Parameters:
index- 區域索引- Returns:
- 該區域內玩家數與掉落物數的總和
-
getNumPlayersItemsInRect
計算指定矩形範圍內的玩家與掉落物總數。先以
getNumPlayersInRect(Rectangle)取得玩家數(其內部持有charactersLock讀鎖), 再於遍歷 ITEM 類地圖物件期間持有對應的mapobjectlocks讀鎖累加掉落物數。- Parameters:
rect- 要檢查的矩形範圍- Returns:
- 範圍內玩家數與掉落物數的總和
-
broadcastNONGMMessage
向場上所有「非 GM」玩家廣播封包。當
repeatToSource為true時連同source本身一併送出;為false時排除source。 實際送出於私有多載中進行,期間持有charactersLock讀鎖。- Parameters:
source- 來源玩家packet- 要廣播的封包位元組repeatToSource- 是否一併送給來源玩家
-
broadcastGMMessage
向場上所有「GM」玩家廣播封包。當
repeatToSource為true時連同source本身一併送出;為false時僅送給 GM 等級不低於source者。 實際送出於私有多載中進行,期間持有charactersLock讀鎖。- Parameters:
source- 來源玩家packet- 要廣播的封包位元組repeatToSource- 是否一併送給來源玩家
-
getMobsToSpawn
-
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
重置「夏蘭島逃脫(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
以弱參照記錄觸發怪物變更(如變身機關)的來源玩家。- Parameters:
d- 來源玩家
-
getChangeableMobOrigin
取得觸發怪物變更的來源玩家。- Returns:
- 來源玩家;若從未設定或弱參照已被回收則回傳
null
-
getGuardians
-
getDirectionInfo
取得指定索引的方向資訊(用於路徑/移動)。委派至nodes的MapleNodes.getDirection(int)。- Parameters:
i- 方向索引- Returns:
- 對應的
MapleNodes.DirectionInfo
-
spawnKite
在本地圖生成一個風箏(招牌),廣播生成封包,並排程 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- 重設後的怪物等級
-