Class CharacterStatsManager
MapleCharacter。
本類別封裝角色升級進程相關的狀態存取與運算:
- 經驗值/等級——
getLevel()/setLevel(short)/getExp()/setExp(int)/getNeededExp(),以及經驗獲得與升級gainExp(int, boolean, boolean, boolean)/gainExpMonster(int, boolean, boolean, byte, int, int, int, boolean, int)/levelUp()(exp/level欄位); - 人氣(fame)——
getFame()/setFame(int)/addFame(int)/updateFame()(fame欄位); - 能力點(AP)——
getRemainingAp()/setRemainingAp(short)/gainAp(short)/getHpApUsed()/setHpApUsed(short)(remainingAp/hpApUsed欄位); - 技能點(SP)——
getRemainingSp()/getRemainingSps()/getRemainingSpSize()/setRemainingSp(int)/gainSP(int)/resetSP(int)(remainingSp欄位)。
MapleCharacter 以**逐字搬移**的方式把這些方法移入此處,並對每個方法保留**簽名完全相同**的
委派(delegate),因此所有 Java 呼叫端與透過 cm/pi 等腳本 API 轉呼的腳本完全不受影響。
協作者僅持有對所屬角色的回參考,透過同 package 存取其進程狀態欄位(exp/fame/
remainingAp/remainingSp/hpApUsed)以及 level/job/stats/
client/map/characterCard(部分於 P5f/P5g/P5k 已放寬)。這些欄位本身仍宣告並
初始化於 MapleCharacter(載入/存檔/戰鬥/屬性運算會直接存取),僅放寬為 package-private。
協作者內部方法之間以**裸名稱**互相呼叫(如 gainExp 內呼叫 getExp/getNeededExp/
setExp/levelUp),與搬移前在 MapleCharacter 內的裸呼叫逐位元組一致;
而仍留在 MapleCharacter 的方法(updateSingleStat/finishAchievement/LevelMsg/
resetStats/silentPartyUpdate/autoJob/isIntern/getTrait/
expirationTask/familyRep/guildUpdate/familyUpdate 等)則以 chr. 轉呼。
-
Method Summary
Modifier and TypeMethodDescriptionvoidaddFame(int famechange) 增加(或扣除)角色人氣值,並同步累積魅力(charm)特性經驗。voidgainAp(short ap) 為角色增加(或扣除)能力點(AP)並同步至客戶端。voidgainExp(int total, boolean show, boolean inChat, boolean white) 為角色增加(或扣除)經驗值,並在達到門檻時觸發升級。voidgainExpMonster(int gain, boolean show, boolean white, byte pty, int Class_Bonus_EXP, int Equipment_Bonus_EXP, int Premium_Bonus_EXP, boolean partyBonusMob, int partyBonusRate) 擊殺怪物後為角色結算經驗值(含各類加成與組隊加成)並在達門檻時升級。voidgainSP(int sp) 為角色主要技能書增加技能點(SP)、同步客戶端並顯示獲得提示。voidgainSP(int sp, int skillbook) 為角色指定技能書增加技能點(SP)、同步客戶端並顯示獲得提示。intgetExp()取得角色目前的經驗值。final intgetFame()取得角色目前的人氣值。short取得角色已用於增加 HP 的能力點數量。final shortgetLevel()取得角色目前的等級。int取得升至下一級所需的總經驗值。short取得角色目前剩餘的能力點(AP)。int取得角色目前主要技能書的剩餘技能點(SP)。intgetRemainingSp(int skillbook) 取得指定技能書的剩餘技能點(SP)。int[]取得各技能書剩餘技能點(SP)的完整陣列。int計算尚有剩餘技能點的技能書數量。voidlevelUp()執行一次角色升級:扣除門檻經驗、提升等級,並依職業配發能力點/技能點與 HP/MP 成長。voidresetSP()將所有技能書的剩餘技能點(SP)一律歸零並同步客戶端,等同resetSP(int)傳入0。voidresetSP(int sp) 將所有技能書的剩餘技能點(SP)一律重設為指定值並同步客戶端。voidsetExp(int exp) 設定角色目前的經驗值。voidsetFame(int fame) 設定角色目前的人氣值。voidsetHpApUsed(short hpApUsed) 設定角色已用於增加 HP 的能力點數量。voidsetLevel(short level) 設定角色等級。voidsetRemainingAp(short remainingAp) 設定角色剩餘的能力點(AP)。voidsetRemainingSp(int remainingSp) 設定角色主要技能書的剩餘技能點(SP)。voidsetRemainingSp(int remainingSp, int skillbook) 設定指定技能書的剩餘技能點(SP)。void將目前人氣值同步至客戶端。
-
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)經驗獲得提示。
會變動所屬角色的
exp/level/remainingAp/remainingSp等狀態。 整個流程包覆於 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)顯示各加成明細。
會變動所屬角色的
exp/level/remainingAp/remainingSp等狀態。- 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.setInfo/recalcLocalStats、送出CWvsContext.updatePlayerStats(Map, MapleCharacter)能力封包, 並向地圖廣播EffectPacket.showForeignEffect(int)升級特效; - 回呼
chr.LevelMsg/silentPartyUpdate/guildUpdate/familyUpdate/autoJob/stats.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。
-