Drop pick up

01/06/2016 13:05 failbase#1
Hallo und guten Morgen :)

ich beschäftige mich zurzeit mit "Cheat Engine" und wollte Fragen wie ich vorgehen kann bzw. ob es überhaupt möglich ist, dass ich mit einmal aufheben alle Drops um mich herum auf einmal aufheben kann, oder was noch besser wäre, ob es funktioniert dass die Drops sofort ins Inventar kommen.

Wäre dankbar über eine Vorgehensweise!

Grüße & schönen Tag euch!
Danke im vorraus!
01/06/2016 17:00 Blubxx33#2
Per cheat engine nicht möglich
01/06/2016 21:11 failbase#3
Wie dann?

Grüße
01/07/2016 00:31 -STORM-#4
Es ist mit CE möglich, aber recht kompliziert. Das kann ich nicht eben in ein paar Zeilen erklären.

CE bietet die Möglichkeit, LUA Scripte auszuführen.
Wenn du die Funktion kennst, die im Clienten das Item aufhebt, kannst du in LUA einen neuen Thread erstellen und in dem diese Funktion callen. Dazu brauchst du natürlich noch die Parameter der Funktion, das dürfte die GUID des Items und evtl noch weitere sein.

Bei den alten Versionen von LC sind im Clienten noch die Namen der Funktionen enthalten, die kannst du dann einfach in CE auflisten und nach PickItem o.ä. suchen.
Ist das nicht der Fall, könnte man die GUID des Items im Speicher finden, einen Access Breakpoint darauf setzen und schauen, welche Funkionen darauf zugreifen. Dürfte aber ziemlich aufwändig sein.

Dann kann man das Script natürlich so anpassen, dass z.B. alle 100ms sämtliche Items im Radar aufgehoben werden, oder nur Items mit einer bestimmten ID, z.B. HS, oder was auch immer.
01/07/2016 01:09 wurstbrot123#5
man kann doch mit cheat engine auch assembler scripts ausführen oder ?
Jedenfalls hab ich das früher so in etwa gemacht:

Code:
void PickUpHack()
{
	
	DWORD xxx = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( baseadr )));;
	xxx += 0x1C;
	xxx = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( xxx)));
	xxx += 0x10;
	xxx = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( xxx )));
	xxx += 0x04;
	xxx = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( xxx)));


	DWORD * ecx = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( baseadr )));
	DWORD oldprotection = 0;

	// ?SendPickMessage@CNetworkLibrary@@QAEXPAVCEntity@@KH@Z
	typedef int ( __thiscall * SendPickMessageType )( DWORD * ecx, DWORD centity, unsigned long itemid, BOOL bLayerCheck );
	SendPickMessageType SendPickMessage = (SendPickMessageType)GetProcAddress( GetModuleHandle("engine"), "?SendPickMessage@CNetworkLibrary@@QAEXPAVCEntity@@KH@Z" );
	
	DWORD adr = (DWORD)SendPickMessage;
	adr += 0x1C;
	adr = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( adr )));
	reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( adr ))) = 1;
	DWORD itemid = 0;
	
	DWORD numberofitems = *(DWORD*)baseadr;
	numberofitems = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>(numberofitems+0x1C)));
	numberofitems = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>(numberofitems+0x4C))); // 0x2C == Number of Player | 0x4C == number of items

	if( numberofitems )
	{
		if ( checkinventoryspace() )
		{
			DWORD firstradaritem = *(DWORD*)baseadr;
			firstradaritem = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>(firstradaritem +0x1C)));
			firstradaritem = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>(firstradaritem +0x48)));

			for( unsigned int i = 0; i < numberofitems; ++i )
			{
				itemid = reinterpret_cast<DWORD*>(*( reinterpret_cast<DWORD*>( firstradaritem+( 0x90 * i ) )));
				SendPickMessage( ecx, xxx, itemid, FALSE );
				Sleep(200);
			}
		}
	}
}
Wäre mit Assembler natürlich auch möglich ( der Code ist für eine DLL ).
Nebenbei könnte man natürlich auch einfach eine beschreibbare leere Stelle im Code
suchen dort den Assemblercode dafür schreiben und dann zb die Drawschleife
darauf umleiten. Es gibt einige möglichkeiten jedoch etwas komplizierter als
selber einfach n hack zu erstellen.