Class CharacterStatsManager

java.lang.Object
client.CharacterStatsManager

public final class CharacterStatsManager extends Object
角色「能力進程(stats progression)」子系統的協作者,由 P5 God class 拆分自 MapleCharacter

本類別封裝角色升級進程相關的狀態存取與運算:

MapleCharacter 以**逐字搬移**的方式把這些方法移入此處,並對每個方法保留**簽名完全相同**的 委派(delegate),因此所有 Java 呼叫端與透過 cmpi 等腳本 API 轉呼的腳本完全不受影響。 協作者僅持有對所屬角色的回參考,透過同 package 存取其進程狀態欄位(expfameremainingApremainingSphpApUsed)以及 leveljobstatsclientmapcharacterCard(部分於 P5f/P5g/P5k 已放寬)。這些欄位本身仍宣告並 初始化於 MapleCharacter(載入/存檔/戰鬥/屬性運算會直接存取),僅放寬為 package-private。 協作者內部方法之間以**裸名稱**互相呼叫(如 gainExp 內呼叫 getExpgetNeededExpsetExplevelUp),與搬移前在 MapleCharacter 內的裸呼叫逐位元組一致; 而仍留在 MapleCharacter 的方法(updateSingleStatfinishAchievementLevelMsgresetStatssilentPartyUpdateautoJobisInterngetTraitexpirationTaskfamilyRepguildUpdatefamilyUpdate 等)則以 chr. 轉呼。

  • Method Summary

    Modifier and Type
    Method
    Description
    void
    addFame(int famechange)
    增加(或扣除)角色人氣值,並同步累積魅力(charm)特性經驗。
    void
    gainAp(short ap)
    為角色增加(或扣除)能力點(AP)並同步至客戶端。
    void
    gainExp(int total, boolean show, boolean inChat, boolean white)
    為角色增加(或扣除)經驗值,並在達到門檻時觸發升級。
    void
    gainExpMonster(int gain, boolean show, boolean white, byte pty, int Class_Bonus_EXP, int Equipment_Bonus_EXP, int Premium_Bonus_EXP, boolean partyBonusMob, int partyBonusRate)
    擊殺怪物後為角色結算經驗值(含各類加成與組隊加成)並在達門檻時升級。
    void
    gainSP(int sp)
    為角色主要技能書增加技能點(SP)、同步客戶端並顯示獲得提示。
    void
    gainSP(int sp, int skillbook)
    為角色指定技能書增加技能點(SP)、同步客戶端並顯示獲得提示。
    int
    取得角色目前的經驗值。
    final int
    取得角色目前的人氣值。
    short
    取得角色已用於增加 HP 的能力點數量。
    final short
    取得角色目前的等級。
    int
    取得升至下一級所需的總經驗值。
    short
    取得角色目前剩餘的能力點(AP)。
    int
    取得角色目前主要技能書的剩餘技能點(SP)。
    int
    getRemainingSp(int skillbook)
    取得指定技能書的剩餘技能點(SP)。
    int[]
    取得各技能書剩餘技能點(SP)的完整陣列。
    int
    計算尚有剩餘技能點的技能書數量。
    void
    執行一次角色升級:扣除門檻經驗、提升等級,並依職業配發能力點/技能點與 HP/MP 成長。
    void
    將所有技能書的剩餘技能點(SP)一律歸零並同步客戶端,等同 resetSP(int) 傳入 0
    void
    resetSP(int sp)
    將所有技能書的剩餘技能點(SP)一律重設為指定值並同步客戶端。
    void
    setExp(int exp)
    設定角色目前的經驗值。
    void
    setFame(int fame)
    設定角色目前的人氣值。
    void
    setHpApUsed(short hpApUsed)
    設定角色已用於增加 HP 的能力點數量。
    void
    setLevel(short level)
    設定角色等級。
    void
    setRemainingAp(short remainingAp)
    設定角色剩餘的能力點(AP)。
    void
    setRemainingSp(int remainingSp)
    設定角色主要技能書的剩餘技能點(SP)。
    void
    setRemainingSp(int remainingSp, int skillbook)
    設定指定技能書的剩餘技能點(SP)。
    void
    將目前人氣值同步至客戶端。

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Method Details

    • getLevel

      public final short getLevel()
      取得角色目前的等級。
      Returns:
      目前等級
    • setLevel

      public void setLevel(short level)
      設定角色等級。

      注意:實際寫入的是 level - 1(保留搬移前的原始行為)。

      Parameters:
      level - 目標等級
    • getExp

      public int getExp()
      取得角色目前的經驗值。
      Returns:
      目前累積的經驗值
    • setExp

      public void setExp(int exp)
      設定角色目前的經驗值。
      Parameters:
      exp - 目標經驗值
    • getNeededExp

      public int getNeededExp()
      取得升至下一級所需的總經驗值。

      依角色目前等級向 GameConstants.getExpNeededForLevel(int) 查表取得。

      Returns:
      目前等級升級所需的經驗值門檻
    • gainExp

      public void gainExp(int total, boolean show, boolean inChat, boolean white)
      為角色增加(或扣除)經驗值,並在達到門檻時觸發升級。

      主要副作用:

      • total > 0 時呼叫 chr.stats.checkEquipLevels 檢查裝備等級(GMS 風格);
      • 累積後達到 getNeededExp() 門檻則呼叫 levelUp()(會送出多個能力封包並廣播效果);
      • 200 級(或皇家騎士團 200 級)且非實習生時直接將經驗值歸零(封頂);
      • 透過 chr.familyRep 結算家族貢獻、並以 chr.updateSingleStat(MapleStat.EXP, …) 同步客戶端;
      • show 為真時向 chr.client 送出 InfoPacket.GainEXP_Others(int, boolean, boolean) 經驗獲得提示。

      會變動所屬角色的 explevelremainingApremainingSp 等狀態。 整個流程包覆於 try/catch,任何例外會寫入 FileoutputUtil.ScriptEx_Log 而不向外拋出。

      Parameters:
      total - 要增加的經驗值(可為負數以扣除)
      show - 是否向客戶端顯示經驗獲得提示
      inChat - 提示是否顯示於聊天視窗
      white - 提示文字是否使用白色
    • gainExpMonster

      public void gainExpMonster(int gain, boolean show, boolean white, byte pty, int Class_Bonus_EXP, int Equipment_Bonus_EXP, int Premium_Bonus_EXP, boolean partyBonusMob, int partyBonusRate)
      擊殺怪物後為角色結算經驗值(含各類加成與組隊加成)並在達門檻時升級。

      總獲得量為 gain 加上職業/裝備/高級會員三項加成;當 pty > 1 時再依 partyBonusRate(或地圖/預設 5%)計入組隊加成 partyinc。溢位時封頂為 Integer.MAX_VALUE

      主要副作用:

      • 呼叫 chr.expirationTask 處理到期物品;
      • total > 0 時呼叫 chr.stats.checkEquipLevels 檢查裝備等級;
      • 達門檻則呼叫 levelUp()(會送出能力封包並廣播效果),200 級封頂時經驗歸零;
      • 透過 chr.familyRep 結算家族貢獻、以 chr.updateSingleStat(MapleStat.EXP, …) 同步客戶端;
      • show 為真時送出 InfoPacket.GainEXP_Monster(int, boolean, int, int, int, int) 顯示各加成明細。

      會變動所屬角色的 explevelremainingApremainingSp 等狀態。

      Parameters:
      gain - 怪物本身提供的基礎經驗值
      show - 是否向客戶端顯示經驗獲得提示
      white - 提示文字是否使用白色
      pty - 同地圖分經驗的隊伍人數(大於 1 時計入組隊加成)
      Class_Bonus_EXP - 職業加成經驗值
      Equipment_Bonus_EXP - 裝備加成經驗值
      Premium_Bonus_EXP - 高級會員加成經驗值
      partyBonusMob - 此怪物是否提供組隊加成
      partyBonusRate - 指定的組隊加成率(百分比;大於 0 時優先於地圖/預設值)
    • levelUp

      public void levelUp()
      執行一次角色升級:扣除門檻經驗、提升等級,並依職業配發能力點/技能點與 HP/MP 成長。

      處理流程涵蓋:

      • 依職業(皇家騎士團與一般職業不同)增加 remainingAp
      • 依各職業分支以 Randomizer 隨機決定本級 HP/MP 成長(含 INT/10 的 MP 加成,惡魔職 MP 固定), 上限 99999;
      • 扣除升級門檻經驗、level += 1(皇家騎士團 10~200 級另回補 1/10 門檻經驗);
      • 於 30/70/120/200 級分別呼叫 chr.finishAchievement 完成成就;
      • 10 級以下將 remainingAp 全數灌入 STR、或對蒼龍俠客重置初始能力;11~200 級配發 3 點技能點;
      • 呼叫 chr.stats.setInforecalcLocalStats、送出 CWvsContext.updatePlayerStats(Map, MapleCharacter) 能力封包, 並向地圖廣播 EffectPacket.showForeignEffect(int) 升級特效;
      • 回呼 chr.LevelMsgsilentPartyUpdateguildUpdatefamilyUpdateautoJobstats.heal 等更新隊伍/公會/家族/自動轉職與補滿狀態。

      因使用 Randomizer 故結果為非確定性。會大量變動所屬角色狀態並送出/廣播多個封包。 通常由 gainExp(int, boolean, boolean, boolean)gainExpMonster(int, boolean, boolean, byte, int, int, int, boolean, int) 在經驗達門檻時內部呼叫。

    • getFame

      public final int getFame()
      取得角色目前的人氣值。
      Returns:
      目前人氣值
    • setFame

      public void setFame(int fame)
      設定角色目前的人氣值。
      Parameters:
      fame - 目標人氣值
    • addFame

      public void addFame(int famechange)
      增加(或扣除)角色人氣值,並同步累積魅力(charm)特性經驗。

      副作用:將變動量加入 charm 特性的本地經驗;當人氣達到 50 時呼叫 chr.finishAchievement(7) 完成對應成就。此方法僅變動狀態,不主動送出能力封包(同步由呼叫端的 updateFame() 負責)。

      Parameters:
      famechange - 人氣變動量(可為負數以扣除)
    • updateFame

      public void updateFame()
      將目前人氣值同步至客戶端。

      透過 chr.updateSingleStat(MapleStat.FAME, …) 送出能力更新封包。

    • getRemainingAp

      public short getRemainingAp()
      取得角色目前剩餘的能力點(AP)。
      Returns:
      目前剩餘能力點
    • setRemainingAp

      public void setRemainingAp(short remainingAp)
      設定角色剩餘的能力點(AP)。
      Parameters:
      remainingAp - 目標剩餘能力點
    • gainAp

      public void gainAp(short ap)
      為角色增加(或扣除)能力點(AP)並同步至客戶端。

      副作用:透過 chr.updateSingleStat(MapleStat.AVAILABLEAP, …) 送出能力更新封包。

      Parameters:
      ap - 能力點變動量(可為負數以扣除)
    • getHpApUsed

      public short getHpApUsed()
      取得角色已用於增加 HP 的能力點數量。
      Returns:
      已用於 HP 的能力點數量
    • setHpApUsed

      public void setHpApUsed(short hpApUsed)
      設定角色已用於增加 HP 的能力點數量。
      Parameters:
      hpApUsed - 目標 HP 能力點數量
    • getRemainingSp

      public int getRemainingSp()
      取得角色目前主要技能書的剩餘技能點(SP)。

      技能書索引依目前職業由 GameConstants.getSkillBook(int) 決定(預設書)。

      Returns:
      主要技能書的剩餘技能點
    • setRemainingSp

      public void setRemainingSp(int remainingSp)
      設定角色主要技能書的剩餘技能點(SP)。

      技能書索引依目前職業由 GameConstants.getSkillBook(int) 決定(預設書)。

      Parameters:
      remainingSp - 目標剩餘技能點
    • getRemainingSp

      public int getRemainingSp(int skillbook)
      取得指定技能書的剩餘技能點(SP)。
      Parameters:
      skillbook - 技能書索引
      Returns:
      該技能書的剩餘技能點
    • getRemainingSps

      public int[] getRemainingSps()
      取得各技能書剩餘技能點(SP)的完整陣列。

      回傳的是內部陣列本身(非複本),直接修改會影響角色狀態。

      Returns:
      以技能書索引排列的剩餘技能點陣列
    • getRemainingSpSize

      public int getRemainingSpSize()
      計算尚有剩餘技能點的技能書數量。
      Returns:
      剩餘技能點大於 0 的技能書數目
    • setRemainingSp

      public void setRemainingSp(int remainingSp, int skillbook)
      設定指定技能書的剩餘技能點(SP)。
      Parameters:
      remainingSp - 目標剩餘技能點
      skillbook - 技能書索引
    • gainSP

      public void gainSP(int sp)
      為角色主要技能書增加技能點(SP)、同步客戶端並顯示獲得提示。

      技能書索引依目前職業由 GameConstants.getSkillBook(int) 決定(預設書)。副作用: 透過 chr.updateSingleStat(MapleStat.AVAILABLESP, 0) 觸發同步,並向 chr.client 送出 InfoPacket.getSPMsg(byte, short) 顯示獲得的技能點(帶目前職業)。

      Parameters:
      sp - 要增加的技能點數量
    • gainSP

      public void gainSP(int sp, int skillbook)
      為角色指定技能書增加技能點(SP)、同步客戶端並顯示獲得提示。

      副作用:透過 chr.updateSingleStat(MapleStat.AVAILABLESP, 0) 觸發同步,並向 chr.client 送出 InfoPacket.getSPMsg(byte, short) 顯示獲得的技能點(職業參數固定帶 0)。

      Parameters:
      sp - 要增加的技能點數量
      skillbook - 技能書索引
    • resetSP

      public void resetSP(int sp)
      將所有技能書的剩餘技能點(SP)一律重設為指定值並同步客戶端。

      副作用:透過 chr.updateSingleStat(MapleStat.AVAILABLESP, 0) 觸發同步。

      Parameters:
      sp - 每本技能書要設定的剩餘技能點
    • resetSP

      public void resetSP()
      將所有技能書的剩餘技能點(SP)一律歸零並同步客戶端,等同 resetSP(int) 傳入 0