예제 #1
0
        /// <summary>
        /// Sends the requested party member stats data to the client
        /// </summary>
        /// <param name="client">realm client</param>
        /// <param name="member">The character whose stats is going to be retrieved</param>
        /// <param name="flags">The stats to be retrieved from the <paramref name="member" /></param>
        private static void SendPartyMemberStatsInternal(IPacketReceiver client, GroupMember member,
                                                         GroupUpdateFlags flags, RealmServerOpCode opcode)
        {
            using (RealmPacketOut packet = new RealmPacketOut(opcode))
            {
                if (opcode == RealmServerOpCode.SMSG_PARTY_MEMBER_STATS_FULL)
                {
                    packet.Write((byte)0);
                }
                member.WriteIdPacked(packet);
                if (!member.IsOnline)
                {
                    packet.WriteUShort((ushort)0);
                    client.Send(packet, false);
                }
                else
                {
                    packet.Write((uint)flags);
                    Character character = member.Character;
                    if (flags.HasFlag(GroupUpdateFlags.Status))
                    {
                        packet.Write((ushort)character.Status);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.Health))
                    {
                        packet.Write(character.Health);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.MaxHealth))
                    {
                        packet.Write(character.MaxHealth);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.PowerType))
                    {
                        packet.Write((byte)character.PowerType);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.Power))
                    {
                        packet.Write((ushort)character.Power);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.MaxPower))
                    {
                        packet.Write((ushort)character.MaxPower);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.Level))
                    {
                        packet.Write((ushort)character.Level);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.ZoneId))
                    {
                        packet.Write(character.Zone != null ? (ushort)character.Zone.Id : (ushort)0);
                    }
                    if (flags.HasFlag(GroupUpdateFlags.Position))
                    {
                        packet.Write((ushort)character.Position.X);
                        packet.Write((ushort)character.Position.Y);
                    }

                    if (flags.HasFlag(GroupUpdateFlags.Auras))
                    {
                        ulong auraUpdateMask = character.AuraUpdateMask;
                        packet.Write(auraUpdateMask);
                        for (byte index = 0; index < (byte)56; ++index)
                        {
                            if (((long)auraUpdateMask & 1L << index) != 0L)
                            {
                                Aura at = character.Auras.GetAt(index);
                                packet.Write(at.Spell.Id);
                                packet.Write((byte)at.Flags);
                            }
                        }
                    }

                    NPC activePet = character.ActivePet;
                    if (activePet == null)
                    {
                        packet.Write((byte)0);
                        packet.Write(0UL);
                        client.Send(packet, false);
                    }
                    else
                    {
                        if (flags.HasFlag(GroupUpdateFlags.PetGuid))
                        {
                            packet.Write(activePet.EntityId);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetName))
                        {
                            packet.WriteCString(activePet.Name);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetDisplayId))
                        {
                            packet.Write((ushort)activePet.DisplayId);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetHealth))
                        {
                            packet.Write(activePet.Health);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetMaxHealth))
                        {
                            packet.Write(activePet.MaxHealth);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetPowerType))
                        {
                            packet.Write((byte)activePet.PowerType);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetPower))
                        {
                            packet.Write((ushort)activePet.Power);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetMaxPower))
                        {
                            packet.Write((ushort)activePet.MaxPower);
                        }
                        if (flags.HasFlag(GroupUpdateFlags.PetAuras))
                        {
                            ulong auraUpdateMask = activePet.AuraUpdateMask;
                            packet.Write(auraUpdateMask);
                            for (byte index = 0; index < (byte)56; ++index)
                            {
                                if (((long)auraUpdateMask & 1L << index) != 0L)
                                {
                                    Aura at = activePet.Auras.GetAt(index);
                                    packet.Write(at.Spell.Id);
                                    packet.Write((byte)at.Flags);
                                }
                            }
                        }

                        client.Send(packet, false);
                    }
                }
            }
        }
예제 #2
0
        /// <summary>
        /// Sends the requested party member stats data to the client
        /// </summary>
        /// <param name="client">realm client</param>
        /// <param name="member">The character whose stats is going to be retrieved</param>
        /// <param name="flags">The stats to be retrieved from the <paramref name="member"/></param>
        private static void SendPartyMemberStatsInternal(IPacketReceiver client, GroupMember member, GroupUpdateFlags flags,
                                                         RealmServerOpCode opcode)
        {
            using (var packet = new RealmPacketOut(opcode))
            {
                if (opcode == RealmServerOpCode.SMSG_PARTY_MEMBER_STATS_FULL)
                {
                    packet.Write((byte)0);                     //arena something
                }

                member.WriteIdPacked(packet);
                if (!member.IsOnline)
                {
                    packet.WriteUShort((ushort)CharacterStatus.OFFLINE);
                    client.Send(packet, addEnd: false);
                    return;
                }
                packet.Write((uint)flags);

                var chr = member.Character;
                if (flags.HasFlag(GroupUpdateFlags.Status))
                {
                    packet.Write((ushort)chr.Status);
                }
                if (flags.HasFlag(GroupUpdateFlags.Health))
                {
                    packet.Write(chr.Health);
                }
                if (flags.HasFlag(GroupUpdateFlags.MaxHealth))
                {
                    packet.Write(chr.MaxHealth);
                }
                if (flags.HasFlag(GroupUpdateFlags.PowerType))
                {
                    packet.Write((byte)chr.PowerType);
                }
                if (flags.HasFlag(GroupUpdateFlags.Power))
                {
                    packet.Write((ushort)chr.Power);
                }
                if (flags.HasFlag(GroupUpdateFlags.MaxPower))
                {
                    packet.Write((ushort)chr.MaxPower);
                }
                if (flags.HasFlag(GroupUpdateFlags.Level))
                {
                    packet.Write((ushort)chr.Level);
                }
                if (flags.HasFlag(GroupUpdateFlags.ZoneId))
                {
                    packet.Write((ushort)(chr.Zone != null ? chr.Zone.Id : ZoneId.None));
                }
                if (flags.HasFlag(GroupUpdateFlags.Position))
                {
                    packet.Write((ushort)chr.Position.X);
                    packet.Write((ushort)chr.Position.Y);
                }
                if (flags.HasFlag(GroupUpdateFlags.Auras))
                {
                    ulong auraMask = chr.AuraUpdateMask;
                    packet.Write(auraMask);
                    Aura currAura;

                    for (byte i = 0; i < AuraHandler.MaxAuras; ++i)
                    {
                        if ((auraMask & ((ulong)1 << i)) != 0)
                        {
                            currAura = chr.Auras.GetAt(i);

                            packet.Write(currAura.Spell.Id);
                            packet.Write((byte)currAura.Flags);
                        }
                    }
                }

                NPC targetPet = chr.ActivePet;

                if (targetPet == null)                 //no pet
                {
                    packet.Write((byte)0);             //name
                    packet.Write(0UL);                 //auras
                    client.Send(packet, addEnd: false);
                    return;
                }

                if (flags.HasFlag(GroupUpdateFlags.PetGuid))
                {
                    packet.Write(targetPet.EntityId);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetName))
                {
                    packet.WriteCString(targetPet.Name);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetDisplayId))
                {
                    packet.Write((ushort)targetPet.DisplayId);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetHealth))
                {
                    packet.Write(targetPet.Health);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetMaxHealth))
                {
                    packet.Write(targetPet.MaxHealth);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetPowerType))
                {
                    packet.Write((byte)targetPet.PowerType);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetPower))
                {
                    packet.Write((ushort)targetPet.Power);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetMaxPower))
                {
                    packet.Write((ushort)targetPet.MaxPower);
                }

                if (flags.HasFlag(GroupUpdateFlags.PetAuras))
                {
                    ulong auraMask = targetPet.AuraUpdateMask;
                    packet.Write(auraMask);
                    Aura currAura;

                    for (byte i = 0; i < AuraHandler.MaxAuras; ++i)
                    {
                        if ((auraMask & ((ulong)1 << i)) != 0)
                        {
                            currAura = targetPet.Auras.GetAt(i);                            //chr.Auras.GetAt(i);

                            packet.Write(currAura.Spell.Id);
                            packet.Write((byte)currAura.Flags);
                        }
                    }
                }
                client.Send(packet, addEnd: false);
            }
        }