[AHK][Hilfe] Funktionen erstellen

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
  • Hallo,


    wollte mal fragen ob jemand mir genau erklären kann wie ich aus z.B. #define SAMP_FUNC_SPAWN 0x3AD0 eine Funktion erstellen kann? Alle Infos wie die Beispiel Definition von hier.
    Ich bin mir nicht sicher wie das gehen soll.


    Mit freundlichen Grüßen,
    TonicZ

    ~gez. TonicZ

  • Wenn du dich wirklich mit dem Thema beschäftigen willst, solltest du Kenntnis haben von:
    1. C/C++
    2. Calling Conventions
    3. den Memory und callWithParams Funktion der UDF, oder deinen eigenen Memory Funktionen
    4. grundlegendes Assemblerverständnis


    Also die Funktion als Beispiel, einfach nur aus dem s0beit Source in AHK und die UDF Funktion zu integrieren wäre einfach:

    C
    void playerSpawn(void)
    {
    	if (g_SAMP == NULL)
    		return;
    
    
    	((void(__thiscall *) (void *_this)) (g_dwSAMP_Addr + SAMP_FUNC_REQUEST_SPAWN)) (g_Players->pLocalPlayer);
    	((void(__thiscall *) (void *_this)) (g_dwSAMP_Addr + SAMP_FUNC_SPAWN)) (g_Players->pLocalPlayer);
    }

    Es gibt zwei Funktionsaufrufe, die komplett identisch sind, bis auf die aufgerufene Funktion natürlich. Du hast also nur einen Parameter, in diesem Fall den Local-Player-Pointer.
    Wenn du dir die callWithParams Funktion anschaust, solltest du schnell erkennen, welche Parameter wie zu übergeben sind.
    Für so eine einfache Funktion ist es wie gesagt, mit den in der UDF enthalten Memory Funktionen ziemlich einfach. Aber je mehr du ausprobieren willst, desto wichtiger ist es, dass du dich informierst über die Zusammenhänge.

  • Beispielweise so?:
    Grund Funktion: callWithParams_(hProcess, dwFunc, aParams, bCleanupStack = true, thiscall = false)


    callWithParams_(hGTA, dwSAMP, SAMP_FUNC_REQUEST_SPAWN, bCleanupStack = true, thiscall = false) ?

    ~gez. TonicZ

  • Ich habe folgendes getestet aber es hat nicht funktioniert:

    Code
    Numpad5::
    {
    localPlayerPointer := readMemory(hGTA, 0xB6F5F0)
    	callWithParams_(hGTA, dwSAMP + 0x3EC0, [["i", localPlayerPointer]], true, false)
    }
    return

    Oder wie würde die Spawn funktion aussehen?

    ~gez. TonicZ

    Einmal editiert, zuletzt von _ArtaX ()

  • stLocalPlayer ist eine Struktur in der SAMP.dll. Dazu gibt es in der UDF auch schon Funktionen, die diese Pointer nutzen. In den globalen Variablen wirst du auch die Offsets dazu finden, oder eben im s0beit Source:

    In der UDF wird es etwas umständlich so gemacht, funktioniert aber problemlos:


  • stLocalPlayer ist eine Struktur in der SAMP.dll. Dazu gibt es in der UDF auch schon Funktionen, die diese Pointer nutzen. In den globalen Variablen wirst du auch die Offsets dazu finden, oder eben im s0beit Source:

    In der UDF wird es etwas umständlich so gemacht, funktioniert aber problemlos:


    dwLocalPlayer ist dann der localPlayerPointer?

    ~gez. TonicZ

  • Ich weiss leider nicht was ich da falsch mache

    ~gez. TonicZ

  • Ist an sich schon richtig, aber RequestSpawn macht erstmal nix du musst dann 0x3AD0 ebenfalls noch aufrufen.
    Edit: true, false ist aber falsch, der Stack muss nicht gecleant werden denn es ist ein Thiscall. Also false, true