diff --git a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java index 8a882e2a0c..c661d03efc 100644 --- a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java @@ -689,9 +689,10 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { calcDmgMax = chr.calculateMaxBaseDamage(chr.getTotalWatk()); } + StatEffect effect = null; if (ret.skill != 0) { Skill skill = SkillFactory.getSkill(ret.skill); - StatEffect effect = skill.getEffect(ret.skilllevel); + effect = skill.getEffect(ret.skilllevel); if (magic) { // Since the skill is magic based, use the magic formula @@ -930,6 +931,16 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { damage = -Integer.MAX_VALUE + damage - 1; } + if(effect != null) { + int maxattack = Math.max(effect.getBulletCount(), effect.getAttackCount()); + if (shadowPartner) { + maxattack = maxattack * 2; + } + if (ret.numDamage > maxattack) { + AutobanFactory.DAMAGE_HACK.addPoint(chr.getAutobanManager(), "Too many lines: " + ret.numDamage + " Max lines: " + maxattack + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")"); + } + } + allDamageNumbers.add(damage); } if (ret.skill != Corsair.RAPID_FIRE || ret.skill != Aran.HIDDEN_FULL_DOUBLE || ret.skill != Aran.HIDDEN_FULL_TRIPLE || ret.skill != Aran.HIDDEN_OVER_DOUBLE || ret.skill != Aran.HIDDEN_OVER_TRIPLE) {