i stopped playing AoC, because funcom sucks.
i started a bot but iam too lazy to finish it.
here is a code snippet of my work (bad written c#, but it works *g*)
it shows how to get all objects around the player
you get the getOffset values from the xml
all offsets are decimal.
Code:
int ptr = memory.ReadInteger(getOffset("basePTR"));
endPTR = memory.ReadInteger(ptr + 0x4);
int nextPTR = memory.ReadInteger(endPTR + 0x4);
playerID = memory.ReadInteger(getOffset("playerPTR"));
Stack pointerStack = new Stack(32);
int lastPtr = 0;
int ptrErr = 0;
while (attached && running && memory.IsOpen)
{
byte[] isLastUnit = memory.ReadBuffer(nextPTR + getOffset("U_isLastUnit"), 1);
if (isLastUnit[0] == 1)
{
if (pointerStack.Count > 0)
nextPTR = (int)pointerStack.Pop();
else
break;
continue;
}
int firstptr = memory.ReadInteger(nextPTR + getOffset("U_FirstPointer"));
if (!pointerStack.Contains(firstptr))
pointerStack.Push(firstptr);
Units obj = null;
if (objsByPtr.Contains(nextPTR))
{
obj = (Units)objsByPtr[nextPTR];
if (!obj.Update())
obj = null;
}
if (obj == null)
{
obj = new Units(nextPTR, this);
obj.Update();
}
int unitID = memory.ReadInteger(nextPTR + getOffset("U_UnitID"));
if (unitID == playerID)
globals.player = obj;
if (globals.player != null && unitID == globals.player.TargetID)
{
targetID = unitID;
globals.target = obj;
}
if (!byPtr.Contains(nextPTR))
byPtr.Add(nextPTR, obj);
if (!byId.Contains(obj.UnitID))
byId.Add(obj.UnitID, obj);
// Detect memory-loop
if (lastPtr == nextPTR)
{
ptrErr++;
if (ptrErr == 5)
break;
}
else
{
lastPtr = nextPTR;
ptrErr = 0;
}
nextPTR = memory.ReadInteger(nextPTR + getOffset("U_SecondPointer"));
}
if (globals.player != null && globals.player.UnitID != playerID)
globals.player = null;
if (globals.target != null && globals.target.UnitID != targetID)
globals.target = null;
updateWait.Set();
Thread.Sleep(interval);
here the xml with the offsets:
Code:
<?xml version="1.0" encoding="utf-8" ?>
<Offsets>
<!-- Base + Player Pointer -->
<Offset>
<name>basePTR</name>
<addr>20704240</addr>
</Offset>
<Offset>
<name>playerPTR</name>
<addr>34540152</addr>
</Offset>
<!-- Unit Offsets -->
<Offset>
<name>U_FirstPointer</name>
<addr>0</addr>
</Offset>
<Offset>
<name>U_SecondPointer</name>
<addr>8</addr>
</Offset>
<Offset>
<name>U_UnitID</name>
<addr>12</addr>
</Offset>
<Offset>
<name>U_UnitType</name>
<addr>16</addr>
</Offset>
<Offset>
<name>U_DataPTR</name>
<addr>20</addr>
</Offset>
<Offset>
<name>U_isLastUnit</name>
<addr>25</addr>
</Offset>
<!-- UnitData Offsets -->
<Offset>
<name>D_PositionPTR</name>
<addr>0</addr>
</Offset>
<Offset>
<name>D_Combatstat</name>
<addr>56</addr>
</Offset>
<Offset>
<name>D_Weaponstat</name>
<addr>304</addr>
</Offset>
<Offset>
<name>D_ResourceName</name>
<addr>360</addr>
</Offset>
<Offset>
<name>D_Level</name>
<addr>440</addr>
</Offset>
<Offset>
<name>D_ResourcePercent</name>
<addr>496</addr>
</Offset>
<Offset>
<name>D_TargetID</name>
<addr>5216</addr>
</Offset>
<Offset>
<name>D_TargetType</name>
<addr>5220</addr>
</Offset>
<Offset>
<name>D_Name</name>
<addr>5328</addr>
</Offset>
<Offset>
<name>D_ObjectType</name>
<addr>5348</addr>
</Offset>
<Offset>
<name>D_isNPC</name>
<addr>5556</addr>
</Offset>
<Offset>
<name>D_maxHP</name>
<addr>5724</addr>
</Offset>
<Offset>
<name>D_HP</name>
<addr>5728</addr>
</Offset>
<Offset>
<name>D_Mana</name>
<addr>5732</addr>
</Offset>
<Offset>
<name>D_maxMana</name>
<addr>5736</addr>
</Offset>
<Offset>
<name>D_Stamina</name>
<addr>5740</addr>
</Offset>
<Offset>
<name>D_maxStamina</name>
<addr>5744</addr>
</Offset>
<!-- Position Offsets -->
<Offset>
<name>P_XPos</name>
<addr>0</addr>
</Offset>
<Offset>
<name>P_ZPos</name>
<addr>4</addr>
</Offset>
<Offset>
<name>P_YPos</name>
<addr>8</addr>
</Offset>
<Offset>
<name>P_Heading</name>
<addr>108</addr>
</Offset>
<Offset>
<name>P_Heading2</name>
<addr>116</addr>
</Offset>
</Offsets>