public static Packet ApplyDamage(IFieldObject <Player> player, long skillSN, int unkValue, CoordF coords, List <IFieldObject <Mob> > mobs) { PacketWriter pWriter = PacketWriter.Of(SendOp.SKILL_DAMAGE); SkillCast skillCast = SkillUsePacket.SkillCastMap[skillSN]; DamageHandler damage = DamageHandler.CalculateSkillDamage(skillCast); pWriter.WriteByte(1); pWriter.WriteLong(skillSN); pWriter.WriteInt(unkValue); pWriter.WriteInt(player.ObjectId); pWriter.WriteInt(player.ObjectId); pWriter.WriteInt(skillCast.SkillId); pWriter.WriteShort(skillCast.SkillLevel); // This values appears on some SkillsId, and others like BossSkill, sometimes is 0 pWriter.WriteByte(); // The value is not always 0 pWriter.WriteByte(); // The value is not always 0, also seems to crash if its not a correct value pWriter.Write(coords.ToShort()); pWriter.Write(CoordS.From(0, 0, 0)); // Position of the image effect of the skillUse, seems to be rotation (0, 0, rotation). // TODO: Check if is a player or mob pWriter.WriteByte((byte)mobs.Count); for (int i = 0; i < mobs.Count; i++) { pWriter.WriteInt(mobs[i].ObjectId); pWriter.WriteByte((byte)damage.GetDamage() > 0 ? 1 : 0); pWriter.WriteBool(damage.IsCritical()); if (damage.GetDamage() != 0) { pWriter.WriteLong(-1 * (long)damage.GetDamage()); } } return(pWriter); }