Class DamageParse

java.lang.Object
handling.channel.handler.DamageParse

public class DamageParse extends Object
玩家攻擊封包的「傷害計算與套用」核心,供 PlayerHandler 的各攻擊處理器呼叫。

本類別為一組 static 方法的集合,將已解析的 AttackInfo(近/遠/魔法攻擊) 套用到目標 MapleMonster:驗證合法性與防作弊、依 MapleStatEffectMapleJobSkillFactory 計算與裁切傷害、結算金錢炸彈 (SKILL_MESO_EXPLOSION4211006)、施加命中型狀態(MonsterStatusEffect)與被動 debuff, 並以 CFieldCWvsContext 回送結果。

關鍵協作者:CheatTrackerCheatingOffense(傷害合法性與外掛偵測,如 CheckWZHack)、ElementElementalEffectiveness (屬性相剋)、AttackPair(攻擊目標與傷害配對)、World(廣播)。

  • 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 - 本次攻擊使用的技能;普攻時可為 null
      player - 發動攻擊的玩家
      attackCount - 每次命中的攻擊段數,用於合法性比對
      maxDamagePerMonster - 單隻怪物的單次傷害上限,用於裁切外掛傷害
      effect - 技能的 MapleStatEffect;普攻時可為 null
      attack_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 的魔法攻擊處理器呼叫:依屬性相剋 (ElementElementalEffectiveness)計算並裁切每次命中的傷害 (上限 maxDamagePerHit),結算總傷害、施加命中型狀態與被動 debuff,並廣播攻擊與傷害封包。

      副作用:扣減怪物 HP、廣播攻擊動畫與傷害數字、套用技能效果。 反作弊:死亡中攻擊登記 CheatingOffense.ATTACKING_WHILE_DEAD、攻擊冷卻檢查 (CheatTracker.checkAttack(int, int));不合法則提早中止。

      Parameters:
      attack - 已解析的魔法攻擊資料
      theSkill - 本次攻擊使用的技能
      player - 發動攻擊的玩家
      effect - 技能的 MapleStatEffect
      maxDamagePerHit - 單次命中的傷害上限,用於裁切外掛傷害
    • DivideAttack

      public static final AttackInfo DivideAttack(AttackInfo attack, int rate)
      將攻擊資料中每筆傷害除以指定倍率,並將其標記為非真實攻擊。

      用於分裂/多段技能等需要把單次傷害按比例縮減的情境。會把 attack.real 設為 false, 並就地修改傳入 attackAttackPair 的每個傷害值;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

      public static final AttackInfo parseDmgMa(LittleEndianAccessor lea, MapleCharacter chr)
      從魔法攻擊封包讀取並組裝 AttackInfo(魔法攻擊)。

      依 149.1 版的封包配置,依序讀出目標數/命中數、技能 ID、充能值、各目標物件 ID 與每段傷害、 攻擊座標等欄位,組成攻擊資料供 applyAttackMagic(AttackInfo, Skill, MapleCharacter, MapleStatEffect, double) 套用。只解析、不變更遊戲狀態。

      Parameters:
      lea - 指向魔法攻擊封包酬載的位元組讀取器
      chr - 發動攻擊的玩家
      Returns:
      解析完成的 AttackInfo;若技能 ID >= 91000000(公會/配方等非攻擊封包)則回傳 null
    • parseDmgM

      public static final AttackInfo parseDmgM(LittleEndianAccessor lea, MapleCharacter chr)
      從近戰攻擊封包讀取並組裝 AttackInfo(近戰攻擊)。

      依 149.1 版的封包配置,依序讀出目標數/命中數、技能 ID,並依技能種類處理充能值與額外欄位 (多個技能 ID 有不同的偏移量),再讀出移動速度、attack tick、各目標物件 ID 與每段傷害、 攻擊與技能座標。若技能為金錢炸彈(SKILL_MESO_EXPLOSION)則改委派 parseMesoExplosion(LittleEndianAccessor, AttackInfo, MapleCharacter)。只解析、不變更遊戲狀態。

      Parameters:
      lea - 指向近戰攻擊封包酬載的位元組讀取器
      chr - 發動攻擊的玩家
      Returns:
      解析完成的 AttackInfo;若技能 ID >= 91000000(公會/配方等非攻擊封包)則回傳 null
    • parseDmgR

      public static final AttackInfo parseDmgR(LittleEndianAccessor lea, MapleCharacter chr)
      從遠程攻擊封包讀取並組裝 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 物件