SendCommand über ASM, besser und schneller als jeglicher KeyBinder

  • Moin, hab mal n bisschen in GTA rumgestöbert und siehe da ich habe einen schnelleren weg gefunden CMD's vom Client zum Server zu senden. (Normale Text funktionieren bis jetzt noch nicht)


    Ihr fragt euch sicherlich jetzt Das ist schneller als ein keybinder? niemals, ich erkläre euch kurz die wege in einem simplen pseudo code:


    Keybinder Weg:
    1) Drückt T und öffnet den Chat
    2) Gibt einen Befehl so schnell ein das man ihn nicht sieht (bsp: /buyweapon AK47)
    3) der Befehl wird in einem register gespeichert
    4) samp.dll sendet den string an der Server über einer Funktion die in der samp.dll aufgerufen wird zb: "SendCommand(char* cmd)"


    Mein Weg ist viel schneller:
    * In Unsere DLL rufen wir die Funktion so auf: "SendChat("/buyweapon AK47")";
    1) Funktion Kopiert den string in einem register.
    2) callt die SendCommand funktion und sendet den Befehl aus dem register sofort zum server.


    Klingt einfach oder?


    PS: Das hier ist nichts für anfänger, fragt mich nicht wie benutze ich diesen code, ich werde keine hilfestellung dafür geben. C++ Basic solltet ihr können.



    // Ihr solltet die SAMP base Adresse bekommen, das geht so:
    DWORD adr_SAMP = GetModuleHandle(0, "samp.dll");
    #define FUNC_SENDCMD 0x3CAC0
    void SendChat(char *msg)
    {
    if(msg == NULL)
    return;

    if(msg[0] == '/')
    {
    int func = adr_SAMP + FUNC_SENDCMD;
    __asm push msg
    __asm call func


    }
    else
    {
    //int func = adr_SAMP + FUNC_SAY;
    //__asm mov ebx, dword ptr[LokalerSpieler?]
    //__asm push msg
    //__asm call func
    //__asm pop ebx


    }
    }


    // Wenn wir jetzt SendChat("/enter") aufrufen sendet der Client den Befehl sofort zum Server, ohne das er etwas im Chat eingibt.
    SendChat("/enter"); // So rufen wir die Funktion auf.


    Edit: Rechtschreibung verbessert. ^^
    Edit 2: Offsets eingefügt, habs vergessen.

    SA-MP Scripting Hilfe/Erklärungen bekommt ihr auf der SA-MP Wikipedia

    Einmal editiert, zuletzt von .#~Momo ()

  • Mein Weg ist viel schneller:
    * In Unsere DLL rufen wir die Funktion so auf: "SendChat("/buyweapon AK47")";
    1) Funktion Kopiert den string in einem register.
    2) callt die SendCommand funktion und sendet den Befehl aus dem register sofort zum server.


    Die ein oder zwei Frames die man dabei spart, wenn man die samp send-chat Funktion direkt aufruft machen einen Keybinder auch nicht viel besser. (Vielleicht, wenn man sowieso nur sehr wenige FPS hat.)



    Er sagt also "Mein Weg ist viel schneller"? Schade, dass wir seinen Weg nicht zu gesicht bekommen, oder ist sein weg copy&paste & sein namen drunter setzen?
    Der Code ist naemlich eindeutig vom mod_sa source code (addSayToChatWindow in samp.cpp).
    Ist soweit ich weiss ein Lizenzbruch der GPL, wenn man keine korrekte Quelle angibt, oder sogar Teile einfach als sein eigen ausgibt.


    Moin, hab mal n bisschen in GTA rumgestöbert und siehe da ich habe einen schnelleren weg gefunden CMD's vom Client zum Server zu senden. (Normale Text funktionieren bis jetzt noch nicht)

    Er meinte wohl im mod_sa quelltext rumgestoebert. Ganz zu schweigen davon, dass es technisch mit GTA selbst recht wenig zu tun hat.


    Ich grabe den das alte Thema nochmal aus, ich habe lange nach so einer lösung gesucht weiß jemand wie man das in Visual Basic macht?


    Du muesstest entweder deinen Assembly code in den gewuenschten Prozess schreiben, wo er auf jeden Fall aufgerufen wird, was aber einiges an Assembly kenntnissen erfordert, oder eine DLL in den Prozess injezieren.
    Nur mit Visual Basic ist eine Umsetzung meinem Kenntnisstand nach nicht moeglich, denn selbst, wenn deine VB-DLL in dem Prozess ist kannst du nicht so einfach aus deiner virtuellen Umgebung raus und (nicht exportierte) Funktionen einer anderen Datei aufrufen. Daher waere es um einiges leichter eine DLL in einer Sprache zu schreiben, die nicht interpretiert wird, sondern direkt in OP-codes umgewandelt wird und die gewuenschten operationen durch diese DLL ausfuehren zu lassen.
    Noch einfacher waere natuerlich die Benutzung von mod_sa, da der oben gezeigte Code ja auch von dort ist und man dort nur die ini-datei umaendern muss, um die chat funktion zu nutzen (wobei, wie bereits gesagt die zeit ersparnis im Vergelich zu z.B. autohotkey nicht sonderlich gross ist).

  • Funktioniert bei mir nicht.. ;(
    So sieht mein Code aus..


    Wenn ich die Funktion jetzt über die fertige .dll aufrufen will passiert nichts.
    Die Adresse sollte in 0.3d funktionieren :I

  • #define FUNC_SENDCMD 0x60910
    void addSayToChatWindow ( char *msg )
    {


    DWORD g_dwSAMP_Addr = ((DWORD)get_dll_base("samp.dll") + 0x021EA150);


    if ( msg == NULL )
    return;


    if ( msg[0] == '/' )
    {
    __int32 func = g_dwSAMP_Addr + FUNC_SENDCMD;
    __asm push msg
    __asm call func
    }
    else
    {


    }
    }



    HANDLE get_dll_base(char* dllname){
    HANDLE pHandle = GetModuleHandle(dllname);
    if((DWORD)pHandle){
    return pHandle;
    }else{
    return NULL;
    }
    }


    So funktioniert es leider nicht. Ich brauch ja die SAMP Base Adresse, und die wird im mod_sa source ganz kompliziert geholt..
    DWORD g_dwSAMP_Addr = ((DWORD)get_dll_base("samp.dll") + 0x021EA150);


    Denke das ist der Fehler..

  • Ich meinte damit nicht die API, die kenn ich ja.


    Ich suche die Memory Adresse bzw den offset auf die samp.dll für Text zu senden.


    Danke für diene Hilfe




    // Edit
    hat sich erledigt, da Momo die Sache eh nicht geschrieben hat, sondern von Mod_SA geklaut hat, ist es natürlich einfach dran zu kommen.





    LG

    Einmal editiert, zuletzt von Feet ()