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(); } }