Hey,
das nicht alle Spiele Opensource sind ist erschwert natürlich den Prozess. Assault Cube ist deswegen auch echt gut zum Lernen. Wenn du den Sourcecode des Spiels nicht hast, dann musst du es wohl oder übel "reversen". Das heißt mithilfe eines Debuggers den ASM Code des Spiels nachvollziehen und interpretieren.
Ich weiß jetzt nicht was du mit anders vorgehen meinst. Im Prinzip ist es bei jedem Spiel das Gleiche. Irgendwo steht was du wissen willst und den Ort musst du finden. Wie du den Ort findest, dafür gibt es keine Allround-Lösung und das hat sehr viel mit Erfahrung und Trial & Error zu tun. Es gibt auch oft viele verschiedene Ansätze für das gleiche Problem.
Zu dem Pseudocode. Wenn du die Register an der Stelle auslesen willst (von deinem Programm aus), dann musst du in der Tat einen Debugger attachen--> Breakpoint an der Stelle setzen--> Register auslesen--> Breakpoint entfernen. Das ist schon ziemlich kompliziert.
Wenn es dir nur ums Auslesen geht, dann musst du eigentlich immer die EntityListe oder den ObjectManager oder was auch immer finden. Das sind dann eben die PointerArrays, für die jeweiligen Objekte. Über ReadProcessMemory lässt sich dann ganz einfach extern alles auslesen, oder du greifst intern über eine .dll direkt auf den Speicher zu.
//EDiT: Hab mich nochmal mit ReClass kurz rangesetzt. So ist es meiner Meinung nach am Einfachsten auf die Player zuzugreifen wenn man keine SDK hat.
Du definierst zwei Klassen, die EntityListe und die Playerklasse:
[code=C]
class cEntityList;
class cPlayer;
class cEntityList
{
public:
cPlayer** m_ppEntities; //0x0000
char _0x0004[4];
__int32 m_iMaxPlayers; //0x0008
char _0x000C[52];
};//Size=0x0040
class cPlayer
{
public:
char _0x0000[248];
__int32 m_iHealth; //0x00F8
char _0x00FC[836];
};//Size=0x0440
[/code]
Und jetzt kannst du sehr einfach und elegant auf alle Member (Player) zugreifen:
[code=C]
cEntityList *pEntityList = (cEntityList *)(0x0050F4F8);
for (int i = 0; i < pEntityList->m_iMaxPlayers - 1;i++)
{
cPlayer *pCurrentPlayer = NULL;
pCurrentPlayer = pEntityList->m_ppEntities[i];
if (pCurrentPlayer != NULL)
{
printf("PlayerIndex: %i - BaseAddress :%x - Health :%i\n", i, pCurrentPlayer, pCurrentPlayer->m_iHealth);
}
}
[/code]
das nicht alle Spiele Opensource sind ist erschwert natürlich den Prozess. Assault Cube ist deswegen auch echt gut zum Lernen. Wenn du den Sourcecode des Spiels nicht hast, dann musst du es wohl oder übel "reversen". Das heißt mithilfe eines Debuggers den ASM Code des Spiels nachvollziehen und interpretieren.
Ich weiß jetzt nicht was du mit anders vorgehen meinst. Im Prinzip ist es bei jedem Spiel das Gleiche. Irgendwo steht was du wissen willst und den Ort musst du finden. Wie du den Ort findest, dafür gibt es keine Allround-Lösung und das hat sehr viel mit Erfahrung und Trial & Error zu tun. Es gibt auch oft viele verschiedene Ansätze für das gleiche Problem.
Zu dem Pseudocode. Wenn du die Register an der Stelle auslesen willst (von deinem Programm aus), dann musst du in der Tat einen Debugger attachen--> Breakpoint an der Stelle setzen--> Register auslesen--> Breakpoint entfernen. Das ist schon ziemlich kompliziert.
Wenn es dir nur ums Auslesen geht, dann musst du eigentlich immer die EntityListe oder den ObjectManager oder was auch immer finden. Das sind dann eben die PointerArrays, für die jeweiligen Objekte. Über ReadProcessMemory lässt sich dann ganz einfach extern alles auslesen, oder du greifst intern über eine .dll direkt auf den Speicher zu.
//EDiT: Hab mich nochmal mit ReClass kurz rangesetzt. So ist es meiner Meinung nach am Einfachsten auf die Player zuzugreifen wenn man keine SDK hat.
Du definierst zwei Klassen, die EntityListe und die Playerklasse:
[code=C]
class cEntityList;
class cPlayer;
class cEntityList
{
public:
cPlayer** m_ppEntities; //0x0000
char _0x0004[4];
__int32 m_iMaxPlayers; //0x0008
char _0x000C[52];
};//Size=0x0040
class cPlayer
{
public:
char _0x0000[248];
__int32 m_iHealth; //0x00F8
char _0x00FC[836];
};//Size=0x0440
[/code]
Und jetzt kannst du sehr einfach und elegant auf alle Member (Player) zugreifen:
[code=C]
cEntityList *pEntityList = (cEntityList *)(0x0050F4F8);
for (int i = 0; i < pEntityList->m_iMaxPlayers - 1;i++)
{
cPlayer *pCurrentPlayer = NULL;
pCurrentPlayer = pEntityList->m_ppEntities[i];
if (pCurrentPlayer != NULL)
{
printf("PlayerIndex: %i - BaseAddress :%x - Health :%i\n", i, pCurrentPlayer, pCurrentPlayer->m_iHealth);
}
}
[/code]
"Auf dieser Welt gibt es mehr Scheisse als auf Festivalklos"