Class CharacterCooldownDiseaseManager

java.lang.Object
client.CharacterCooldownDiseaseManager

public final class CharacterCooldownDiseaseManager extends Object
角色「技能冷卻(cooldown)與異常狀態(disease/debuff)」子系統的協作者,由 P5 God class 拆分自 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 存取其 coolDownsdiseasesclientstatsmapid 等成員與共用的 SLF4J logger(MapleCharacter.log); 這兩張狀態表本身仍宣告並初始化於 MapleCharacter,僅放寬為 package-private 供本協作者存取。

  • Method Details

    • addCooldown

      public void addCooldown(int skillId, long startTime, long length)
      為指定技能新增(或覆寫)一筆冷卻紀錄。

      直接以 skillId 為鍵寫入所屬角色的 coolDowns 表;若該技能已在冷卻中,舊紀錄會被覆寫。 本方法僅變更內存狀態,不發送封包、不寫入資料庫。

      Parameters:
      skillId - 進入冷卻的技能 id
      startTime - 冷卻開始時間(毫秒,通常為 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 - 進入冷卻的技能 id
      starttime - 冷卻開始時間(毫秒)
      length - 冷卻持續時間(毫秒)
    • giveCoolDowns

      public void giveCoolDowns(List<MapleCoolDownValueHolder> cooldowns)
      批次回補技能冷卻;當未提供清單時,改自資料庫 skills_cooldowns 表載入。

      用於跨頻道/登入時還原冷卻狀態,行為依參數分為兩路:

      • cooldownsnull 且非空:將其中每筆 MapleCoolDownValueHolderskillId 為鍵直接寫入所屬角色的 coolDowns 表(純內存操作)。
      • cooldownsnull 或空:查詢 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

      public List<MapleCoolDownValueHolder> getCooldowns()
      取得目前所有冷卻紀錄的快照。

      回傳一份新的 ArrayList(過濾掉 null 元素),對其增刪不影響所屬角色的 coolDowns 表。

      Returns:
      目前冷卻紀錄的清單副本,永不為 null(可能為空)
    • getAllDiseases

      public final List<MapleDiseaseValueHolder> getAllDiseases()
      取得目前所有生效中異常狀態的快照。

      回傳一份新的 ArrayList,對其增刪不影響所屬角色的 diseases 表。

      Returns:
      目前異常狀態紀錄的清單副本,永不為 null(可能為空)
    • hasDisease

      public final boolean hasDisease(MapleDisease dis)
      查詢角色目前是否處於指定異常狀態。
      Parameters:
      dis - 欲查詢的異常狀態
      Returns:
      若該狀態在 diseases 表中(生效中)則為 true,否則為 false
    • giveDebuff

      public void giveDebuff(MapleDisease disease, MobSkill skill)
      由怪物技能(MobSkill)對角色施加一種異常狀態。

      skill 取出強度、持續時間、技能 id 與等級後,委派給 giveDebuff(MapleDisease, int, long, int, int),免疫判定與封包副作用詳見該方法。

      Parameters:
      disease - 欲施加的異常狀態
      skill - 造成此異常狀態的怪物技能
    • giveDebuff

      public void giveDebuff(MapleDisease disease, int x, long duration, int skillid, int level)
      對角色施加一種異常狀態,套用各項免疫判定後寫入狀態、發送封包並處理副作用。

      依序進行下列免疫/前置判定,任一成立即提前返回而不施加:

      通過判定後:將狀態寫入 diseases(持續時間扣除 stats.decreaseDebuff)、對自身 發送 giveDebuff 封包、並向同地圖其他玩家廣播 giveForeignDebuff。若為中毒 (MapleDisease.POISON)且 x > 0,另以 MapleCharacter.addHP(int) 依持續秒數 扣除 HP。

      副作用:變更內存狀態、發送並廣播封包、可能扣血;不寫入資料庫。

      Parameters:
      disease - 欲施加的異常狀態
      x - 異常狀態強度(中毒時為每秒扣血量)
      duration - 原始持續時間(毫秒,實際生效時會扣除 stats.decreaseDebuff
      skillid - 造成此異常狀態的技能 id
      level - 造成此異常狀態的技能等級
    • giveSilentDebuff

      public final void giveSilentDebuff(List<MapleDiseaseValueHolder> ld)
      靜默地批次寫入一組異常狀態(不發送封包、不套用免疫判定)。

      用於跨頻道搬移時還原既有異常狀態:將清單中每筆 MapleDiseaseValueHolder 以其 disease 為鍵直接寫入 diseases 表,純內存操作,進行無敵/聖盾/ASR 等判定, 也對客戶端或同地圖玩家發送任何封包。ldnull 或空時為無作用。

      Parameters:
      ld - 欲還原的異常狀態清單;可為 null 或空
    • dispelDebuff

      public void dispelDebuff(MapleDisease debuff)
      解除角色身上的單一異常狀態,並通知客戶端與同地圖玩家。

      僅在角色目前確有該狀態(hasDisease(MapleDisease))時動作:對自身發送 cancelDebuff 封包、 向同地圖其他玩家廣播 cancelForeignDebuff,最後自 diseases 表移除;否則為無作用。

      副作用:發送並廣播封包、變更內存狀態;不寫入資料庫。

      Parameters:
      debuff - 欲解除的異常狀態
    • dispelDebuffs

      public void dispelDebuffs()
      解除角色身上所有異常狀態,並逐一通知客戶端與同地圖玩家。

      對目前 diseases 的鍵集快照逐筆呼叫 dispelDebuff(MapleDisease),因此每筆都會發送 cancelDebuff 並廣播 cancelForeignDebuff(先取快照以避免疊代中修改集合)。

      副作用:發送並廣播封包、清空內存狀態;不寫入資料庫。

    • cancelAllDebuffs

      public void cancelAllDebuffs()
      靜默清空角色所有異常狀態(不發送任何封包)。

      直接清空 diseases 表,對客戶端或同地圖玩家發送 cancelDebuff 等封包 (與 dispelDebuffs() 的差異所在)。純內存操作,不寫入資料庫。