object manager - wow c# "problem"

05/17/2010 18:10 scenebase#1
Hi,
Hab mich jetzt mal an den Object Manager gemacht und irgendwie will das nicht so klappen wie es soll.

Der SourceCode:
Code:
            uint curObj, nextObj, localObj = 0;
            UInt64 localGUID;

            /*Offsets used:
             * CurrMgr_Offs = 0x00BB43F0 + 0x2EB0
             * CurrMgr_Frs = 0xAC
             * CurrMgr_Nxt = 0x3C
             */

            while (true)
            {
                BlackMagic wow = new BlackMagic();
                wow.OpenProcessAndThread(SProcess.GetProcessFromWindowTitle("World of Warcraft"));
 
                uint playerbase = wow.ReadUInt(wow.ReadUInt(wow.ReadUInt(0xB366D0) + 0x34) + 0x24);
 
                localGUID = wow.ReadUInt64(0x00BB43F0 + 0x2EB0);
                Console.WriteLine("LocalGuid: 0x{0:X016}", localGUID);
 
                curObj = wow.ReadUInt(0x00BB43F0 + 0xAC);
                nextObj = curObj;
 
                localObj = curObj;
 
                float x = wow.ReadFloat(playerbase + 0x798);
                float y = wow.ReadFloat(playerbase + 0x79C);
                float z = wow.ReadFloat(playerbase + 0x7A0);
 
                Console.WriteLine("0x{0:X08} -- | {2} {3} {4}", curObj, x, y, z);
 
                nextObj = wow.ReadUInt(curObj + 0x3C);
                if (nextObj == curObj)
                    break;
                else
                    curObj = nextObj;
            }
 
            Console.ReadLine();
& einmal auf NoMorePasting:
[Only registered and activated users can see links. Click Here To Register...]

Fehler in Zeile 40 bzw. 20 :
Der Index, basierend auf 0 (null), muss größer als oder gleich Null sein, und kleiner als die Größe der Argumentenliste.

Wo liegt der Fehler?

Danke für eure hilfe ;)
05/20/2010 00:52 Bot_interesierter#2
Ich kenne mich mit C# zwar nicht aus aber ich nehme einfach mal an das du
Code:
 Console.WriteLine("0x{0:X08} -- | {1} {2} {3}", curObj, x, y, z);
schreiben musst.

Übrigens ist es keine gute Idee in jedem Schleifendurchlauf ein neues BlackMagic Objekt zu erzeugen, zwar wird die Garbagecollection das aufräumen, jedoch kostet das verdammt viel Rechenzeit und solange die Garbagecollection noch nicht da war auch Speicher.
Du solltest in deinem Programm nur eine Instanz von BlackMagic erzeugen und diese über die Laufzeit deines Programms behalten, das spart dir eine Menge Rechenzeit.
05/24/2010 14:36 Bl@ze!#3
Aua, gib mir nen Moment.

Edit:

Das Problem liegt bei dir, dass du den Objektmanager nicht richtig verstanden hast und das du .toString() aufrufen musst wenn du ConsoleWrite bentuzt. (Die zweite Aussage ist nur eine Vermutung, da ich das nicht zu 100% sagen kann, ich arbeite sehr sehr sehr sehr sehr sehr sehr selten mit C#.)

So sollte es funktionieren...

Code:
	private uint firstObject()
	{
		//! First Object auslesen
	}

	private uint nextObject(uint aCurObject)
	{
		//! nextObject auslesen
	}
	
	private uint objectGUID(uint aCurObject)
	{
		// object Guid auslesen
	}	
	
	private float objectPositionX(uint aCurObject)
	{
		//! ... :)
	}

	private float objectPositionY(uint aCurObject)
	{
		//! ... :)
	}
	
	private float objectPositionZ(uint aCurObject)
	{
		//! ... :)
	}
	
	BlackMagic wow = new BlackMagic();
	wow.OpenProcessAndThread(
		SProcess.GetProcessFromWindowTitle("World of Warcraft"));
		
	uint playerBase = wow.ReadUInt(wow.ReadUInt(wow.ReadUInt(0xB366D0) + 0x34) + 0x24);
 
 
	//! Die ersten 500 Objekte

	uint curObject = firstObject();// firstObject() auslesen.
	
	for (int i = 0; i < 500; i++)
	{
		curObject = nextObject(curObject);
		
		if (curObject == 0)
			break;
			
		uint objectGUID 		= objectGuid(curObject);
		float objectPositionX	= objectPositionX(curObject);
		float objectPositionY	= objectPositionY(curObject);
		float objectPositionZ 	= objectPositionZ(curObject);
		
		// Console Write (mit .toString())			
		
		Console.ReadLine();
	}
Pastebin link: [Only registered and activated users can see links. Click Here To Register...]
05/24/2010 14:52 scenebase#4
Danke dir, ich werde es gleich mal probieren und dir bescheid geben :)
05/24/2010 14:54 Bot_interesierter#5
@Unk0wn0x
ToString ist nicht erforderlich, lies die MSDN Seite über Console.WriteLine und Format Strings, der Fehler wird erzeugt weil sein Format String nicht den Regeln entspricht, er benutzt ein Format Array und übergibt Objekte als Argument, im Format Array hat er jedoch die Indexe falsch gezählt, deshalb auch der Vielsagende Compilerfehler.
05/24/2010 16:32 scenebase#6
Code:
                    float oX = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x40);
                    float oY = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x44);
                    float oZ = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x48);
Sind die offsets richtig?

Output sieht so aus:
[Only registered and activated users can see links. Click Here To Register...]

Jetzt brauch ich nur noch das Offset für Object Type.
05/25/2010 17:09 Bot_interesierter#7
Wenn ich mich nicht ganz täusche dann sind die Offests wie folgt:
Code:
float oX = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x28);
float oY = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x2C);
float oZ = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x30);
float oR = wow.ReadFloat(wow.ReadUInt(curObj + 0x08) + 0x34);

uint32 object_t = wow.ReadUInt(wow.ReadUInt(curObj + 0x08)+0x8);
Ich garantiere aber nicht dafür dass die Offsets stimmen
05/25/2010 22:53 Endecs#8
Machs so:

Code:
uint curObj = getFirstObj();
            while (true)
            {
                

                curObj=getNextObj(curObj);
                if (curObj == 0)
                {
                float XX = bm.ReadFloat(playerBase + 0x798);
                float YY = bm.ReadFloat(playerBase + 0x79C);
                float ZZ = bm.ReadFloat(playerBase + 0x7A0);
                
                Console.WriteLine("{0} {1} {2}", XX.ToString(), YY.ToString(), ZZ.ToString());;
                    Console.WriteLine("Round passed");
                    Console.ReadLine();
                    curObj = getFirstObj();
                }
                if (getType(curObj) == 5)
                {
                    Console.WriteLine("{0} found @ {1} {2} {3}", getObjName(curObj).ToString(), getOX(curObj).ToString(), getOY(curObj).ToString(), getOZ(curObj).ToString());
                    
                }
                
            }


 static uint getFirstObj()
        {
            try
            {
                uint s_curMgr = bm.ReadUInt(bm.ReadUInt(0x00BB43F0) + 0x2EB0);
                return bm.ReadUInt(s_curMgr + 0xAC); //Firstobject
            }
            catch { return 0; }
        }


static uint getNextObj(uint curObj)
        {
            try
            {
                return bm.ReadUInt(curObj + 0x3C);
            }
            catch { return 0; }
        }

etc.