public AttackInfo parseDamage(LittleEndianAccessor lea, boolean ranged) {
// 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
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();
switch (ret.skill) {
case 2121001:
case 2221001:
case 2321001:
case 5101004:
case 5201002:
ret.charge = lea.readInt();
break;
default:
ret.charge = 0;
break;
}
if (ret.skill == 1221011) {
ret.isHH = true;
}
lea.readByte(); // always 0 (?)
ret.stance = lea.readByte();
if (ret.skill == 4211006) {
return parseMesoExplosion(lea, ret);
}
if (ranged) {
lea.readByte();
ret.speed = lea.readByte();
lea.readByte();
ret.direction = lea.readByte(); // contains direction on some 4th job skills
lea.skip(7);
// hurricane and pierce have extra 4 bytes :/
switch (ret.skill) {
case 3121004:
case 3221001:
case 5221004:
lea.skip(4);
break;
default:
break;
}
} else {
lea.readByte();
ret.speed = lea.readByte();
lea.skip(4);
}
for (int i = 0; i < ret.numAttacked; i++) {
int oid = lea.readInt();
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();
ByteBuffer b = ByteBuffer.allocate(4);
b.putInt(damage);
byte[] result = b.array();
if (result[1] > 0) {
damage += 0x80000000; //Critical
}
allDamageNumbers.add(Integer.valueOf(damage));
}
if (ret.skill != 5221004) {
lea.skip(4);
}
ret.allDamage.add(new Pair<Integer, List<Integer>>(Integer.valueOf(oid), allDamageNumbers));
}
// System.out.println("Unk3: " + HexTool.toString(lea.read(4)));
return ret;
}