public static void ReadSpellTargetData(Packet packet, ref TargetFlag targetFlags, WowGuid targetGUID, params object[] idx) { targetFlags = packet.ReadInt32E <TargetFlag>("Flags", idx); if (targetFlags.HasAnyFlag(TargetFlag.Unit | TargetFlag.CorpseEnemy | TargetFlag.GameObject | TargetFlag.CorpseAlly | TargetFlag.UnitMinipet)) { targetGUID = packet.ReadPackedGuid("Unit", idx); } if (targetFlags.HasAnyFlag(TargetFlag.Item | TargetFlag.TradeItem)) { packet.ReadPackedGuid("Item", idx); } if (targetFlags.HasAnyFlag(TargetFlag.SourceLocation)) { ReadLocation(packet, "SrcLocation"); } if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation)) { ReadLocation(packet, "DstLocation"); } if (targetFlags.HasAnyFlag(TargetFlag.NameString)) { packet.ReadCString("Name", idx); } }
public static void ReadSpellCastData(Packet packet, params object[] idx) { bool isSpellGo = packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_SPELL_GO, Direction.ServerToClient); WowGuid targetGUID = new WowGuid64(); var casterGUID = packet.ReadPackedGuid("CasterGUID", idx); packet.ReadPackedGuid("CasterUnit", idx); packet.ReadByte("CastID", idx); var spellId = packet.ReadInt32 <SpellId>("SpellID", idx); CastFlag flags = packet.ReadInt32E <CastFlag>("CastFlags", idx); packet.ReadUInt32("CastFlagsEx", idx); packet.ReadUInt32("CastTime", idx); if (isSpellGo) { var hitTargetsCount = packet.ReadByte("HitTargetsCount", idx); for (var i = 0; i < hitTargetsCount; ++i) { packet.ReadGuid("HitTarget", idx, i); } var missCount = packet.ReadByte("MissStatusCount", idx); for (var i = 0; i < missCount; ++i) { ReadSpellMissStatus(packet, idx, "MissStatus", i); } } TargetFlag targetFlags = TargetFlag.Self; ReadSpellTargetData(packet, ref targetFlags, targetGUID, idx, "Target"); if (flags.HasAnyFlag(CastFlag.PredictedPower)) { packet.ReadUInt32("RemainingPower"); } if (flags.HasAnyFlag(CastFlag.RuneInfo)) { ReadRuneData(packet, idx, "RemainingRunes"); } if (isSpellGo) { if (flags.HasAnyFlag(CastFlag.AdjustMissile)) { ReadMissileTrajectoryResult(packet, idx, "MissileTrajectory"); } } if (flags.HasAnyFlag(CastFlag.Projectile)) { ReadSpellAmmo(packet, idx, "Ammo"); } if (isSpellGo) { if (flags.HasAnyFlag(CastFlag.VisualChain)) { ReadProjectileVisual(packet, idx, "ProjectileVisual"); } if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation)) { packet.ReadByte("DestLocSpellCastIndex", idx); } if (targetFlags.HasAnyFlag(TargetFlag.ExtraTargets)) { var targetPointsCount = packet.ReadInt32("TargetPointsCount", idx); for (var i = 0; i < targetPointsCount; ++i) { ReadTargetLocation(packet, idx, "TargetPoints", i); } } } else { if (flags.HasAnyFlag(CastFlag.Immunity)) { ReadCreatureImmunities(packet, idx, "Immunities"); } if (flags.HasAnyFlag(CastFlag.HealPrediction)) { ReadSpellHealPrediction(packet, idx, "Predict"); } } if (flags.HasAnyFlag(CastFlag.Unknown21) && !isSpellGo) { NpcSpellClick spellClick = new NpcSpellClick { SpellID = (uint)spellId, CasterGUID = casterGUID, TargetGUID = targetGUID }; Storage.SpellClicks.Add(spellClick, packet.TimeSpan); } if (isSpellGo) { packet.AddSniffData(StoreNameType.Spell, spellId, "SPELL_GO"); } }