Reformat and clean up "net" package
This commit is contained in:
@@ -57,16 +57,18 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
public boolean ranged, magic;
|
||||
public int speed = 4;
|
||||
public Point position = new Point();
|
||||
|
||||
|
||||
public StatEffect getAttackEffect(Character chr, Skill theSkill) {
|
||||
Skill mySkill = theSkill;
|
||||
if (mySkill == null) {
|
||||
mySkill = SkillFactory.getSkill(skill);
|
||||
}
|
||||
|
||||
|
||||
int skillLevel = chr.getSkillLevel(mySkill);
|
||||
if(skillLevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(mySkill.getId())) skillLevel = 1;
|
||||
|
||||
if (skillLevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(mySkill.getId())) {
|
||||
skillLevel = 1;
|
||||
}
|
||||
|
||||
if (skillLevel == 0) {
|
||||
return null;
|
||||
}
|
||||
@@ -85,7 +87,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (map.isOwnershipRestricted(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Skill theSkill = null;
|
||||
StatEffect attackEffect = null;
|
||||
final int job = player.getJob().getId();
|
||||
@@ -108,20 +110,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
int mobCount = attackEffect.getMobCount();
|
||||
if (attack.skill != Cleric.HEAL) {
|
||||
if (player.isAlive()) {
|
||||
if(attack.skill == Aran.BODY_PRESSURE || attack.skill == Marauder.ENERGY_CHARGE || attack.skill == ThunderBreaker.ENERGY_CHARGE) { // thanks IxianMace for noticing Energy Charge skills refreshing on touch
|
||||
if (attack.skill == Aran.BODY_PRESSURE || attack.skill == Marauder.ENERGY_CHARGE || attack.skill == ThunderBreaker.ENERGY_CHARGE) { // thanks IxianMace for noticing Energy Charge skills refreshing on touch
|
||||
// prevent touch dmg skills refreshing
|
||||
} else if(attack.skill == DawnWarrior.FINAL_ATTACK || attack.skill == WindArcher.FINAL_ATTACK) {
|
||||
} else if (attack.skill == DawnWarrior.FINAL_ATTACK || attack.skill == WindArcher.FINAL_ATTACK) {
|
||||
// prevent cygnus FA refreshing
|
||||
mobCount = 15;
|
||||
} else if(attack.skill == NightWalker.POISON_BOMB) {// Poison Bomb
|
||||
} else if (attack.skill == NightWalker.POISON_BOMB) {// Poison Bomb
|
||||
attackEffect.applyTo(player, new Point(attack.position.x, attack.position.y));
|
||||
} else {
|
||||
attackEffect.applyTo(player);
|
||||
|
||||
|
||||
if (attack.skill == Page.FINAL_ATTACK_BW || attack.skill == Page.FINAL_ATTACK_SWORD || attack.skill == Fighter.FINAL_ATTACK_SWORD
|
||||
|| attack.skill == Fighter.FINAL_ATTACK_AXE || attack.skill == Spearman.FINAL_ATTACK_SPEAR || attack.skill == Spearman.FINAL_ATTACK_POLEARM
|
||||
|| attack.skill == Hunter.FINAL_ATTACK || attack.skill == Crossbowman.FINAL_ATTACK) {
|
||||
|
||||
|
||||
mobCount = 15;//:(
|
||||
} else if (attack.skill == Aran.HIDDEN_FULL_DOUBLE || attack.skill == Aran.HIDDEN_FULL_TRIPLE || attack.skill == Aran.HIDDEN_OVER_DOUBLE || attack.skill == Aran.HIDDEN_OVER_TRIPLE) {
|
||||
mobCount = 12;
|
||||
@@ -131,7 +133,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
player.sendPacket(PacketCreator.enableActions());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (attack.numAttacked > mobCount) {
|
||||
AutobanFactory.MOB_COUNT.autoban(player, "Skill: " + attack.skill + "; Count: " + attack.numAttacked + " Max: " + attackEffect.getMobCount());
|
||||
return;
|
||||
@@ -145,7 +147,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
/*if (attackCount != attack.numDamage && attack.skill != ChiefBandit.MESO_EXPLOSION && attack.skill != NightWalker.VAMPIRE && attack.skill != WindArcher.WIND_SHOT && attack.skill != Aran.COMBO_SMASH && attack.skill != Aran.COMBO_FENRIR && attack.skill != Aran.COMBO_TEMPEST && attack.skill != NightLord.NINJA_AMBUSH && attack.skill != Shadower.NINJA_AMBUSH) {
|
||||
return;
|
||||
}*/
|
||||
|
||||
|
||||
int totDamage = 0;
|
||||
|
||||
if (attack.skill == ChiefBandit.MESO_EXPLOSION) {
|
||||
@@ -154,30 +156,30 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
MapObject mapobject = map.getMapObject(oned);
|
||||
if (mapobject != null && mapobject.getType() == MapObjectType.ITEM) {
|
||||
final MapItem mapitem = (MapItem) mapobject;
|
||||
if (mapitem.getMeso() == 0) { //Maybe it is possible some how?
|
||||
if (mapitem.getMeso() == 0) { //Maybe it is possible some how?
|
||||
return;
|
||||
}
|
||||
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
TimerManager.getInstance().schedule(() -> {
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
map.pickItemDrop(PacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem);
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
TimerManager.getInstance().schedule(() -> {
|
||||
mapitem.lockItem();
|
||||
try {
|
||||
if (mapitem.isPickedUp()) {
|
||||
return;
|
||||
}
|
||||
}, delay);
|
||||
delay += 100;
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
}
|
||||
map.pickItemDrop(PacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem);
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
}
|
||||
}, delay);
|
||||
delay += 100;
|
||||
} finally {
|
||||
mapitem.unlockItem();
|
||||
}
|
||||
} else if (mapobject != null && mapobject.getType() != MapObjectType.MONSTER) {
|
||||
return;
|
||||
}
|
||||
@@ -185,42 +187,42 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
for (Integer oned : attack.allDamage.keySet()) {
|
||||
final Monster monster = map.getMonsterByOid(oned);
|
||||
if (monster != null) {
|
||||
if (monster != null) {
|
||||
double distance = player.getPosition().distanceSq(monster.getPosition());
|
||||
double distanceToDetect = 200000.0;
|
||||
|
||||
if(attack.ranged)
|
||||
|
||||
if (attack.ranged) {
|
||||
distanceToDetect += 400000;
|
||||
|
||||
if(attack.magic)
|
||||
}
|
||||
|
||||
if (attack.magic) {
|
||||
distanceToDetect += 200000;
|
||||
|
||||
if(player.getJob().isA(Job.ARAN1))
|
||||
}
|
||||
|
||||
if (player.getJob().isA(Job.ARAN1)) {
|
||||
distanceToDetect += 200000; // Arans have extra range over normal warriors.
|
||||
|
||||
if(attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.BODY_PRESSURE)
|
||||
}
|
||||
|
||||
if (attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.BODY_PRESSURE) {
|
||||
distanceToDetect += 40000;
|
||||
|
||||
else if(attack.skill == Bishop.GENESIS || attack.skill == ILArchMage.BLIZZARD || attack.skill == FPArchMage.METEOR_SHOWER)
|
||||
} else if (attack.skill == Bishop.GENESIS || attack.skill == ILArchMage.BLIZZARD || attack.skill == FPArchMage.METEOR_SHOWER) {
|
||||
distanceToDetect += 275000;
|
||||
|
||||
else if(attack.skill == Hero.BRANDISH || attack.skill == DragonKnight.SPEAR_CRUSHER || attack.skill == DragonKnight.POLE_ARM_CRUSHER)
|
||||
} else if (attack.skill == Hero.BRANDISH || attack.skill == DragonKnight.SPEAR_CRUSHER || attack.skill == DragonKnight.POLE_ARM_CRUSHER) {
|
||||
distanceToDetect += 40000;
|
||||
|
||||
else if(attack.skill == DragonKnight.DRAGON_ROAR || attack.skill == SuperGM.SUPER_DRAGON_ROAR)
|
||||
} else if (attack.skill == DragonKnight.DRAGON_ROAR || attack.skill == SuperGM.SUPER_DRAGON_ROAR) {
|
||||
distanceToDetect += 250000;
|
||||
|
||||
else if(attack.skill == Shadower.BOOMERANG_STEP)
|
||||
} else if (attack.skill == Shadower.BOOMERANG_STEP) {
|
||||
distanceToDetect += 60000;
|
||||
|
||||
}
|
||||
|
||||
if (distance > distanceToDetect) {
|
||||
AutobanFactory.DISTANCE_HACK.alert(player, "Distance Sq to monster: " + distance + " SID: " + attack.skill + " MID: " + monster.getId());
|
||||
monster.refreshMobPosition();
|
||||
}
|
||||
|
||||
|
||||
int totDamageToOneMonster = 0;
|
||||
List<Integer> onedList = attack.allDamage.get(oned);
|
||||
|
||||
|
||||
if (attack.magic) { // thanks BHB, Alex (CanIGetaPR) for noticing no immunity status check here
|
||||
if (monster.isBuffed(MonsterStatus.MAGIC_IMMUNITY)) {
|
||||
Collections.fill(onedList, 1);
|
||||
@@ -230,7 +232,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
Collections.fill(onedList, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (GameConstants.isDojoBoss(monster.getId())) {
|
||||
if (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009) {
|
||||
int dmgLimit = (int) Math.ceil(0.3 * monster.getMaxHp());
|
||||
@@ -238,13 +240,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
for (Integer i : onedList) {
|
||||
_onedList.add(i < dmgLimit ? i : dmgLimit);
|
||||
}
|
||||
|
||||
|
||||
onedList = _onedList;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (Integer eachd : onedList) {
|
||||
if(eachd < 0) eachd += Integer.MAX_VALUE;
|
||||
if (eachd < 0) {
|
||||
eachd += Integer.MAX_VALUE;
|
||||
}
|
||||
totDamageToOneMonster += eachd;
|
||||
}
|
||||
totDamage += totDamageToOneMonster;
|
||||
@@ -252,18 +256,19 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (player.getBuffedValue(BuffStat.PICKPOCKET) != null && (attack.skill == 0 || attack.skill == Rogue.DOUBLE_STAB || attack.skill == Bandit.SAVAGE_BLOW || attack.skill == ChiefBandit.ASSAULTER || attack.skill == ChiefBandit.BAND_OF_THIEVES || attack.skill == Shadower.ASSASSINATE || attack.skill == Shadower.TAUNT || attack.skill == Shadower.BOOMERANG_STEP)) {
|
||||
Skill pickpocket = SkillFactory.getSkill(ChiefBandit.PICKPOCKET);
|
||||
int picklv = (player.isGM()) ? pickpocket.getMaxLevel() : player.getSkillLevel(pickpocket);
|
||||
if(picklv > 0) {
|
||||
if (picklv > 0) {
|
||||
int delay = 0;
|
||||
final int maxmeso = player.getBuffedValue(BuffStat.PICKPOCKET);
|
||||
for (Integer eachd : onedList) {
|
||||
for (Integer eachd : onedList) {
|
||||
eachd += Integer.MAX_VALUE;
|
||||
|
||||
if (pickpocket.getEffect(picklv).makeChanceResult()) {
|
||||
final int eachdf;
|
||||
if(eachd < 0)
|
||||
eachdf = eachd + Integer.MAX_VALUE;
|
||||
else
|
||||
eachdf = eachd;
|
||||
if (eachd < 0) {
|
||||
eachdf = eachd + Integer.MAX_VALUE;
|
||||
} else {
|
||||
eachdf = eachd;
|
||||
}
|
||||
|
||||
TimerManager.getInstance().schedule(() -> map.spawnMesoDrop(Math.min((int) Math.max(((double) eachdf / (double) 20000) * (double) maxmeso, 1), maxmeso), new Point((int) (monster.getPosition().getX() + Randomizer.nextInt(100) - 50), (int) (monster.getPosition().getY())), monster, player, true, (byte) 2), delay);
|
||||
delay += 100;
|
||||
@@ -277,18 +282,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (monster.getStolen().size() < 1) { // One steal per mob <3
|
||||
if (steal.getEffect(player.getSkillLevel(steal)).makeChanceResult()) {
|
||||
monster.addStolen(0);
|
||||
|
||||
|
||||
MonsterInformationProvider mi = MonsterInformationProvider.getInstance();
|
||||
List<Integer> dropPool = mi.retrieveDropPool(monster.getId());
|
||||
if(!dropPool.isEmpty()) {
|
||||
if (!dropPool.isEmpty()) {
|
||||
int rndPool = (int) Math.floor(Math.random() * dropPool.get(dropPool.size() - 1));
|
||||
|
||||
|
||||
int i = 0;
|
||||
while(rndPool >= dropPool.get(i)) i++;
|
||||
|
||||
while (rndPool >= dropPool.get(i)) {
|
||||
i++;
|
||||
}
|
||||
|
||||
List<MonsterDropEntry> toSteal = new ArrayList<>();
|
||||
toSteal.add(mi.retrieveDrop(monster.getId()).get(i));
|
||||
|
||||
|
||||
map.dropItemsFromMonster(toSteal, player, monster);
|
||||
monster.addStolen(toSteal.get(0).itemId);
|
||||
}
|
||||
@@ -311,15 +318,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (player.isAran()) {
|
||||
if (player.getBuffedValue(BuffStat.WK_CHARGE) != null) {
|
||||
if (player.getBuffedValue(BuffStat.WK_CHARGE) != null) {
|
||||
Skill snowCharge = SkillFactory.getSkill(Aran.SNOW_CHARGE);
|
||||
if (totDamageToOneMonster > 0) {
|
||||
MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.SPEED, snowCharge.getEffect(player.getSkillLevel(snowCharge)).getX()), snowCharge, null, false);
|
||||
monster.applyStatus(player, monsterStatusEffect, false, snowCharge.getEffect(player.getSkillLevel(snowCharge)).getY() * 1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (player.getBuffedValue(BuffStat.HAMSTRING) != null) {
|
||||
Skill hamstring = SkillFactory.getSkill(Bowmaster.HAMSTRING);
|
||||
@@ -348,14 +355,14 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
if (player.isBuffFrom(BuffStat.WK_CHARGE, chargeSkill)) {
|
||||
if (totDamageToOneMonster > 0) {
|
||||
if (charge == WhiteKnight.BW_ICE_CHARGE || charge == WhiteKnight.SWORD_ICE_CHARGE) {
|
||||
monster.setTempEffectiveness(Element.ICE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000);
|
||||
monster.setTempEffectiveness(Element.ICE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000);
|
||||
break;
|
||||
}
|
||||
if (charge == WhiteKnight.BW_FIRE_CHARGE || charge == WhiteKnight.SWORD_FIRE_CHARGE) {
|
||||
monster.setTempEffectiveness(Element.FIRE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (job == 122) {
|
||||
@@ -389,15 +396,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (job >= 311 && job <= 322) {
|
||||
if (!monster.isBoss()) {
|
||||
} else if (job >= 311 && job <= 322) {
|
||||
if (!monster.isBoss()) {
|
||||
Skill mortalBlow;
|
||||
if (job == 311 || job == 312) {
|
||||
mortalBlow = SkillFactory.getSkill(Ranger.MORTAL_BLOW);
|
||||
} else {
|
||||
mortalBlow = SkillFactory.getSkill(Sniper.MORTAL_BLOW);
|
||||
}
|
||||
|
||||
|
||||
int skillLevel = player.getSkillLevel(mortalBlow);
|
||||
if (skillLevel > 0) {
|
||||
StatEffect mortal = mortalBlow.getEffect(skillLevel);
|
||||
@@ -407,24 +414,24 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (attack.skill != 0) {
|
||||
if (attackEffect.getFixDamage() != -1) {
|
||||
if (totDamageToOneMonster != attackEffect.getFixDamage() && totDamageToOneMonster != 0) {
|
||||
AutobanFactory.FIX_DAMAGE.autoban(player, totDamageToOneMonster + " damage");
|
||||
}
|
||||
|
||||
|
||||
int threeSnailsId = player.getJobType() * 10000000 + 1000;
|
||||
if(attack.skill == threeSnailsId) {
|
||||
if(YamlConfig.config.server.USE_ULTRA_THREE_SNAILS) {
|
||||
if (attack.skill == threeSnailsId) {
|
||||
if (YamlConfig.config.server.USE_ULTRA_THREE_SNAILS) {
|
||||
int skillLv = player.getSkillLevel(threeSnailsId);
|
||||
|
||||
if(skillLv > 0) {
|
||||
if (skillLv > 0) {
|
||||
AbstractPlayerInteraction api = player.getAbstractPlayerInteraction();
|
||||
|
||||
int shellId;
|
||||
switch(skillLv) {
|
||||
switch (skillLv) {
|
||||
case 1:
|
||||
shellId = 4000019;
|
||||
break;
|
||||
@@ -437,7 +444,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
shellId = 4000016;
|
||||
}
|
||||
|
||||
if(api.haveItem(shellId, 1)) {
|
||||
if (api.haveItem(shellId, 1)) {
|
||||
api.gainItem(shellId, (short) -1, false);
|
||||
totDamageToOneMonster *= player.getLevel();
|
||||
} else {
|
||||
@@ -452,36 +459,36 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
if (totDamageToOneMonster > 0 && attackEffect != null) {
|
||||
Map<MonsterStatus, Integer> attackEffectStati = attackEffect.getMonsterStati();
|
||||
if(!attackEffectStati.isEmpty()) {
|
||||
if (!attackEffectStati.isEmpty()) {
|
||||
if (attackEffect.makeChanceResult()) {
|
||||
monster.applyStatus(player, new MonsterStatusEffect(attackEffectStati, theSkill, null, false), attackEffect.isPoison(), attackEffect.getDuration());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (attack.skill == Paladin.HEAVENS_HAMMER) {
|
||||
if(!monster.isBoss()) {
|
||||
if (!monster.isBoss()) {
|
||||
damageMonsterWithSkill(player, map, monster, monster.getHp() - 1, attack.skill, 1777);
|
||||
} else {
|
||||
int HHDmg = (player.calculateMaxBaseDamage(player.getTotalWatk()) * (SkillFactory.getSkill(Paladin.HEAVENS_HAMMER).getEffect(player.getSkillLevel(SkillFactory.getSkill(Paladin.HEAVENS_HAMMER))).getDamage() / 100));
|
||||
damageMonsterWithSkill(player, map, monster, (int) (Math.floor(Math.random() * (HHDmg / 5) + HHDmg * .8)), attack.skill, 1777);
|
||||
}
|
||||
} else if (attack.skill == Aran.COMBO_TEMPEST) {
|
||||
if(!monster.isBoss()) {
|
||||
if (!monster.isBoss()) {
|
||||
damageMonsterWithSkill(player, map, monster, monster.getHp(), attack.skill, 0);
|
||||
} else {
|
||||
int TmpDmg = (player.calculateMaxBaseDamage(player.getTotalWatk()) * (SkillFactory.getSkill(Aran.COMBO_TEMPEST).getEffect(player.getSkillLevel(SkillFactory.getSkill(Aran.COMBO_TEMPEST))).getDamage() / 100));
|
||||
damageMonsterWithSkill(player, map, monster, (int) (Math.floor(Math.random() * (TmpDmg / 5) + TmpDmg * .8)), attack.skill, 0);
|
||||
}
|
||||
} else {
|
||||
if(attack.skill == Aran.BODY_PRESSURE) {
|
||||
if (attack.skill == Aran.BODY_PRESSURE) {
|
||||
map.broadcastMessage(PacketCreator.damageMonster(monster.getObjectId(), totDamageToOneMonster));
|
||||
}
|
||||
|
||||
|
||||
map.damageMonster(player, monster, totDamageToOneMonster);
|
||||
}
|
||||
if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) {
|
||||
List<Pair<Integer, Integer>> mobSkills = monster.getSkills();
|
||||
|
||||
|
||||
for (Pair<Integer, Integer> ms : mobSkills) {
|
||||
if (ms.left == 145) {
|
||||
MobSkill toUse = MobSkillFactory.getMobSkill(ms.left, ms.right);
|
||||
@@ -489,10 +496,10 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getX(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (monster.isBuffed(MonsterStatus.MAGIC_REFLECT) && attack.magic) {
|
||||
List<Pair<Integer, Integer>> mobSkills = monster.getSkills();
|
||||
|
||||
|
||||
for (Pair<Integer, Integer> ms : mobSkills) {
|
||||
if (ms.left == 145) {
|
||||
MobSkill toUse = MobSkillFactory.getMobSkill(ms.left, ms.right);
|
||||
@@ -510,11 +517,14 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
|
||||
private static void damageMonsterWithSkill(final Character attacker, final MapleMap map, final Monster monster, final int damage, int skillid, int fixedTime) {
|
||||
int animationTime;
|
||||
|
||||
if(fixedTime == 0) animationTime = SkillFactory.getSkill(skillid).getAnimationTime();
|
||||
else animationTime = fixedTime;
|
||||
|
||||
if(animationTime > 0) { // be sure to only use LIMITED ATTACKS with animation time here
|
||||
|
||||
if (fixedTime == 0) {
|
||||
animationTime = SkillFactory.getSkill(skillid).getAnimationTime();
|
||||
} else {
|
||||
animationTime = fixedTime;
|
||||
}
|
||||
|
||||
if (animationTime > 0) { // be sure to only use LIMITED ATTACKS with animation time here
|
||||
TimerManager.getInstance().schedule(() -> {
|
||||
map.broadcastMessage(PacketCreator.damageMonster(monster.getObjectId(), damage), monster.getPosition());
|
||||
map.damageMonster(attacker, monster, damage);
|
||||
@@ -524,9 +534,9 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
map.damageMonster(attacker, monster, damage);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected AttackInfo parseDamage(InPacket p, Character chr, boolean ranged, boolean magic) {
|
||||
//2C 00 00 01 91 A1 12 00 A5 57 62 FC E2 75 99 10 00 47 80 01 04 01 C6 CC 02 DD FF 5F 00
|
||||
//2C 00 00 01 91 A1 12 00 A5 57 62 FC E2 75 99 10 00 47 80 01 04 01 C6 CC 02 DD FF 5F 00
|
||||
AttackInfo ret = new AttackInfo();
|
||||
p.readByte();
|
||||
ret.numAttackedAndDamage = p.readByte();
|
||||
@@ -536,18 +546,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
ret.skill = p.readInt();
|
||||
ret.ranged = ranged;
|
||||
ret.magic = magic;
|
||||
|
||||
|
||||
if (ret.skill > 0) {
|
||||
ret.skilllevel = chr.getSkillLevel(ret.skill);
|
||||
if(ret.skilllevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(ret.skill)) ret.skilllevel = 1;
|
||||
if (ret.skilllevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(ret.skill)) {
|
||||
ret.skilllevel = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ret.skill == Evan.ICE_BREATH || ret.skill == Evan.FIRE_BREATH || ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB) {
|
||||
ret.charge = p.readInt();
|
||||
} else {
|
||||
ret.charge = 0;
|
||||
}
|
||||
|
||||
|
||||
p.skip(8);
|
||||
ret.display = p.readByte();
|
||||
ret.direction = p.readByte();
|
||||
@@ -602,56 +614,60 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
ret.speed = p.readByte();
|
||||
p.skip(4);
|
||||
}
|
||||
|
||||
|
||||
// Find the base damage to base futher calculations on.
|
||||
// Several skills have their own formula in this section.
|
||||
long calcDmgMax;
|
||||
|
||||
if(magic && ret.skill != 0) { // thanks onechord for noticing a few false positives stemming from maxdmg as 0
|
||||
|
||||
if (magic && ret.skill != 0) { // thanks onechord for noticing a few false positives stemming from maxdmg as 0
|
||||
calcDmgMax = (long) (Math.ceil((chr.getTotalMagic() * Math.ceil(chr.getTotalMagic() / 1000.0) + chr.getTotalMagic()) / 30.0) + Math.ceil(chr.getTotalInt() / 200.0));
|
||||
} else if(ret.skill == 4001344 || ret.skill == NightWalker.LUCKY_SEVEN || ret.skill == NightLord.TRIPLE_THROW) {
|
||||
} else if (ret.skill == 4001344 || ret.skill == NightWalker.LUCKY_SEVEN || ret.skill == NightLord.TRIPLE_THROW) {
|
||||
calcDmgMax = (long) ((chr.getTotalLuk() * 5) * Math.ceil(chr.getTotalWatk() / 100.0));
|
||||
} else if(ret.skill == DragonKnight.DRAGON_ROAR) {
|
||||
} else if (ret.skill == DragonKnight.DRAGON_ROAR) {
|
||||
calcDmgMax = (long) ((chr.getTotalStr() * 4 + chr.getTotalDex()) * Math.ceil(chr.getTotalWatk() / 100.0));
|
||||
} else if(ret.skill == NightLord.VENOMOUS_STAR || ret.skill == Shadower.VENOMOUS_STAB) {
|
||||
} else if (ret.skill == NightLord.VENOMOUS_STAR || ret.skill == Shadower.VENOMOUS_STAB) {
|
||||
calcDmgMax = (long) (Math.ceil((18.5 * (chr.getTotalStr() + chr.getTotalLuk()) + chr.getTotalDex() * 2) / 100.0) * chr.calculateMaxBaseDamage(chr.getTotalWatk()));
|
||||
} else {
|
||||
calcDmgMax = chr.calculateMaxBaseDamage(chr.getTotalWatk());
|
||||
}
|
||||
|
||||
if(ret.skill != 0) {
|
||||
if (ret.skill != 0) {
|
||||
Skill skill = SkillFactory.getSkill(ret.skill);
|
||||
StatEffect effect = skill.getEffect(ret.skilllevel);
|
||||
|
||||
if (magic) {
|
||||
// Since the skill is magic based, use the magic formula
|
||||
if(chr.getJob() == Job.IL_ARCHMAGE || chr.getJob() == Job.IL_MAGE) {
|
||||
if (chr.getJob() == Job.IL_ARCHMAGE || chr.getJob() == Job.IL_MAGE) {
|
||||
int skillLvl = chr.getSkillLevel(ILMage.ELEMENT_AMPLIFICATION);
|
||||
if(skillLvl > 0)
|
||||
if (skillLvl > 0) {
|
||||
calcDmgMax = calcDmgMax * SkillFactory.getSkill(ILMage.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
|
||||
} else if(chr.getJob() == Job.FP_ARCHMAGE || chr.getJob() == Job.FP_MAGE) {
|
||||
}
|
||||
} else if (chr.getJob() == Job.FP_ARCHMAGE || chr.getJob() == Job.FP_MAGE) {
|
||||
int skillLvl = chr.getSkillLevel(FPMage.ELEMENT_AMPLIFICATION);
|
||||
if(skillLvl > 0)
|
||||
if (skillLvl > 0) {
|
||||
calcDmgMax = calcDmgMax * SkillFactory.getSkill(FPMage.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
|
||||
} else if(chr.getJob() == Job.BLAZEWIZARD3 || chr.getJob() == Job.BLAZEWIZARD4) {
|
||||
}
|
||||
} else if (chr.getJob() == Job.BLAZEWIZARD3 || chr.getJob() == Job.BLAZEWIZARD4) {
|
||||
int skillLvl = chr.getSkillLevel(BlazeWizard.ELEMENT_AMPLIFICATION);
|
||||
if(skillLvl > 0)
|
||||
if (skillLvl > 0) {
|
||||
calcDmgMax = calcDmgMax * SkillFactory.getSkill(BlazeWizard.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
|
||||
} else if(chr.getJob() == Job.EVAN7 || chr.getJob() == Job.EVAN8 || chr.getJob() == Job.EVAN9 || chr.getJob() == Job.EVAN10) {
|
||||
}
|
||||
} else if (chr.getJob() == Job.EVAN7 || chr.getJob() == Job.EVAN8 || chr.getJob() == Job.EVAN9 || chr.getJob() == Job.EVAN10) {
|
||||
int skillLvl = chr.getSkillLevel(Evan.MAGIC_AMPLIFICATION);
|
||||
if(skillLvl > 0)
|
||||
if (skillLvl > 0) {
|
||||
calcDmgMax = calcDmgMax * SkillFactory.getSkill(Evan.MAGIC_AMPLIFICATION).getEffect(skillLvl).getY() / 100;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
calcDmgMax *= effect.getMatk();
|
||||
if(ret.skill == Cleric.HEAL) {
|
||||
if (ret.skill == Cleric.HEAL) {
|
||||
// This formula is still a bit wonky, but it is fairly accurate.
|
||||
calcDmgMax = (int) Math.round((chr.getTotalInt() * 4.8 + chr.getTotalLuk() * 4) * chr.getTotalMagic() / 1000);
|
||||
calcDmgMax = calcDmgMax * effect.getHp() / 100;
|
||||
|
||||
calcDmgMax = calcDmgMax * effect.getHp() / 100;
|
||||
|
||||
ret.speed = 7;
|
||||
}
|
||||
} else if(ret.skill == Hermit.SHADOW_MESO) {
|
||||
} else if (ret.skill == Hermit.SHADOW_MESO) {
|
||||
// Shadow Meso also has its own formula
|
||||
calcDmgMax = effect.getMoneyCon() * 10;
|
||||
calcDmgMax = (int) Math.floor(calcDmgMax * 1.5);
|
||||
@@ -662,108 +678,106 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
}
|
||||
|
||||
Integer comboBuff = chr.getBuffedValue(BuffStat.COMBO);
|
||||
if(comboBuff != null && comboBuff > 0) {
|
||||
if (comboBuff != null && comboBuff > 0) {
|
||||
int oid = chr.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO;
|
||||
int advcomboid = chr.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO;
|
||||
|
||||
if(comboBuff > 6) {
|
||||
|
||||
if (comboBuff > 6) {
|
||||
// Advanced Combo
|
||||
StatEffect ceffect = SkillFactory.getSkill(advcomboid).getEffect(chr.getSkillLevel(advcomboid));
|
||||
calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + 0.20 + (comboBuff - 5) * 0.04);
|
||||
} else {
|
||||
// Normal Combo
|
||||
int skillLv = chr.getSkillLevel(oid);
|
||||
if(skillLv <= 0 || chr.isGM()) skillLv = SkillFactory.getSkill(oid).getMaxLevel();
|
||||
|
||||
if(skillLv > 0) {
|
||||
if (skillLv <= 0 || chr.isGM()) {
|
||||
skillLv = SkillFactory.getSkill(oid).getMaxLevel();
|
||||
}
|
||||
|
||||
if (skillLv > 0) {
|
||||
StatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv);
|
||||
calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100);
|
||||
}
|
||||
}
|
||||
|
||||
if(GameConstants.isFinisherSkill(ret.skill)) {
|
||||
|
||||
if (GameConstants.isFinisherSkill(ret.skill)) {
|
||||
// Finisher skills do more damage based on how many orbs the player has.
|
||||
int orbs = comboBuff - 1;
|
||||
if(orbs == 2)
|
||||
if (orbs == 2) {
|
||||
calcDmgMax *= 1.2;
|
||||
else if(orbs == 3)
|
||||
} else if (orbs == 3) {
|
||||
calcDmgMax *= 1.54;
|
||||
else if(orbs == 4)
|
||||
} else if (orbs == 4) {
|
||||
calcDmgMax *= 2;
|
||||
else if(orbs >= 5)
|
||||
} else if (orbs >= 5) {
|
||||
calcDmgMax *= 2.5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(chr.getEnergyBar() == 15000) {
|
||||
|
||||
if (chr.getEnergyBar() == 15000) {
|
||||
int energycharge = chr.isCygnus() ? ThunderBreaker.ENERGY_CHARGE : Marauder.ENERGY_CHARGE;
|
||||
StatEffect ceffect = SkillFactory.getSkill(energycharge).getEffect(chr.getSkillLevel(energycharge));
|
||||
calcDmgMax *= (100 + ceffect.getDamage()) / 100;
|
||||
}
|
||||
|
||||
|
||||
int bonusDmgBuff = 100;
|
||||
for (PlayerBuffValueHolder pbvh : chr.getAllBuffs()) {
|
||||
int bonusDmg = pbvh.effect.getDamage() - 100;
|
||||
bonusDmgBuff += bonusDmg;
|
||||
}
|
||||
|
||||
|
||||
if (bonusDmgBuff != 100) {
|
||||
float dmgBuff = bonusDmgBuff / 100.0f;
|
||||
calcDmgMax = (long) Math.ceil(calcDmgMax * dmgBuff);
|
||||
}
|
||||
|
||||
if(chr.getMapId() >= 914000000 && chr.getMapId() <= 914000500) {
|
||||
|
||||
if (chr.getMapId() >= 914000000 && chr.getMapId() <= 914000500) {
|
||||
calcDmgMax += 80000; // Aran Tutorial.
|
||||
}
|
||||
|
||||
boolean canCrit = false;
|
||||
if(chr.getJob().isA((Job.BOWMAN)) || chr.getJob().isA(Job.THIEF) || chr.getJob().isA(Job.NIGHTWALKER1) || chr.getJob().isA(Job.WINDARCHER1) || chr.getJob() == Job.ARAN3 || chr.getJob() == Job.ARAN4 || chr.getJob() == Job.MARAUDER || chr.getJob() == Job.BUCCANEER) {
|
||||
canCrit = true;
|
||||
}
|
||||
|
||||
if(chr.getBuffEffect(BuffStat.SHARP_EYES) != null) {
|
||||
boolean canCrit = chr.getJob().isA((Job.BOWMAN)) || chr.getJob().isA(Job.THIEF) || chr.getJob().isA(Job.NIGHTWALKER1) || chr.getJob().isA(Job.WINDARCHER1) || chr.getJob() == Job.ARAN3 || chr.getJob() == Job.ARAN4 || chr.getJob() == Job.MARAUDER || chr.getJob() == Job.BUCCANEER;
|
||||
|
||||
if (chr.getBuffEffect(BuffStat.SHARP_EYES) != null) {
|
||||
// Any class that has sharp eyes can crit. Also, since it stacks with normal crit go ahead
|
||||
// and calc it in.
|
||||
|
||||
canCrit = true;
|
||||
calcDmgMax *= 1.4;
|
||||
}
|
||||
|
||||
boolean shadowPartner = false;
|
||||
if(chr.getBuffEffect(BuffStat.SHADOWPARTNER) != null) {
|
||||
shadowPartner = true;
|
||||
}
|
||||
|
||||
if(ret.skill != 0) {
|
||||
|
||||
boolean shadowPartner = chr.getBuffEffect(BuffStat.SHADOWPARTNER) != null;
|
||||
|
||||
if (ret.skill != 0) {
|
||||
int fixed = ret.getAttackEffect(chr, SkillFactory.getSkill(ret.skill)).getFixDamage();
|
||||
if(fixed > 0)
|
||||
if (fixed > 0) {
|
||||
calcDmgMax = fixed;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < ret.numAttacked; i++) {
|
||||
int oid = p.readInt();
|
||||
p.skip(14);
|
||||
List<Integer> allDamageNumbers = new ArrayList<>();
|
||||
Monster monster = chr.getMap().getMonsterByOid(oid);
|
||||
|
||||
if(chr.getBuffEffect(BuffStat.WK_CHARGE) != null) {
|
||||
|
||||
if (chr.getBuffEffect(BuffStat.WK_CHARGE) != null) {
|
||||
// Charge, so now we need to check elemental effectiveness
|
||||
int sourceID = chr.getBuffSource(BuffStat.WK_CHARGE);
|
||||
int level = chr.getBuffedValue(BuffStat.WK_CHARGE);
|
||||
if(monster != null) {
|
||||
if(sourceID == WhiteKnight.BW_FIRE_CHARGE || sourceID == WhiteKnight.SWORD_FIRE_CHARGE) {
|
||||
if(monster.getStats().getEffectiveness(Element.FIRE) == ElementalEffectiveness.WEAK) {
|
||||
if (monster != null) {
|
||||
if (sourceID == WhiteKnight.BW_FIRE_CHARGE || sourceID == WhiteKnight.SWORD_FIRE_CHARGE) {
|
||||
if (monster.getStats().getEffectiveness(Element.FIRE) == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.05 + level * 0.015;
|
||||
}
|
||||
} else if(sourceID == WhiteKnight.BW_ICE_CHARGE || sourceID == WhiteKnight.SWORD_ICE_CHARGE) {
|
||||
if(monster.getStats().getEffectiveness(Element.ICE) == ElementalEffectiveness.WEAK) {
|
||||
} else if (sourceID == WhiteKnight.BW_ICE_CHARGE || sourceID == WhiteKnight.SWORD_ICE_CHARGE) {
|
||||
if (monster.getStats().getEffectiveness(Element.ICE) == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.05 + level * 0.015;
|
||||
}
|
||||
} else if(sourceID == WhiteKnight.BW_LIT_CHARGE || sourceID == WhiteKnight.SWORD_LIT_CHARGE) {
|
||||
if(monster.getStats().getEffectiveness(Element.LIGHTING) == ElementalEffectiveness.WEAK) {
|
||||
} else if (sourceID == WhiteKnight.BW_LIT_CHARGE || sourceID == WhiteKnight.SWORD_LIT_CHARGE) {
|
||||
if (monster.getStats().getEffectiveness(Element.LIGHTING) == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.05 + level * 0.015;
|
||||
}
|
||||
} else if(sourceID == Paladin.BW_HOLY_CHARGE || sourceID == Paladin.SWORD_HOLY_CHARGE) {
|
||||
if(monster.getStats().getEffectiveness(Element.HOLY) == ElementalEffectiveness.WEAK) {
|
||||
} else if (sourceID == Paladin.BW_HOLY_CHARGE || sourceID == Paladin.SWORD_HOLY_CHARGE) {
|
||||
if (monster.getStats().getEffectiveness(Element.HOLY) == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.2 + level * 0.015;
|
||||
}
|
||||
}
|
||||
@@ -773,92 +787,95 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler {
|
||||
calcDmgMax *= 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
if(ret.skill != 0) {
|
||||
Skill skill = SkillFactory.getSkill(ret.skill);
|
||||
if(skill.getElement() != Element.NEUTRAL && chr.getBuffedValue(BuffStat.ELEMENTAL_RESET) == null) {
|
||||
// The skill has an element effect, so we need to factor that in.
|
||||
if(monster != null) {
|
||||
ElementalEffectiveness eff = monster.getElementalEffectiveness(skill.getElement());
|
||||
if(eff == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.5;
|
||||
} else if(eff == ElementalEffectiveness.STRONG) {
|
||||
//calcDmgMax *= 0.5;
|
||||
}
|
||||
} else {
|
||||
// Since we already know the skill has an elemental attribute, but we dont know if the monster is weak or not, lets
|
||||
// take the safe approach and just assume they are weak.
|
||||
|
||||
if (ret.skill != 0) {
|
||||
Skill skill = SkillFactory.getSkill(ret.skill);
|
||||
if (skill.getElement() != Element.NEUTRAL && chr.getBuffedValue(BuffStat.ELEMENTAL_RESET) == null) {
|
||||
// The skill has an element effect, so we need to factor that in.
|
||||
if (monster != null) {
|
||||
ElementalEffectiveness eff = monster.getElementalEffectiveness(skill.getElement());
|
||||
if (eff == ElementalEffectiveness.WEAK) {
|
||||
calcDmgMax *= 1.5;
|
||||
} else if (eff == ElementalEffectiveness.STRONG) {
|
||||
//calcDmgMax *= 0.5;
|
||||
}
|
||||
} else {
|
||||
// Since we already know the skill has an elemental attribute, but we dont know if the monster is weak or not, lets
|
||||
// take the safe approach and just assume they are weak.
|
||||
calcDmgMax *= 1.5;
|
||||
}
|
||||
}
|
||||
if (ret.skill == FPWizard.POISON_BREATH || ret.skill == FPMage.POISON_MIST || ret.skill == FPArchMage.FIRE_DEMON || ret.skill == ILArchMage.ICE_DEMON) {
|
||||
if (monster != null) {
|
||||
// Turns out poison is completely server side, so I don't know why I added this. >.<
|
||||
//calcDmgMax = monster.getHp() / (70 - chr.getSkillLevel(skill));
|
||||
}
|
||||
} else if (ret.skill == Hermit.SHADOW_WEB) {
|
||||
if (monster != null) {
|
||||
calcDmgMax = monster.getHp() / (50 - chr.getSkillLevel(skill));
|
||||
}
|
||||
} else if (ret.skill == Hermit.SHADOW_MESO) {
|
||||
if (monster != null) {
|
||||
monster.debuffMob(Hermit.SHADOW_MESO);
|
||||
}
|
||||
} else if (ret.skill == Aran.BODY_PRESSURE) {
|
||||
if (monster != null) {
|
||||
int bodyPressureDmg = (int) Math.ceil(monster.getMaxHp() * SkillFactory.getSkill(Aran.BODY_PRESSURE).getEffect(ret.skilllevel).getDamage() / 100.0);
|
||||
if (bodyPressureDmg > calcDmgMax) {
|
||||
calcDmgMax = bodyPressureDmg;
|
||||
}
|
||||
}
|
||||
if(ret.skill == FPWizard.POISON_BREATH || ret.skill == FPMage.POISON_MIST || ret.skill == FPArchMage.FIRE_DEMON || ret.skill == ILArchMage.ICE_DEMON) {
|
||||
if(monster != null) {
|
||||
// Turns out poison is completely server side, so I don't know why I added this. >.<
|
||||
//calcDmgMax = monster.getHp() / (70 - chr.getSkillLevel(skill));
|
||||
}
|
||||
} else if(ret.skill == Hermit.SHADOW_WEB) {
|
||||
if(monster != null) {
|
||||
calcDmgMax = monster.getHp() / (50 - chr.getSkillLevel(skill));
|
||||
}
|
||||
} else if(ret.skill == Hermit.SHADOW_MESO) {
|
||||
if(monster != null) {
|
||||
monster.debuffMob(Hermit.SHADOW_MESO);
|
||||
}
|
||||
} else if (ret.skill == Aran.BODY_PRESSURE) {
|
||||
if (monster != null) {
|
||||
int bodyPressureDmg = (int) Math.ceil(monster.getMaxHp() * SkillFactory.getSkill(Aran.BODY_PRESSURE).getEffect(ret.skilllevel).getDamage() / 100.0);
|
||||
if (bodyPressureDmg > calcDmgMax) {
|
||||
calcDmgMax = bodyPressureDmg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for (int j = 0; j < ret.numDamage; j++) {
|
||||
int damage = p.readInt();
|
||||
long hitDmgMax = calcDmgMax;
|
||||
if(ret.skill == Buccaneer.BARRAGE || ret.skill == ThunderBreaker.BARRAGE) {
|
||||
if(j > 3)
|
||||
hitDmgMax *= Math.pow(2, (j - 3));
|
||||
int damage = p.readInt();
|
||||
long hitDmgMax = calcDmgMax;
|
||||
if (ret.skill == Buccaneer.BARRAGE || ret.skill == ThunderBreaker.BARRAGE) {
|
||||
if (j > 3) {
|
||||
hitDmgMax *= Math.pow(2, (j - 3));
|
||||
}
|
||||
if(shadowPartner) {
|
||||
// For shadow partner, the second half of the hits only do 50% damage. So calc that
|
||||
// in for the crit effects.
|
||||
if(j >= ret.numDamage / 2) {
|
||||
hitDmgMax *= 0.5;
|
||||
}
|
||||
}
|
||||
if (shadowPartner) {
|
||||
// For shadow partner, the second half of the hits only do 50% damage. So calc that
|
||||
// in for the crit effects.
|
||||
if (j >= ret.numDamage / 2) {
|
||||
hitDmgMax *= 0.5;
|
||||
}
|
||||
}
|
||||
|
||||
if(ret.skill == Marksman.SNIPE) {
|
||||
damage = 195000 + Randomizer.nextInt(5000);
|
||||
hitDmgMax = 200000;
|
||||
} else if (ret.skill == Beginner.BAMBOO_RAIN || ret.skill == Noblesse.BAMBOO_RAIN || ret.skill == Evan.BAMBOO_THRUST || ret.skill == Legend.BAMBOO_THRUST) {
|
||||
hitDmgMax = 82569000; // 30% of Max HP of strongest Dojo boss
|
||||
}
|
||||
if (ret.skill == Marksman.SNIPE) {
|
||||
damage = 195000 + Randomizer.nextInt(5000);
|
||||
hitDmgMax = 200000;
|
||||
} else if (ret.skill == Beginner.BAMBOO_RAIN || ret.skill == Noblesse.BAMBOO_RAIN || ret.skill == Evan.BAMBOO_THRUST || ret.skill == Legend.BAMBOO_THRUST) {
|
||||
hitDmgMax = 82569000; // 30% of Max HP of strongest Dojo boss
|
||||
}
|
||||
|
||||
long maxWithCrit = hitDmgMax;
|
||||
if(canCrit) // They can crit, so up the max.
|
||||
maxWithCrit *= 2;
|
||||
|
||||
// Warn if the damage is over 1.5x what we calculated above.
|
||||
if(damage > maxWithCrit * 1.5) {
|
||||
AutobanFactory.DAMAGE_HACK.alert(chr, "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")");
|
||||
}
|
||||
long maxWithCrit = hitDmgMax;
|
||||
if (canCrit) // They can crit, so up the max.
|
||||
{
|
||||
maxWithCrit *= 2;
|
||||
}
|
||||
|
||||
// Add a ab point if its over 5x what we calculated.
|
||||
if(damage > maxWithCrit * 5) {
|
||||
AutobanFactory.DAMAGE_HACK.addPoint(chr.getAutobanManager(), "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")");
|
||||
}
|
||||
// Warn if the damage is over 1.5x what we calculated above.
|
||||
if (damage > maxWithCrit * 1.5) {
|
||||
AutobanFactory.DAMAGE_HACK.alert(chr, "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")");
|
||||
}
|
||||
|
||||
if (ret.skill == Marksman.SNIPE || (canCrit && damage > hitDmgMax)) {
|
||||
// If the skill is a crit, inverse the damage to make it show up on clients.
|
||||
damage = -Integer.MAX_VALUE + damage - 1;
|
||||
}
|
||||
// Add a ab point if its over 5x what we calculated.
|
||||
if (damage > maxWithCrit * 5) {
|
||||
AutobanFactory.DAMAGE_HACK.addPoint(chr.getAutobanManager(), "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")");
|
||||
}
|
||||
|
||||
allDamageNumbers.add(damage);
|
||||
if (ret.skill == Marksman.SNIPE || (canCrit && damage > hitDmgMax)) {
|
||||
// If the skill is a crit, inverse the damage to make it show up on clients.
|
||||
damage = -Integer.MAX_VALUE + damage - 1;
|
||||
}
|
||||
|
||||
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) {
|
||||
p.skip(4);
|
||||
p.skip(4);
|
||||
}
|
||||
ret.allDamage.put(oid, allDamageNumbers);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user