Beiträge von Pille


    Problem immer noch nicht gelöst, brauch Hilfe!

    Geht recht einfach wenn du dir mithilfe einer .bat-Datei alle Dateien in einem Ordner in eine Datei schreiben lässt,
    diese kannst du dann auslesen, die Datei öffnen und das Geld auf 2000 o.ä. setzen.

    Guten Tag,


    Seltsamerweise crasht mein Server (allerdings nur manchmal), wenn Accounts gespeichert werden bzw.
    wenn ein Spieler die Verbindung trennt.


    Habe durch debugging herausgefunden, dass es wohl mit mysql_format zusammenhängt.
    Dazu noch folgendes im Server Log: (Crashdetect-Plugin)


    Code
    [14:22:42] [debug] Server crashed while executing lssf.amx[14:22:42] [debug] AMX backtrace:[14:22:42] [debug] #0 native mysql_format () [10008690] from mysql.DLL[14:22:42] [debug] #1 0019d2d0 in ?? () from lssf.amx[14:22:42] [debug] #2 00031294 in public JB_OnPlayerDisconnect () from lssf.amx[14:22:42] [debug] #3 native CallLocalFunction () [00471e90] from samp-server.exe[14:22:42] [debug] #4 0000fa5c in public Streamer_OnPlayerDisconnect () from lssf.amx[14:22:42] [debug] #5 native CallLocalFunction () [00471e90] from samp-server.exe[14:22:42] [debug] #6 000010b0 in public OnPlayerDisconnect () from lssf.amx[14:22:42] [debug] System backtrace:[14:22:42] [debug] #0 772735a7 in ?? () from C:\windows\SysWOW64\ntdll.dll[14:22:42] [debug] #1 77273492 in ?? () from C:\windows\SysWOW64\ntdll.dll[14:22:42] [debug] #2 768614dd in ?? () from C:\windows\syswow64\kernel32.dll[14:22:42] [debug] #3 690f3c1b in ?? () from C:\windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57\MSVCR90.dll[14:22:42] [debug] #4 10008b56 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\mysql.DLL[14:22:42] [debug] #5 004010b6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #6 7004340a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #7 70045aa6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #8 7003d621 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #9 7004345a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #10 0047219e in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #11 004010b6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #12 7004340a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #13 70045aa6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #14 7003d621 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #15 7004345a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #16 0047219e in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #17 004010b6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #18 7004340a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #19 70045aa6 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #20 7003d621 in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #21 7004345a in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\plugins\crashdetect.DLL[14:22:42] [debug] #22 0046c8cb in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #23 00465e9e in ?? () from D:\Pille\Dokumente\Spiele\GTA\Scripting\03x\samp-server.exe[14:22:42] [debug] #24 7636149d in ?? () from C:\windows\syswow64\KERNELBASE.dll[14:22:42] [debug] #25 763614d0 in ?? () from C:\windows\syswow64\KERNELBASE.dll


    Ich kann damit ehrlich gesagt nicht viel anfangen, deswegen bitte ich hier um Rat.

    new Zeichen[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; // Wir benötigen nur Integer!
    format(strings,sizeof(strings),"GER-%c%c-%i",Zeichen[random(25)],Zeichen[random(25)],kenzeichenzahl); // %c = Character ausgeben

    Das ist (zumindest für mich) etwas schwer zu erklären.
    Du lernst es am besten durch Übung und durch Beispiele.

    Schau mal in die MySQL Debug (bzw. schalte mal den MySQL Debug an, falls du es noch nicht hast ) und lasse mal crashdetect drüber laufen & poste dann das Ergebnis hier.


    LG


    Code
    [16:21:48] >> mysql_query_callback( Connection handle: 1 )
    [16:21:48] Passing query SELECT 1 | ii
    [16:21:48] ProcessQueryThread(mysql_Test) - Query was successful. (SELECT 1)
    [16:21:48] ProcessQueryThread(mysql_Test) - Data caching enabled.
    [16:21:48] CMySQLHandler::StoreResult() - Result was stored.
    [16:21:48] CMySQLHandler::FreeResult() - Result was successfully free'd.
    [16:21:48] CMySQLHandler::ProcessQueryThread() - Data is getting passed to ->ProcessTick()
    [16:21:48] mysql_Test(ii) - Threaded function called.
    [16:21:48] >> cache_get_data( Connection handle: 1 )


    Fehlt eigentlich nur folgende Zeile: [16:41:22] ProcessTick() - The cache has been cleared.


    MySQL kann auch nicht erraten von wo er 1 returnen soll.


    Eigentlich schon, es gibt ja Standardquerys bei MySQL.
    'SELECT 62+3" - 65
    "SELECT SUM(62,3)" - 65
    "SELECT NOW()" - 2013-02-24 16:26:37

    Erstelle eine Variable für jedes Auto, stelle sie auf true, wenn jemand einsteigt und auf false, wenn jemand aussteigt (boolean).
    Dann machst du einen Timer, der alle (500?) Millisekunden alle Fahrzeuge durchgeht (Nur die, die benutzt werden).
    Dann checkst du die Position, errechnest die Distanz, addierst diese und speicherst sie in eine andere Fahrzeug-Variable.

    Warum stürzt der Server manchmal ab, wenn ich diesen Befehl ausführe?


    if(strcmp(cmdtext,"/mysql",true)==0)
    {
    if(PlayerInfo[playerid][pAdmin]<1337) return 1;
    mysql_function_query(cH,"SELECT 1",true,"mysql_Test","ii",playerid,tickcount());
    return 1;
    }


    forward mysql_Test(playerid,tick);
    public mysql_Test(playerid,tick)
    {
    new fields,rows;
    cache_get_data(rows,fields);
    if(!rows)
    {
    SendClientMessage(playerid,COLOR_GRAD1,"Fehlgeschlagen!");
    return 1;
    }
    new string[50];
    cache_get_row(0,0,string);
    format(string,sizeof(string),"Ergebnis: %i (%i ms)",strval(string),tickcount()-tick);
    SendClientMessage(playerid,COLOR_GRAD1,string);
    return 1;
    }

    Also noch einfacher erklären, ging ja irgendwie nicht...und ich habe mir wirklich Mühe gegeben !


    Zudem musst du ja nicht mit #emit anfangen und es eigentlich auch nicht nutzen, es dient lediglich zur Information, dass es existiert ^^


    Es geht nicht darum, ob du es einfach oder kompliziert erklärst.
    Was fehlt sind die Grundlagen dieser Funktion, die Vorstellung der Möglichkeiten,
    die Erklärung weshalb, warum, wieso...


    Wenn du mir sagst: "Man kann #emit benutzen... Um Variablen zusammenzurechnen."
    dann kann damit kein Schwein was anfangen.

    Ich finde die ganze #emit-Sache bei dir leider schlecht erklärt.
    Du kennst dich vielleicht davon etwas aus, aber für jeamden dem das neu ist,
    der kann sich da schlecht was darunter vorstellen.


    Du föngst nämlich gleich mit dem Hauptteil an und zeigst ein paar Beispiele.
    Theorie ist auch, besonders bei solchen Sachen, wichtig.

    So darfst du das auf keinen Fall machen :pinch: :pinch:


    Der Server wird höllisch laggen, wenn jemand disconnected!
    Versuch pro Spieler nur ein Update-Befehl zu machen und
    verwende OnQueryFinish bzw. mysql_function_query!

    Er meint, das du es mit Sccanf Splitten sollst


    Falsch, ich meine, dass du mit strfind die Positionen herausfinden kannst,
    wo ein Parameter anfängt / endet, und du sie mit strmid dann speichern kannst.


    Wenn du das selbst klug machst, arbeitet es schnelelr als sscanf oder cache.

    strfind gibt die Position des gefundenen Zeichens zurück


    Wenn du also den Output-Text nach '|' durchsuchst, müsste er 11 zurückgeben (Zähl mal an welcher Position das erste | steht ^^)
    Als freiwilligen Parameter kannst du die Position angeben, bei der er anfangen soll zu suchen.
    Um den zweiten Parameter herauszufinden musst du als Startposition die gefundene Position +1 angeben. Also 12.


    Dann fängt er hier an zu suchen:
    Nightstr3am|5|1337|123


    Wenn er wieder ein | gefunden hat, gibt er die Position zurück. Die dürfte 13 sein.
    Das machst du immer so weiter, bis du den ganzen String durchhast.


    Strmid kannst du übrigens benutzen,
    um den Teilstring in einen anderen zu speichern. Dazu gibst du die Start- und Endposition an.
    Die findest du heraus, in dem du bei strfind die Werte die er zurückgibst,
    logisch angibst ^^


    Du musst ein bisschen rumprobieren, das ist nicht schwer ;)


    Code
    Nightstr3am|5|1337|123

    Wenn du eine Tabelle wiefolgt anlegst:


    Code
    Name          Level     AdminLevel     Passwort
    Nightstr3am     5          1337          123


    Wenn du nun "SELECT * FROM Acconuts WHERE Name = 'Nightstr3am'" als query aussendest,
    kommt folgender string raus: "Nightstr3am|5|1337|123"


    Diesen kannst du jetzt splitten (strfind, strmid)



    Zweite Möglichkeit:
    mysql_format(connectionHandle,"SELECT * FROM Accounts WHERE Name= '%e",SpielerName(playerid));
    mysql_function_query(cH,string,true,"LoadAccount","i",playerid);


    forward LoadAccount(playerid);
    public LoadAccount(playerid)
    {
    new rows,fields;
    cache_get_data(rows,fields);
    if(rows==0) return 1; // Account existiert nicht
    new string[128];
    cache_get_row(0,1,string);
    PlayerInfo[playerid][Level]=strval(string); // etc.
    }