Code:
{$lua}
-------------------- Main Section ---------------------
wowBaseAddress = getAddress("wow.exe");
--Offsets for classic wow - 8.2.0.31478
-- buildinfobuildnumberoffset = wowbaseaddress + 32589060;
-- buildinfoversionnumberoffset = wowbaseaddress + 32525904;
-- buildnumber = readstring(buildinfobuildnumberoffset,100,false);
-- buildversion = readstring(buildinfoversionnumberoffset,100,false);
-- localplayerguidoffset = wowbaseaddress + 39640256;
-- objectmanageroffset = wowbaseaddress + 40613984;
-- objectmanagerfirstobject = 24;
-- objectmanagernextobject = 48;
-- wowobjectguid=72;
-- wowobjectdescriptorfields=0;
-- wowobjecttype=16;
-- unittargetguidoffset = 5464;
--Load offsets from file? - we have a nice dictionary already which is loading these from signatures... seems silly to update these manually
--Offsets for classic wow - 1.13.231650
buildInfoBuildNumberOffset = wowBaseAddress + 29312492;
buildInfoVersionNumberOffset = wowBaseAddress + 29312484;
buildNumber = readString(buildInfoBuildNumberOffset,100,false);
buildVersion = readString(buildInfoVersionNumberOffset,100,false);
localPlayerGuidOffset = wowBaseAddress + 39973936;
objectManagerOffset = wowBaseAddress + 36867816;
objectManagerFirstObject = 24;
objectManagerNextObject = 112;
debuffAuraOffset = 12344;
wowObjectGuid=88;
wowObjectDescriptorFields=16;
wowObjectType=32;
--Unit Descriptors
unitTargetGuidOffset = 156;
wowObjectTypes = {
[0] = "Object",
[1] = "Item",
[2] = "Container",
[3] = "AzeriteEmpoweredItem",
[4] = "AzeriteItem" ,
[5] = "Unit",
[6] = "Player",
[7] = "ActivePlayer",
[8] = "GameObject",
[9] = "Dynamic",
[10] = "Corpse",
[11] = "Areatrigger",
[12] = "Scene",
[13] = "Conversation",
[14] = "AiGroup",
[15] = "Scenario",
[16] = "Loot",
[17] = "Invalid"
};
--Print Build Version
print("Wow Build number : "..buildVersion..buildNumber);
--Start Script
--Guide
function getObjectsFromObjectManager()
local foundObjects = {};
local objectManager = readQword(objectManagerOffset);
local nextObject = readQword(objectManager + objectManagerFirstObject);
local objectType = readBytes(nextObject + wowObjectType,1,false);
local objectCount = 0;
while ((nextObject & 1) == 0) and (nextObject ~= 0) do
wowObject = {};
wowObject.type = objectType;
wowObject.baseAddress = nextObject;
wowObject.descriptorBaseAddress = readQword(nextObject + wowObjectDescriptorFields);
local guidPart1 = readQword(nextObject + wowObjectGuid);
local guidPart2 = readQword(nextObject+8 + wowObjectGuid);
wowObject.guidPart1 = guidPart1;
wowObject.guidPart2 = guidPart2;
readUnitDescriptors(wowObject);
foundObjects[objectCount] = wowObject;
objectCount = objectCount + 1;
nextObject = readQword(nextObject + objectManagerNextObject);
objectType = readBytes(nextObject + wowObjectType,1,false);
end
print("object count:"..objectCount);
foundObjects.count = objectCount;
return foundObjects;
end
function readUnitDescriptors(wowObject)
if (wowObjectTypes[wowObject.type] == "Player" or wowObjectTypes[wowObject.type] == "Unit" or wowObjectTypes[wowObject.type] == "ActivePlayer") then
local guidPart1 = readQword(wowObject.descriptorBaseAddress + unitTargetGuidOffset);
local guidPart2 = readQword(wowObject.descriptorBaseAddress + unitTargetGuidOffset + 8);
wowObject.targetGuidPart1 = guidPart1;
wowObject.targetGuidPart2 = guidPart2;
end
end
function printObjectsFromObjectManager()
print("running printObjectsFromObjectManager");
local objects = getObjectsFromObjectManager();
print("FINISHED CALLING OBJECTS FROM OBJECT MANGER ");
print(objects.count);
for i=0,objects.count-1,1
do
local object = objects[i];
printObject(object);
end
end
function printObject(wowObject)
print("Wow Object Base Address: "..wowObject.baseAddress);
print("Wow Object Descriptor Base Address: "..wowObject.descriptorBaseAddress);
print("Wow Object Type: "..wowObjectTypes[wowObject.type]);
print("Wow Object Guid Part 1 : "..wowObject.guidPart1);
print("Wow Object Guid Part 2 : "..wowObject.guidPart2);
if (wowObjectTypes[wowObject.type] == "Player" or wowObjectTypes[wowObject.type] == "Unit" or wowObjectTypes[wowObject.type] == "ActivePlayer") then
print("Unit Object Target Guid Part 1 : "..wowObject.targetGuidPart1);
print("Unit Object Target Guid Part 1 : "..wowObject.targetGuidPart2);
end
end
function getObjectByGuid(guidPart1,guidPart2)
local objects = getObjectsFromObjectManager();
for i=0,objects.count-1,1
do
local object = objects[i];
if (guidPart1 == object.guidPart1 and guidPart2 == object.guidPart2) then
return object;
end
end
return nill;
end
function getPlayer()
local playerGuidPart1 = readQword(localPlayerGuidOffset);
local playerGuidPart2 = readQword(localPlayerGuidOffset+8);
return getObjectByGuid(playerGuidPart1,playerGuidPart2);
end
function getUnitTarget(unitObject)
local guidPart1 = unitObject.targetGuidPart1;
local guidPart2 = unitObject.targetGuidPart2;
if(guidPart1 == 0 and guidPart2 == 0) then
return nill;
end
return getObjectByGuid(guidPart1,guidPart2);
end
function getPlayerTarget()
local player = getPlayer();
return getUnitTarget(player);
end
function createAddressListEntry(name,address)
local addressList = getAddressList();
local addressListEntry = addressList.getMemoryRecordByDescription(name);
if addressListEntry == nill then
addressListEntry = addressList.createMemoryRecord();
end
addressListEntry.Description = name;
addressListEntry.Address = string.format("%x", address);
end
local player = getPlayer();
local playerTarget = getUnitTarget(player);
createAddressListEntry('ObjectManagerBaseAddress',readQword(objectManagerOffset));
createAddressListEntry('PlayerGuidOffset',localPlayerGuidOffset);
createAddressListEntry('PlayerBaseAddress',player.baseAddress);
createAddressListEntry('PlayerDescriptorsBaseAddress',player.descriptorBaseAddress)
if playerTarget ~= nill then
createAddressListEntry('PlayerTargetDebuffAuraAddress',playerTarget.baseAddress + debuffAuraOffset);
createAddressListEntry('PlayerTargetGuidAddress',playerTarget.baseAddress + wowObjectGuid);
createAddressListEntry('PlayerTargetBaseAddress',playerTarget.baseAddress);
createAddressListEntry('PlayerTargetDescriptorBaseAddress',playerTarget.descriptorBaseAddress);
end
-- code before either enable/disable section runs for both just like with AA code
if syntaxcheck then return end
if memrec then print(memrec.Description) end
-- the check is not really necessary but it is technically correct to have it
[ENABLE]
-------------------- Enable Section ---------------------
[DISABLE]
-------------------- Disable Section --------------------
-- print("disabled");
Cheers