Class DamageParse
PlayerHandler 的各攻擊處理器呼叫。
本類別為一組 static 方法的集合,將已解析的 AttackInfo(近/遠/魔法攻擊)
套用到目標 MapleMonster:驗證合法性與防作弊、依 MapleStatEffect 與
MapleJob/SkillFactory 計算與裁切傷害、結算金錢炸彈
(SKILL_MESO_EXPLOSION=4211006)、施加命中型狀態(MonsterStatusEffect)與被動 debuff,
並以 CField/CWvsContext 回送結果。
關鍵協作者:CheatTracker/CheatingOffense(傷害合法性與外掛偵測,如
CheckWZHack)、Element/ElementalEffectiveness
(屬性相剋)、AttackPair(攻擊目標與傷害配對)、World(廣播)。
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidapplyAttack(AttackInfo attack, Skill theSkill, MapleCharacter player, int attackCount, double maxDamagePerMonster, MapleStatEffect effect, AttackType attack_type) 將一次已解析的近戰/遠程物理攻擊套用到目標怪物群。static final voidapplyAttackMagic(AttackInfo attack, Skill theSkill, MapleCharacter player, MapleStatEffect effect, double maxDamagePerHit) 將一次已解析的魔法攻擊套用到目標怪物群。static final AttackInfoDivideAttack(AttackInfo attack, int rate) 將攻擊資料中每筆傷害除以指定倍率,並將其標記為非真實攻擊。static final AttackInfoModify_AttackCrit(AttackInfo attack, MapleCharacter chr, int type, MapleStatEffect effect) 依玩家爆擊率與技能規則,重新標記攻擊資料中各次命中是否為爆擊。static final AttackInfoparseDmgM(LittleEndianAccessor lea, MapleCharacter chr) 從近戰攻擊封包讀取並組裝AttackInfo(近戰攻擊)。static final AttackInfoparseDmgMa(LittleEndianAccessor lea, MapleCharacter chr) 從魔法攻擊封包讀取並組裝AttackInfo(魔法攻擊)。static final AttackInfoparseDmgR(LittleEndianAccessor lea, MapleCharacter chr) 從遠程攻擊封包讀取並組裝AttackInfo(遠程/射擊攻擊)。static final AttackInfoparseMesoExplosion(LittleEndianAccessor lea, AttackInfo ret, MapleCharacter chr) 解析金錢炸彈(Meso Explosion,SKILL_MESO_EXPLOSION)封包的特殊傷害格式。
-
Constructor Details
-
DamageParse
public DamageParse()
-
-
Method Details
-
applyAttack
public static void applyAttack(AttackInfo attack, Skill theSkill, MapleCharacter player, int attackCount, double maxDamagePerMonster, MapleStatEffect effect, AttackType attack_type) 將一次已解析的近戰/遠程物理攻擊套用到目標怪物群。本方法是
PlayerHandler各物理攻擊處理器的傷害結算核心:逐一驗證合法性、 對每隻目標怪物裁切傷害上限(maxDamagePerMonster)、累計總傷害、結算金錢炸彈 (SKILL_MESO_EXPLOSION)、施加命中型狀態與被動 debuff,並透過MapleMonster.damage(MapleCharacter, long, boolean)/MapleMap廣播攻擊與傷害封包。副作用:扣減怪物 HP、可能觸發掉落/經驗結算、廣播攻擊動畫與傷害數字、套用技能效果。 反作弊:死亡中攻擊登記
CheatingOffense.ATTACKING_WHILE_DEAD、攻擊冷卻檢查 (CheatTracker.checkAttack(int, int))、CheckWZHack命中數合法性檢查;不合法則提早中止並回送CWvsContext.enableActions()。- Parameters:
attack- 已解析的攻擊資料(目標、命中、傷害、技能 ID 等)theSkill- 本次攻擊使用的技能;普攻時可為nullplayer- 發動攻擊的玩家attackCount- 每次命中的攻擊段數,用於合法性比對maxDamagePerMonster- 單隻怪物的單次傷害上限,用於裁切外掛傷害effect- 技能的MapleStatEffect;普攻時可為nullattack_type- 攻擊類型(近戰/遠程/召喚獸等)
-
applyAttackMagic
public static final void applyAttackMagic(AttackInfo attack, Skill theSkill, MapleCharacter player, MapleStatEffect effect, double maxDamagePerHit) 將一次已解析的魔法攻擊套用到目標怪物群。applyAttack(AttackInfo, Skill, MapleCharacter, int, double, MapleStatEffect, AttackType)的魔法版本,供PlayerHandler的魔法攻擊處理器呼叫:依屬性相剋 (Element/ElementalEffectiveness)計算並裁切每次命中的傷害 (上限maxDamagePerHit),結算總傷害、施加命中型狀態與被動 debuff,並廣播攻擊與傷害封包。副作用:扣減怪物 HP、廣播攻擊動畫與傷害數字、套用技能效果。 反作弊:死亡中攻擊登記
CheatingOffense.ATTACKING_WHILE_DEAD、攻擊冷卻檢查 (CheatTracker.checkAttack(int, int));不合法則提早中止。- Parameters:
attack- 已解析的魔法攻擊資料theSkill- 本次攻擊使用的技能player- 發動攻擊的玩家effect- 技能的MapleStatEffectmaxDamagePerHit- 單次命中的傷害上限,用於裁切外掛傷害
-
DivideAttack
將攻擊資料中每筆傷害除以指定倍率,並將其標記為非真實攻擊。用於分裂/多段技能等需要把單次傷害按比例縮減的情境。會把
attack.real設為false, 並就地修改傳入attack內AttackPair的每個傷害值;rate <= 1時原樣返回。- Parameters:
attack- 待縮減的攻擊資料(會被就地修改)rate- 傷害除數倍率- Returns:
- 縮減後的同一個
attack物件
-
Modify_AttackCrit
public static final AttackInfo Modify_AttackCrit(AttackInfo attack, MapleCharacter chr, int type, MapleStatEffect effect) 依玩家爆擊率與技能規則,重新標記攻擊資料中各次命中是否為爆擊。於套用傷害前呼叫,就地修改
attack內每筆傷害的爆擊旗標:以PlayerStats.passive_sharpeye_rate()加上技能爆擊率(MapleStatEffect.getCr())為基礎, 並處理多個特例——某些技能(金錢炸彈、冰風暴、暗影金錢等)永不爆擊;狙擊/特定技能必定爆擊; 暗影夥伴(MapleBuffStat.SHADOWPARTNER)會將後半段命中的爆擊複製到前半段;傷害超過999999視為必爆。- Parameters:
attack- 待標記爆擊的攻擊資料(會被就地修改)chr- 發動攻擊的玩家,用於取得爆擊率與增益type- 攻擊類型(影響暗影夥伴判定)effect- 技能的MapleStatEffect;可為null- Returns:
- 標記完成後的同一個
attack物件
-
parseDmgMa
從魔法攻擊封包讀取並組裝AttackInfo(魔法攻擊)。依 149.1 版的封包配置,依序讀出目標數/命中數、技能 ID、充能值、各目標物件 ID 與每段傷害、 攻擊座標等欄位,組成攻擊資料供
applyAttackMagic(AttackInfo, Skill, MapleCharacter, MapleStatEffect, double)套用。只解析、不變更遊戲狀態。- Parameters:
lea- 指向魔法攻擊封包酬載的位元組讀取器chr- 發動攻擊的玩家- Returns:
- 解析完成的
AttackInfo;若技能 ID>= 91000000(公會/配方等非攻擊封包)則回傳null
-
parseDmgM
從近戰攻擊封包讀取並組裝AttackInfo(近戰攻擊)。依 149.1 版的封包配置,依序讀出目標數/命中數、技能 ID,並依技能種類處理充能值與額外欄位 (多個技能 ID 有不同的偏移量),再讀出移動速度、attack tick、各目標物件 ID 與每段傷害、 攻擊與技能座標。若技能為金錢炸彈(
SKILL_MESO_EXPLOSION)則改委派parseMesoExplosion(LittleEndianAccessor, AttackInfo, MapleCharacter)。只解析、不變更遊戲狀態。- Parameters:
lea- 指向近戰攻擊封包酬載的位元組讀取器chr- 發動攻擊的玩家- Returns:
- 解析完成的
AttackInfo;若技能 ID>= 91000000(公會/配方等非攻擊封包)則回傳null
-
parseDmgR
從遠程攻擊封包讀取並組裝AttackInfo(遠程/射擊攻擊)。依 149.1 版的封包配置解析遠程攻擊:除目標數/命中數、技能 ID、充能值、武器類別、移動速度、 attack tick、各目標物件 ID 與每段傷害、座標外,另讀取所用子彈(投擲物)的物品 ID 與道具欄位置。 只解析、不變更遊戲狀態。
- Parameters:
lea- 指向遠程攻擊封包酬載的位元組讀取器chr- 發動攻擊的玩家- Returns:
- 解析完成的
AttackInfo;若技能 ID>= 91000000(公會/配方等非攻擊封包)則回傳null
-
parseMesoExplosion
public static final AttackInfo parseMesoExplosion(LittleEndianAccessor lea, AttackInfo ret, MapleCharacter chr) 解析金錢炸彈(Meso Explosion,SKILL_MESO_EXPLOSION)封包的特殊傷害格式。由
parseDmgM(LittleEndianAccessor, MapleCharacter)在偵測到金錢炸彈技能時委派呼叫。金錢炸彈以場上的金錢堆作為炸彈,封包配置 與一般攻擊不同:依命中數讀出引爆的金錢堆物件 ID,以及對各目標的每段傷害(金錢炸彈不會爆擊), 將結果補入傳入的ret。只解析、不變更遊戲狀態。- Parameters:
lea- 指向金錢炸彈封包酬載的位元組讀取器ret- 由parseDmgM(LittleEndianAccessor, MapleCharacter)部分填好的攻擊資料(會被就地補完)chr- 發動攻擊的玩家- Returns:
- 補完傷害後的同一個
ret物件
-