Ejemplo n.º 1
0
        public void Ping(bool NpcEnabled, bool PlayersEnabled, bool FriendlyPlayersEnabled, bool ObjectsEnabled)
        {
            //Обнуляем и обнуляем все
            bool MyPlayersFinded = false;

            TotalWowObjects  = 0;
            ReadedWowObjects = 0;
            All.Clear();
            Players.Clear();
            Npcs.Clear();
            Objects.Clear();

            //Устанавливаем базовый адресс текущего объекта как адресс первого объекта в менеджере объектов
            UIntPtr CurrObject_BaseAddress = FirstObject;



            //Получаем гуид последнего выбранного юнита
            LastTargetGuid = WowReader.ReadULong((UIntPtr)Offsets.Client.StaticLastTargetGUID);


            //Получаем текущую зону
            CurrentZoneID   = GetCurrZoneID();
            CurrentZoneName = Enums.ZonesDB.GetTextOfZone(CurrentZoneID);


            //Читаем нашего игрока
            ReadMyPlayer();



            //ПОЛУЧАЕМ ТЕКУЩУЮ ЦЕЛЬ
            {
                ulong Guid = WowReader.ReadUInt64((UIntPtr)Offsets.Client.StaticLocalTargetGUID);

                if (Guid != 0)
                {
                    UIntPtr BaseAddress       = GetObjectBaseByGuid(Guid);
                    UIntPtr UnitFieldsAddress = WowReader.ReadPointer(BaseAddress + Offsets.Object.UnitFields);
                    short   Type = (short)WowReader.ReadUInt32(BaseAddress + Offsets.Object.Type);

                    if (Type == (int)Defines.ObjectType.PLAYER)  //PLAYER
                    {
                        float XPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_X);
                        float YPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_Y);
                        float ZPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_Z);
                        float Rotation = WowReader.ReadFloat(BaseAddress + Offsets.Object.Rot);

                        uint CurrentHealth = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Health);
                        uint CurrentEnergy = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Energy);
                        uint MaxHealth     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxHealth);
                        uint Level         = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Level);
                        uint MaxEnergy     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxEnergy);


                        string Name   = PlayerNameFromGuid(Guid);
                        byte   Race   = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Race);
                        byte   Class  = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Class);
                        byte   Gender = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Gender);

                        Target = new PlayerObject(Guid, XPos, YPos, ZPos, Rotation, CurrObject_BaseAddress, UnitFieldsAddress, Type, Name, Race, Class, Gender, CurrentHealth, MaxHealth, CurrentEnergy, MaxEnergy, Level);
                    }
                    else if (Type == (int)Defines.ObjectType.UNIT)  //NPC
                    {
                        uint NpcID = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.NpcID);

                        float XPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_X);
                        float YPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_Y);
                        float ZPos     = WowReader.ReadFloat(BaseAddress + Offsets.Unit.Pos_Z);
                        float Rotation = WowReader.ReadFloat(BaseAddress + Offsets.Object.Rot);

                        uint CurrentHealth = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Health);
                        uint CurrentEnergy = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Energy);
                        uint MaxHealth     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxHealth);
                        uint Level         = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Level);
                        uint MaxEnergy     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxEnergy);

                        string Name       = MobNameFromGuid(Guid, NpcID);
                        ulong  SummonedBy = WowReader.ReadUInt64(UnitFieldsAddress + Offsets.Unit.SummonedBy);

                        Target = new NpcObject(Guid, NpcID, XPos, YPos, ZPos, Rotation, CurrObject_BaseAddress, UnitFieldsAddress, Type, Name, CurrentHealth, MaxHealth, CurrentEnergy, MaxEnergy, Level);
                    }
                }
                else
                {
                    Target = null;
                }
            }


            //Прочитываем объектный менеджер из первого объекта по последний.
            while (CurrObject_BaseAddress != UIntPtr.Zero && (uint)CurrObject_BaseAddress % 2 == 0)
            {
                TotalWowObjects++;

                //Получаем тип объекта и пропускаем если это неизвестный объект
                short Type = WowReader.ReadShort(CurrObject_BaseAddress + Offsets.Object.Type);
                if (Type != 3 & Type != 4 & Type != 5)
                {
                    goto Skip;
                }                                                      //Скипаем если тип объекта неизвестен

                //Получаем указатель на поле значений этого объекта
                UIntPtr UnitFieldsAddress = WowReader.ReadPointer(CurrObject_BaseAddress + Offsets.Unit.UnitFields);

                switch (Type)
                {
                case (int)Defines.ObjectType.UNIT:     //NPC!
                {
                    if (!NpcEnabled)
                    {
                        goto Skip;
                    }                                        //Если нпс выключены, пропускаем

                    ulong Guid  = WowReader.ReadUInt64(CurrObject_BaseAddress + Offsets.Object.Guid);
                    uint  NpcID = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.NpcID);

                    float XPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_X);
                    float YPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_Y);
                    float ZPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_Z);
                    float Rotation = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Object.Rot);
                    uint  Level    = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Level);

                    uint CurrentHealth = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Health);
                    uint MaxHealth     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxHealth);
                    uint CurrentEnergy = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Energy);
                    uint MaxEnergy     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxEnergy);


                    string Name       = MobNameFromGuid(Guid, NpcID);
                    ulong  SummonedBy = WowReader.ReadUInt64(UnitFieldsAddress + Offsets.Unit.SummonedBy);

                    ReadedWowObjects++;
                    NpcObject npc = new NpcObject(Guid, NpcID, XPos, YPos, ZPos, Rotation, CurrObject_BaseAddress, UnitFieldsAddress, Type, Name, CurrentHealth, MaxHealth, CurrentEnergy, MaxEnergy, Level);
                    Npcs.Add(npc);
                    All.Add(npc);
                }
                break;

                case (int)Defines.ObjectType.PLAYER:     //PLAYER
                {
                    ulong Guid = WowReader.ReadUInt64(CurrObject_BaseAddress + Offsets.Object.Guid);

                    //Проходим если это мы
                    if (Guid == MyPlayer.Guid)
                    {
                        MyPlayersFinded = true;
                        goto Skip;
                    }

                    //Если игроки выключены, пропускаем
                    if (!PlayersEnabled)
                    {
                        goto Skip;
                    }

                    byte Race = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Race);

                    //Скипаем союзников, если такая настройка включена
                    if (!FriendlyPlayersEnabled & !Defines.IsEnemy(Race, MyPlayer.Race))
                    {
                        goto Skip;
                    }


                    float XPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_X);
                    float YPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_Y);
                    float ZPos     = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Unit.Pos_Z);
                    float Rotation = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Object.Rot);
                    uint  Level    = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Level);

                    uint   CurrentHealth = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Health);
                    uint   MaxHealth     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxHealth);
                    uint   CurrentEnergy = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.Energy);
                    uint   MaxEnergy     = WowReader.ReadUInt32(UnitFieldsAddress + Offsets.Unit.MaxEnergy);
                    byte   Class         = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Class);
                    byte   Gender        = WowReader.ReadByte(UnitFieldsAddress + Offsets.Unit.Gender);
                    string Name          = PlayerNameFromGuid(Guid);

                    if (Name == "Yeah")
                    {
                    }

                    //Добавляем игрока в список игроков
                    ReadedWowObjects++;
                    PlayerObject player = new PlayerObject(Guid, XPos, YPos, ZPos, Rotation, CurrObject_BaseAddress, UnitFieldsAddress, Type, Name, Race, Class, Gender, CurrentHealth, MaxHealth, CurrentEnergy, MaxEnergy, Level);
                    Players.Add(player);
                    All.Add(player);
                }
                break;

                case (int)Defines.ObjectType.GAMEOBJ:      //OBJECTS
                {
                    if (!ObjectsEnabled)
                    {
                        goto Skip;
                    }                                            //Если объекты выключены, пропускаем

                    //Чтение объекта (сам наварганил)
                    uint  objectID = WowReader.ReadUInt(UnitFieldsAddress + Offsets.Object.ID);
                    float objectX  = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Object.Pos_X);
                    float objectY  = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Object.Pos_Y);
                    float objectZ  = WowReader.ReadFloat(CurrObject_BaseAddress + Offsets.Object.Pos_Z);

                    //Добавляем объект в список
                    ReadedWowObjects++;
                    OtherObject obj = new OtherObject(objectID, objectX, objectY, objectZ, CurrObject_BaseAddress, UnitFieldsAddress);
                    Objects.Add(obj);
                    All.Add(obj);
                }
                break;
                }


Skip:           //Для пропуска объекта

                //Устанавливаем текущий объект как следующий объект из менеджера объектов
                CurrObject_BaseAddress = NextObject(CurrObject_BaseAddress);
            }


            //Если нашего игрока нету в списке
            if (!MyPlayersFinded)
            {
                //Скорее всего что-то сбилось, реинициализируем адресса
                InitAddresses();
            }
        }