📄 abstractdealdamagehandler.java
字号:
if (player.getCheatTracker().getAttacksWithoutHit() > 100) {
player.getCheatTracker().registerOffense(CheatingOffense.ATTACK_WITHOUT_GETTING_HIT,
Integer.toString(player.getCheatTracker().getAttacksWithoutHit()));
}
}
}
private void handlePickPocket(MapleCharacter player, MapleMonster monster, Pair<Integer, List<Integer>> oned) {
ISkill pickpocket = SkillFactory.getSkill(4211003);
int delay = 0;
int maxmeso = player.getBuffedValue(MapleBuffStat.PICKPOCKET).intValue();
int reqdamage = 20000;
Point monsterPosition = monster.getPosition();
for (Integer eachd : oned.getRight()) {
if (pickpocket.getEffect(player.getSkillLevel(pickpocket)).makeChanceResult()) {
double perc = (double) eachd / (double) reqdamage;
final int todrop = Math.min((int) Math.max(perc * (double) maxmeso, (double) 1),
maxmeso);
final MapleMap tdmap = player.getMap();
final Point tdpos = new Point((int) (monsterPosition.getX() + (Math.random() * 100) - 50),
(int) (monsterPosition.getY()));
final MapleMonster tdmob = monster;
final MapleCharacter tdchar = player;
TimerManager.getInstance().schedule(new Runnable() {
public void run() {
tdmap.spawnMesoDrop(todrop, todrop, tdpos, tdmob, tdchar, false);
}
}, delay);
delay += 200;
}
}
}
private void checkHighDamage(MapleCharacter player, MapleMonster monster, AttackInfo attack, ISkill theSkill,
MapleStatEffect attackEffect, int damageToMonster, int maximumDamageToMonster) {
int elementalMaxDamagePerMonster;
Element element = Element.NEUTRAL;
if (theSkill != null) {
element = theSkill.getElement();
}
if (player.getBuffedValue(MapleBuffStat.WK_CHARGE) != null) {
int chargeSkillId = player.getBuffSource(MapleBuffStat.WK_CHARGE);
switch (chargeSkillId) {
case 1211003:
case 1211004:
element = Element.FIRE;
break;
case 1211005:
case 1211006:
element = Element.ICE;
break;
case 1211007:
case 1211008:
element = Element.LIGHTING;
break;
}
ISkill chargeSkill = SkillFactory.getSkill(chargeSkillId);
maximumDamageToMonster *= chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getDamage() / 100.0;
}
if (element != Element.NEUTRAL) {
double elementalEffect;
if (attack.skill == 3211003 || attack.skill == 3111003) { // inferno and blizzard
elementalEffect = attackEffect.getX() / 200.0;
} else {
elementalEffect = 0.5;
}
switch (monster.getEffectiveness(element)) {
case IMMUNE:
elementalMaxDamagePerMonster = 1;
break;
case NORMAL:
elementalMaxDamagePerMonster = maximumDamageToMonster;
break;
case WEAK:
elementalMaxDamagePerMonster = (int) (maximumDamageToMonster * (1.0 + elementalEffect));
break;
case STRONG:
elementalMaxDamagePerMonster = (int) (maximumDamageToMonster * (1.0 - elementalEffect));
break;
default:
throw new RuntimeException("Unknown enum constant");
}
} else {
elementalMaxDamagePerMonster = maximumDamageToMonster;
}
if (damageToMonster > elementalMaxDamagePerMonster) {
player.getCheatTracker().registerOffense(CheatingOffense.HIGH_DAMAGE);
// log.info("[h4x] Player {} is doing high damage to one monster: {} (maxdamage: {}, skill:
// {})",
// new Object[] { player.getName(), Integer.valueOf(totDamageToOneMonster),
// Integer.valueOf(maxDamagePerMonster), Integer.valueOf(attack.skill) });
if (damageToMonster > elementalMaxDamagePerMonster * 3) { // * 3 until implementation of lagsafe pingchecks for buff expiration
AutobanManager.getInstance().autoban(player.getClient(), damageToMonster +
" damage (level: " + player.getLevel() + " watk: " + player.getTotalWatk() +
" skill: " + attack.skill + ", monster: " + monster.getId() + " assumed max damage: " +
elementalMaxDamagePerMonster + ")");
}
}
}
public AttackInfo parseDamage(LittleEndianAccessor lea, boolean ranged) {
AttackInfo ret = new AttackInfo();
lea.readByte();
ret.numAttackedAndDamage = lea.readByte();
ret.numAttacked = (ret.numAttackedAndDamage >>> 4) & 0xF; // guess why there are no skills damaging more than
// 15 monsters...
ret.numDamage = ret.numAttackedAndDamage & 0xF; // how often each single monster was attacked o.o
ret.allDamage = new ArrayList<Pair<Integer, List<Integer>>>();
ret.skill = lea.readInt();
lea.readByte(); // always 0 (?)
ret.stance = lea.readByte();
if (ret.skill == 4211006) {
return parseMesoExplosion(lea, ret);
}
if (ranged) {
lea.readShort();
lea.readShort(); // somehow related to crits? this is the only value that changes between two otherwise
// identical attacks
// System.out.println(Integer.toBinaryString(wui & 0xFFFF) + "_" + Integer.toHexString(wui & 0xFFFF));
lea.skip(7);
// System.out.println("Unk1: " + HexTool.toString(lea.read(7)));
} else {
lea.skip(6);
}
// TODO we need information if an attack was a crit or not but it does not seem to be in this packet - find out
// if it is o.o
// noncrit strafe
// 24 00 01 14 FE FE 30 00 00 97 04 06 99 2F EE 00 04 00 00 00 41 6B 00 00 00 06 81 00 01 00 00 5F 00 00 00 5F 00 D2 02 A3 19 00 00 43 0C 00 00 AD 0B 00 00 DB 12 00 00 64 00 5F 00
//
// fullcrit strafe:
// 24 00 01 14 FE FE 30 00 00 97 04 06 F5 C3 EE 00 04 00 00 00 41 6B 00 00 00 06 81 00 01 00 00 5F 00 00 00 5F 00 D2 02 6E 0F 00 00 EA 12 00 00 58 15 00 00 56 11 00 00 64 00 5F 00
for (int i = 0; i < ret.numAttacked; i++) {
int oid = lea.readInt();
// System.out.println("Unk2: " + HexTool.toString(lea.read(14)));
lea.skip(14); // seems to contain some position info o.o
List<Integer> allDamageNumbers = new ArrayList<Integer>();
for (int j = 0; j < ret.numDamage; j++) {
int damage = lea.readInt();
// System.out.println("Damage: " + damage);
allDamageNumbers.add(Integer.valueOf(damage));
}
ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(oid), allDamageNumbers));
}
// System.out.println("Unk3: " + HexTool.toString(lea.read(4)));
return ret;
}
public AttackInfo parseMesoExplosion(LittleEndianAccessor lea, AttackInfo ret) {
if (ret.numAttackedAndDamage == 0) {
lea.skip(10);
int bullets = lea.readByte();
for (int j = 0; j < bullets; j++) {
int mesoid = lea.readInt();
lea.skip(1);
ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(mesoid), null));
}
return ret;
} else {
lea.skip(6);
}
for (int i = 0; i < ret.numAttacked + 1; i++) {
int oid = lea.readInt();
if (i < ret.numAttacked) {
lea.skip(12);
int bullets = lea.readByte();
List<Integer> allDamageNumbers = new ArrayList<Integer>();
for (int j = 0; j < bullets; j++) {
int damage = lea.readInt();
// System.out.println("Damage: " + damage);
allDamageNumbers.add(Integer.valueOf(damage));
}
ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(oid), allDamageNumbers));
} else {
int bullets = lea.readByte();
for (int j = 0; j < bullets; j++) {
int mesoid = lea.readInt();
lea.skip(1);
ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(mesoid), null));
}
}
}
return ret;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -