コード例 #1
0
            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)
            }