public SpellCastData(Packet packet) { Caster = packet.ReadPackedGUID(); UnitCaster = packet.ReadPackedGUID(); CastID = packet.ReadUInt8(); SpellID = packet.ReadUInt32(); CastFlags = (CastFlags)packet.ReadUInt32(); CastFlagsEx = (CastFlagsEx)packet.ReadUInt32(); CastTime = packet.ReadUInt32(); if (packet.Opcode == Opcode.SMSG_SPELL_GO) { HitTargets = new IObjectGUID[packet.ReadUInt8()]; for (var i = 0; i < HitTargets.Length; ++i) { HitTargets[i] = packet.ReadGUID(); } MissedTargets = new MissInfo[packet.ReadUInt8()]; for (var i = 0; i < MissedTargets.Length; ++i) { var missTarget = packet.ReadGUID(); var missType = packet.ReadUInt8(); if (missType == 11) // Reflect { MissedTargets[i] = new(missTarget, missType, packet.ReadUInt8()); } else { MissedTargets[i] = new(missTarget, missType); } } } TargetFlags = (TargetFlags)packet.ReadUInt32(); if (TargetFlags.HasFlag(TargetFlags.Unit | TargetFlags.CorpseAlly | TargetFlags.CorpseEnemy | TargetFlags.GameObject | TargetFlags.Minipet)) { ExplicitTarget = packet.ReadPackedGUID(); } else if (TargetFlags.HasFlag(TargetFlags.Item | TargetFlags.TradeItem)) { ExplicitTarget = packet.ReadPackedGUID(); } if (TargetFlags.HasFlag(TargetFlags.SourceLocation)) { Source = new(packet); } if (TargetFlags.HasFlag(TargetFlags.DestinationLocation)) { Destination = new(packet); } if (TargetFlags.HasFlag(TargetFlags.String)) { var @string = packet.ReadCString(128); } if (TargetFlags.HasFlag(TargetFlags.ExtraTargets)) { var extraTargetCount = packet.ReadInt32(); for (var i = 0; i < extraTargetCount; ++i) { var i1 = packet.ReadUInt32(); var i2 = packet.ReadUInt32(); var i3 = packet.ReadUInt32(); var guid = packet.ReadGUID(); } } if (CastFlags.HasFlag(CastFlags.Power)) { Power = packet.ReadUInt32(); } if (CastFlags.HasFlag(CastFlags.Runes)) { Runes = new(packet); } if (CastFlags.HasFlag(CastFlags.Missile)) { MissileInfo = new(packet); } if (CastFlags.HasFlag(CastFlags.Ammo)) { var displayID = packet.ReadUInt32(); var inventoryType = packet.ReadUInt32(); } if (CastFlags.HasFlag(CastFlags.VisualChain)) { var i0 = packet.ReadUInt32(); var i1 = packet.ReadUInt32(); } if (TargetFlags.HasFlag(TargetFlags.DestinationLocation)) // Wrong mask, cba fixing rn { var destLocationCastIndex = packet.ReadUInt8(); } if (CastFlags.HasFlag(CastFlags.Immunities)) { var mechanicImmunity = packet.ReadUInt32(); var immunity = packet.ReadUInt32(); } // More data (prediction) }