Code:
class ObjectManager:
def __init__(self, process, base):
self.process = process
self.base = base
self.manager_pointer = self.base + objectmanager_offset
self.manager_base = self.process.read_longlong(self.manager_pointer)
self.entity_array = self.process.read_longlong(self.manager_base + 0x8)
self.objects = []
self.players = []
self.playernamecache = []
self.units = []
self.count = self.process.read_int(self.manager_base)
self.curCount = self.process.read_int(self.manager_base + 0x10)
def update(self):
self.manager_pointer = self.base + objectmanager_offset
self.manager_base = self.process.read_longlong(self.manager_pointer)
self.entity_array = self.process.read_longlong(self.manager_base + 0x8)
self.count = self.process.read_int(self.manager_base)
self.curCount = self.process.read_int(self.manager_base + 0x10)
def perform_update_thread(reader, object_manager):
global gettime, target, active_player, camera, debugmsg#, track_players, track_units, track_objects, active_player
active_player = object_manager.WowObject()
camera = reader.CameraObject(reader.process, reader.base)
while True:
try:
reader.update()
gettime = reader.process.read_float(reader.base + gettime_offset)
try:
camera.timestamp = time.time()
camera.x_pos = reader.process.read_float(camera.offset + 0x10)
camera.y_pos = reader.process.read_float(camera.offset + 0x14)
camera.z_pos = reader.process.read_float(camera.offset + 0x18)
camera.pos_v3 = pygame.math.Vector3(camera.x_pos, camera.y_pos, camera.z_pos)
except:
logger_function("Failed to obtain camera position")
print("Failed to obtain camera position")
continue
target_guid = reader.process.read_long(reader.base + target_guid_offset)
localplayer_guid = reader.process.read_long(reader.base + playerguid_offset)
if target_guid == 0:
target = None
object_manager.update()
object_debug = []
for i in range(0,object_manager.count):
pointer = reader.process.read_longlong(object_manager.entity_array + (0x8*i))
if pointer != 0:
pointer2 = reader.process.read_longlong(pointer + 0x18)
entity_temp = reader.process.read_bytes(pointer2 + 0x10, 1)
entity_type = int.from_bytes(entity_temp, byteorder='little')
if entity_type not in [5,6,7,8]:
continue
entity_guid = reader.process.read_long(pointer2 + 0x18)
entity = {
'timestamp' : time.time(),
'type' : entity_type,
'pointer' : pointer,
'entity_guid' : entity_guid,
'reader_base' : reader.base,
'obj_manager_base' : object_manager.manager_base
}
object_debug.append(entity)
debugmsg = f"Object Manager L: {localplayer_guid:X} E: {entity_guid:X} "
if entity_type == 7 or entity_guid == localplayer_guid: #activeplayer
print("Triggered entity_type '7'")
debugmsg = "Triggered entity_type '7'."
active_player.timestamp = time.time()
active_player.pointer = f"{pointer:X}"
active_player.name = reader.process.read_string(reader.base + playername_offset, 15)#"Unknown"
active_player.base_address = pointer2
active_player.entity_type = object_manager.parse_entity_type(entity_type)
active_player.level = reader.process.read_long(pointer2 + 0xD7B0)
active_player.faction = object_manager.parse_faction_id(reader.process.read_long(pointer2 + 0xD7D4))
active_player.race = object_manager.parse_race(reader.process.read_long(pointer2 + 0xD7D4))
temp = reader.process.read_bytes(pointer2 + 0xD7A4 + 0x1, 1)
temp = int.from_bytes(temp, byteorder='little')
active_player.entity_class = object_manager.parse_class(temp)
active_player.guid = reader.process.read_long(pointer2 + 0x18)
active_player.unitid = reader.process.read_long(pointer2 + 0xD8)
active_player.target = reader.process.read_long(pointer2 + 0xD770)
#active_player.incombat = str(bool(reader.process.read_int(pointer2 + 0xD680)))#D584
active_player.health = reader.process.read_int(pointer2 + 0xD6B0)
active_player.healthmax = reader.process.read_int(pointer2 + 0xD6B8)
active_player.energy = reader.process.read_int(pointer2 + 0xD9F0) #0xD580
active_player.energymax = reader.process.read_int(pointer2 + 0xDA18)
active_player.healthpercentage = round((active_player.health / active_player.healthmax) * 100, 2)
active_player.energypercentage = round((active_player.energy / active_player.energymax) * 100, 2)
active_player.auras = object_manager.get_auras(pointer2, active_player.guid)
active_player.buffs = active_player.auras[0]
active_player.debuffs = active_player.auras[1]
active_player.misc_auras = active_player.auras[2]
active_player.x_pos = reader.process.read_float(pointer2 + 0x148)
active_player.y_pos = reader.process.read_float(pointer2 + 0x14C)
active_player.z_pos = reader.process.read_float(pointer2 + 0x150)
active_player.r_val = reader.process.read_float(pointer2 + 0x158)
active_player.pos_v3 = pygame.math.Vector3(active_player.x_pos, active_player.y_pos, active_player.z_pos)
active_player.wts = world_to_screen(view_matrix(reader), active_player.pos_v3)
active_player.distance = 0
active_player.casting_spellid = reader.process.read_int(pointer2 + 0x730)
active_player.cooldowns = object_manager.get_cooldowns(object_manager)
Those are the relevant bits. There's a cleanup function and some exception handling, but it isn't even triggering the conditional for active player on this character unless I hearth (a loading screen seems to fix it, but only when I hearth. /reload does not work. Logging out and back in does not work either) Streaming output to console on each iteration, I can see that the object manager pointer changes between the working and non-working characters, but beyond that nothing is out of the ordinary.
Code:
Triggered entity_type '7'
{'timestamp': 1693912119.9532065, 'type': 8, 'pointer': 1729861822560, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9543283, 'type': 8, 'pointer': 1726732503568, 'entity_guid': 7208883, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9556115, 'type': 5, 'pointer': 1727341702704, 'entity_guid': 82706357, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.958603, 'type': 8, 'pointer': 1729861822800, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9615955, 'type': 8, 'pointer': 1727341254160, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9641519, 'type': 5, 'pointer': 1726732503376, 'entity_guid': 7654731, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9641519, 'type': 5, 'pointer': 1726732503232, 'entity_guid': 7654543, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9641519, 'type': 5, 'pointer': 1726732503520, 'entity_guid': 7654564, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.966611, 'type': 8, 'pointer': 1727341254304, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9676087, 'type': 8, 'pointer': 1726732503424, 'entity_guid': 7208883, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9686038, 'type': 5, 'pointer': 1727341254112, 'entity_guid': 7654136, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9705987, 'type': 8, 'pointer': 1727341254544, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9741237, 'type': 8, 'pointer': 1729861822848, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9773726, 'type': 5, 'pointer': 1729861822752, 'entity_guid': 7654423, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9773726, 'type': 8, 'pointer': 1729861822608, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.978367, 'type': 5, 'pointer': 1729861822464, 'entity_guid': 7654561, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9793663, 'type': 8, 'pointer': 1727341254496, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9803605, 'type': 6, 'pointer': 1726731870816, 'entity_guid': 84497089, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9833553, 'type': 6, 'pointer': 1726731870720, 'entity_guid': 84357662, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9865954, 'type': 8, 'pointer': 1726732503040, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9875922, 'type': 5, 'pointer': 1726732503136, 'entity_guid': 7655126, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9885895, 'type': 8, 'pointer': 1729861822896, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9930837, 'type': 5, 'pointer': 1726731870912, 'entity_guid': 7654491, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9941013, 'type': 8, 'pointer': 1729861822368, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9965308, 'type': 8, 'pointer': 1726732503616, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9985266, 'type': 6, 'pointer': 1729861822320, 'entity_guid': 65074276, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912119.9995236, 'type': 8, 'pointer': 1727341254448, 'entity_guid': 7208884, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912120.0060384, 'type': 7, 'pointer': 1729861822176, 'entity_guid': REDACTED, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
{'timestamp': 1693912120.0090806, 'type': 5, 'pointer': 1726732503760, 'entity_guid': 7654517, 'reader_base': 140702920409088, 'obj_manager_base': 1727293796752}
Nonworking:
Code:
{'timestamp': 1693912200.1197643, 'type': 5, 'pointer': 1726731736016, 'entity_guid': 7742270, 'reader_base': 140702920409088, 'obj_manager_base': 1727292814928}
{'timestamp': 1693912200.1217656, 'type': 8, 'pointer': 1726731735680, 'entity_guid': 830996489, 'reader_base': 140702920409088, 'obj_manager_base': 1727292814928}
{'timestamp': 1693912200.1262872, 'type': 5, 'pointer': 1726731736112, 'entity_guid': 7790791, 'reader_base': 140702920409088, 'obj_manager_base': 1727292814928}
{'timestamp': 1693912200.1272845, 'type': 5, 'pointer': 1726731735872, 'entity_guid': 7736862, 'reader_base': 140702920409088, 'obj_manager_base': 1727292814928}
{'timestamp': 1693912200.1477525, 'type': 5, 'pointer': 1726731736208, 'entity_guid': 7735901, 'reader_base': 140702920409088, 'obj_manager_base': 1727292814928}
Object count difference attributed to player location. (Orgrimmar [working character] vs. near spawn [non-working])