Class CharacterCooldownDiseaseManager
MapleCharacter。
本類別封裝對兩張角色內存狀態表的存取:coolDowns(技能 id → 冷卻計時)與
diseases(異常狀態 → 計時),涵蓋冷卻的增刪查(addCooldown(int, long, long)/removeCooldown(int)/
skillisCooling(int))、跨頻道搬移時自 skills_cooldowns 表回補冷卻(giveCoolDowns(int, long, long)),
以及異常狀態的施加/靜默施加/解除(giveDebuff(MapleDisease, MobSkill)/giveSilentDebuff(List)/dispelDebuff(MapleDisease)/
dispelDebuffs()/cancelAllDebuffs()),含無敵、聖盾、機甲變身、異常抵抗(ASR)等免疫判定
與中毒扣血副作用。
MapleCharacter 以**逐字搬移**的方式把這些方法移入此處,並對每個對外公開方法保留
**簽名完全相同**的委派(delegate),因此所有 Java 呼叫端與 ~2,700 支腳本完全不受影響。協作者僅
持有對所屬角色的回參考,透過同 package 存取其 coolDowns/diseases/client/
stats/map/id 等成員與共用的 SLF4J logger(MapleCharacter.log);
這兩張狀態表本身仍宣告並初始化於 MapleCharacter,僅放寬為 package-private 供本協作者存取。
-
Method Summary
Modifier and TypeMethodDescriptionvoidaddCooldown(int skillId, long startTime, long length) 為指定技能新增(或覆寫)一筆冷卻紀錄。void靜默清空角色所有異常狀態(不發送任何封包)。voiddispelDebuff(MapleDisease debuff) 解除角色身上的單一異常狀態,並通知客戶端與同地圖玩家。void解除角色身上所有異常狀態,並逐一通知客戶端與同地圖玩家。final List<MapleDiseaseValueHolder> 取得目前所有生效中異常狀態的快照。取得目前所有冷卻紀錄的快照。int取得目前處於冷卻中的技能數量。int取得目前生效中的異常狀態數量。voidgiveCoolDowns(int skillid, long starttime, long length) 以單筆參數補上一筆技能冷卻(addCooldown(int, long, long)的薄包裝)。voidgiveCoolDowns(List<MapleCoolDownValueHolder> cooldowns) 批次回補技能冷卻;當未提供清單時,改自資料庫skills_cooldowns表載入。voidgiveDebuff(MapleDisease disease, int x, long duration, int skillid, int level) 對角色施加一種異常狀態,套用各項免疫判定後寫入狀態、發送封包並處理副作用。voidgiveDebuff(MapleDisease disease, MobSkill skill) 由怪物技能(MobSkill)對角色施加一種異常狀態。final void靜默地批次寫入一組異常狀態(不發送封包、不套用免疫判定)。final booleanhasDisease(MapleDisease dis) 查詢角色目前是否處於指定異常狀態。voidremoveCooldown(int skillId) 移除指定技能的冷卻紀錄。booleanskillisCooling(int skillId) 查詢指定技能目前是否處於冷卻中。
-
Method Details
-
addCooldown
public void addCooldown(int skillId, long startTime, long length) 為指定技能新增(或覆寫)一筆冷卻紀錄。直接以
skillId為鍵寫入所屬角色的coolDowns表;若該技能已在冷卻中,舊紀錄會被覆寫。 本方法僅變更內存狀態,不發送封包、不寫入資料庫。- Parameters:
skillId- 進入冷卻的技能 idstartTime- 冷卻開始時間(毫秒,通常為System.currentTimeMillis())length- 冷卻持續時間(毫秒)
-
removeCooldown
public void removeCooldown(int skillId) 移除指定技能的冷卻紀錄。僅變更所屬角色的
coolDowns內存狀態;若該技能原本不在冷卻中則為無作用(no-op)。 不發送封包、不寫入資料庫。- Parameters:
skillId- 欲解除冷卻的技能 id
-
skillisCooling
public boolean skillisCooling(int skillId) 查詢指定技能目前是否處於冷卻中。- Parameters:
skillId- 欲查詢的技能 id- Returns:
- 若該技能在
coolDowns表中(冷卻中)則為true,否則為false
-
giveCoolDowns
public void giveCoolDowns(int skillid, long starttime, long length) 以單筆參數補上一筆技能冷卻(addCooldown(int, long, long)的薄包裝)。直接委派給
addCooldown(int, long, long);同樣只變更內存狀態,不發送封包、不寫入資料庫。- Parameters:
skillid- 進入冷卻的技能 idstarttime- 冷卻開始時間(毫秒)length- 冷卻持續時間(毫秒)
-
giveCoolDowns
批次回補技能冷卻;當未提供清單時,改自資料庫skills_cooldowns表載入。用於跨頻道/登入時還原冷卻狀態,行為依參數分為兩路:
cooldowns非null且非空:將其中每筆MapleCoolDownValueHolder以skillId為鍵直接寫入所屬角色的coolDowns表(純內存操作)。cooldowns為null或空:查詢skills_cooldowns表中該角色(charid) 的所有紀錄,跳過已逾期者(length + StartTime - now <= 0),其餘逐筆透過giveCoolDowns(int, long, long)補回,最後刪除該角色於skills_cooldowns的所有列 (經MapleCharacter.deleteWhereCharacterId)。
副作用:在後者路徑會讀取並刪除資料庫資料;查詢失敗時僅記錄錯誤(
MapleCharacter.log) 而不拋出例外。- Parameters:
cooldowns- 欲回補的冷卻清單;可為null或空,此時改由資料庫載入
-
getCooldownSize
public int getCooldownSize()取得目前處於冷卻中的技能數量。- Returns:
coolDowns表的大小
-
getDiseaseSize
public int getDiseaseSize()取得目前生效中的異常狀態數量。- Returns:
diseases表的大小
-
getCooldowns
取得目前所有冷卻紀錄的快照。回傳一份新的
ArrayList(過濾掉null元素),對其增刪不影響所屬角色的coolDowns表。- Returns:
- 目前冷卻紀錄的清單副本,永不為
null(可能為空)
-
getAllDiseases
取得目前所有生效中異常狀態的快照。回傳一份新的
ArrayList,對其增刪不影響所屬角色的diseases表。- Returns:
- 目前異常狀態紀錄的清單副本,永不為
null(可能為空)
-
hasDisease
查詢角色目前是否處於指定異常狀態。- Parameters:
dis- 欲查詢的異常狀態- Returns:
- 若該狀態在
diseases表中(生效中)則為true,否則為false
-
giveDebuff
由怪物技能(MobSkill)對角色施加一種異常狀態。自
skill取出強度、持續時間、技能 id 與等級後,委派給giveDebuff(MapleDisease, int, long, int, int),免疫判定與封包副作用詳見該方法。- Parameters:
disease- 欲施加的異常狀態skill- 造成此異常狀態的怪物技能
-
giveDebuff
對角色施加一種異常狀態,套用各項免疫判定後寫入狀態、發送封包並處理副作用。依序進行下列免疫/前置判定,任一成立即提前返回而不施加:
- 角色處於無敵(
MapleCharacter.isInvincible()):直接消除,必要時顯示提示訊息。 map為null,或角色已具備該異常狀態(hasDisease(MapleDisease))。- 持有聖盾(
MapleBuffStat.HOLY_SHIELD)且異常狀態非SEDUCE/STUN/FLAG。 - 處於機甲變身(
MapleBuffStat.MECH_CHANGE)且非飛彈坦克(35121005)。 - 異常抵抗 ASR 命中(
stats.ASR > 0且亂數判定通過)。
通過判定後:將狀態寫入
diseases(持續時間扣除stats.decreaseDebuff)、對自身 發送giveDebuff封包、並向同地圖其他玩家廣播giveForeignDebuff。若為中毒 (MapleDisease.POISON)且x > 0,另以MapleCharacter.addHP(int)依持續秒數 扣除 HP。副作用:變更內存狀態、發送並廣播封包、可能扣血;不寫入資料庫。
- Parameters:
disease- 欲施加的異常狀態x- 異常狀態強度(中毒時為每秒扣血量)duration- 原始持續時間(毫秒,實際生效時會扣除stats.decreaseDebuff)skillid- 造成此異常狀態的技能 idlevel- 造成此異常狀態的技能等級
- 角色處於無敵(
-
giveSilentDebuff
靜默地批次寫入一組異常狀態(不發送封包、不套用免疫判定)。用於跨頻道搬移時還原既有異常狀態:將清單中每筆
MapleDiseaseValueHolder以其disease為鍵直接寫入diseases表,純內存操作,不進行無敵/聖盾/ASR 等判定, 也不對客戶端或同地圖玩家發送任何封包。ld為null或空時為無作用。- Parameters:
ld- 欲還原的異常狀態清單;可為null或空
-
dispelDebuff
解除角色身上的單一異常狀態,並通知客戶端與同地圖玩家。僅在角色目前確有該狀態(
hasDisease(MapleDisease))時動作:對自身發送cancelDebuff封包、 向同地圖其他玩家廣播cancelForeignDebuff,最後自diseases表移除;否則為無作用。副作用:發送並廣播封包、變更內存狀態;不寫入資料庫。
- Parameters:
debuff- 欲解除的異常狀態
-
dispelDebuffs
public void dispelDebuffs()解除角色身上所有異常狀態,並逐一通知客戶端與同地圖玩家。對目前
diseases的鍵集快照逐筆呼叫dispelDebuff(MapleDisease),因此每筆都會發送cancelDebuff並廣播cancelForeignDebuff(先取快照以避免疊代中修改集合)。副作用:發送並廣播封包、清空內存狀態;不寫入資料庫。
-
cancelAllDebuffs
public void cancelAllDebuffs()靜默清空角色所有異常狀態(不發送任何封包)。直接清空
diseases表,不對客戶端或同地圖玩家發送cancelDebuff等封包 (與dispelDebuffs()的差異所在)。純內存操作,不寫入資料庫。
-