Beiträge von [LP]Tochnas

    Vielen dank für hilfreiche Antworten, habe diese sofort umgesetzt und bei anderen möglichen Scriptabschnitte eingefügt.


    @Sh13
    Wie du siehst steht MAX_EINGANG auf 1 also geht er nur 1x durch.
    Das wird ja angepasst wieviele Eingänge ich habe.
    Genauso wie bei den Spielern, ich benutze nicht MAX_PLAYERS,
    sonder PlayerOnServer, ich benutze das um die for schleife auch nur wirklich so oft laufen zu lassen wieviele Spieler auch auf dem Server sind.

    Ich heute mit meinen Leichtsinnfehler....
    Sorry hier die Richtige Funktion....


    new mquery[512],query[128];
    strcat(mquery,"UPDATE `accounts` SET ");
    format(query,sizeof(query),"Level = '%d', ", SpielerInfo[playerid][pLevel]);
    strcat(mquery,query);
    format(query,sizeof(query),"Geld = '%d', ", SpielerInfo[playerid][pGeld]);
    strcat(mquery,query);
    format(query,sizeof(query),"Kills = '%d' ", SpielerInfo[playerid][pKills]); // bei der letzten Speicherung das "," weglassen
    strcat(mquery,query);
    // ...
    format(query,sizeof(query),"WHERE Name = '%s'", SpielerInfo[playerid][pName]);
    strcat(mquery,query);
    mysql_query(mquery);


    Zeit in ms: 2ms
    Deine Funktion: 54ms

    Hallo Breadfish,
    ich war den ganzen Tag an meinem Selfmade Script gehockt, und habe es
    Ressourcenschonend gemacht, wo es ging. Habe mir Tutorials/Code Optimierung angeguckt
    und mich gleich an mein Script gewackt, bevor es noch mehr Zeilen bekommt und ich 1 Monat daran hocke.
    Hatte beim Serverstart ca 250ms mittlerweile habe ich nur noch im Durschnitt 6ms.


    Mir wäre es dennoch recht wenn Profis mal drüber schauen könnten und mir vllt noch Scripttipps geben können.
    Scripten kann ich ja aber eben Ressourcenfressend. Dies möchte ich ablegen.


    Spriptzeilen 1914 !

    Pastebin


    Vielen dank für die hilfe


    /e Script und Pastebin Aktualisiert (30.07 19:51)
    /e Rechtschreibfehler ausgebessert

    Arbeite mit strcat


    Beispiel

    new query[128], name[32]; // Query anpassen
    format(query, sizeof(query), "UPDATE `accounts` SET ");
    strcat(query, "Level = '%d', ", SpielerInfo[playerid][pLevel]);
    strcat(query, "Geld = '%d', ", SpielerInfo[playerid][pGeld]);
    //...
    format(name, sizeof(name), "WHERE Name = '%s'",SpielerInfo[playerid][pName]);
    strcat(query, name);
    mysql_query(query);


    Edit: Fehler ausgebessert.

    Ich habe mir das Tutorial über sscanf 2.0 von maddin angeguckt und benutzt,
    aber ich bekomme keine Werte von meiner Datenbank auf meinen Spieler überschrieben, wenn er geladen wird.


    Spieler wird geladen...
    enum p_spielerdaten {
    pName[24], pPasswort[24],
    pAdmin, pAVeh,
    pGeld, pCoins,
    pHunger, pDurst, pHarndrang,
    pJob, pHartz,
    pPerso, pPayDayT,
    pBank, pZins
    };
    new SpielerInfo[MAX_PLAYERS][p_spielerdaten];


    stock LoadUserData(pid)
    {
    new str[512], str1[124];
    format(str1, sizeof(str1), "SELECT * FROM `accounts` WHERE `Name` = '%s'",T_Name(pid));
    if(!GetPVarInt(pid,"Eingeloggt")){
    printf("[ERROR 38500] %s ist nicht eingeloggt.", T_Name(pid)); return SendAdminMessage(COLOR_RED,1337,"[ERROR 38500]"); }
    mysql_query(str1);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))//Übergibt das was vorher aus der Tabelle geladen wurde an einen string.
    {
    sscanf(str, "e<p<,>{i}s[24]s[24]iiiiiiiiiiiii>",SpielerInfo[pid]);//teilt den string in seine bestandteile so wie wir es wollen und gibt es an das enum weiter
    }
    mysql_free_result();
    return 1;
    }


    Hoffe mir kann einer helfen....


    Edit:
    Ich habe nun einen Test gemacht, die Werte werden gelesen, aber die werden nicht in die Variablen eingetragen, woran könnte das liegen ?

    Ich hbae das Plugin installiert, Die Include eingefügt, den sscanf Ordner eingefügt (In den Hauptordner)


    Mein Code zum Spielerladen
    stock LoadUserData(pid)
    {
    new str[512], str1[124];
    format(str1, sizeof(str1), "SELECT * FROM `accounts` WHERE `Name` = '%s'",T_Name(pid));
    if(!GetPVarInt(pid,"Eingeloggt")){
    printf("[ERROR 38500] %s ist nicht eingeloggt.", T_Name(pid)); return SendAdminMessage(COLOR_RED,1337,"[ERROR 38500]"); }
    mysql_query(str1);//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
    mysql_store_result();
    while(mysql_fetch_row(str))//Übergibt das was vorher aus der Tabelle geladen wurde an einen string.
    {
    sscanf(str, "e<{i}s[24]s[24]iiiiiiiiiiiii>",SpielerInfo[pid]);//teilt den string in seine bestandteile so wie wir es wollen und gibt es an das enum weiter
    }
    mysql_free_result();
    return 1;
    }


    mein Enum
    enum p_spielerdaten {
    pName[24], pPasswort[24],
    pAdmin, pAVeh,
    pGeld, pCoins,
    pHunger, pDurst, pHarndrang,
    pJob, pHartz,
    pPerso, pPayDayT,
    pBank, pZins
    };
    new SpielerInfo[MAX_PLAYERS][p_spielerdaten];


    Aber ich bekomme keine Werte ausgegeben...

    Ich habe etwas Kopfschmerzen, wenn ich mir dieses Scriptteil anschaue... Ob es auch Ressourcenschonend ist,
    da ich ja beim Spielerladen und Speichern alles einzel abspeichere... Da wollte ich fragen gibt es eine schnellere methode ?


    Scriptteil
    stock LoadUserData(pid)
    {
    new name[16];
    format(name, sizeof(name), "%s",T_Name(pid));
    if(!GetPVarInt(pid,"Eingeloggt")){
    printf("[ERROR 38500] %s ist nicht eingeloggt.", name); return SendAdminMessage(COLOR_RED,1337,"[ERROR 38500]"); }
    SpielerInfo[pid][pAdmin] = mysql_GetInt("accounts","Admin","Name",name);
    SpielerInfo[pid][pGeld] = mysql_GetInt("accounts","Geld","Name",name);
    SpielerInfo[pid][pCoins] = mysql_GetInt("accounts","Coins","Name",name);
    SpielerInfo[pid][pHunger] = mysql_GetInt("accounts","Hunger","Name",name);
    SpielerInfo[pid][pDurst] = mysql_GetInt("accounts","Durst","Name",name);
    SpielerInfo[pid][pHarndrang] = mysql_GetInt("accounts","Harndrang","Name",name);
    SpielerInfo[pid][pJob] = mysql_GetInt("accounts","Job","Name",name);
    SpielerInfo[pid][pPerso] = mysql_GetInt("accounts","Perso","Name",name);
    SpielerInfo[pid][pHartz] = mysql_GetInt("accounts","Hartz","Name",name);
    SpielerInfo[pid][pPayDayT] = mysql_GetInt("accounts","PayDayT","Name",name);
    SpielerInfo[pid][pBank] = mysql_GetInt("accounts","Bank","Name",name);
    SpielerInfo[pid][pZins] = mysql_GetInt("accounts","Zins","Name",name);
    return 1;
    }


    stock SaveUserData(pid)
    {
    new name[16];
    format(name, sizeof(name), "%s",T_Name(pid));
    if(!GetPVarInt(pid,"Eingeloggt")){
    printf("[ERROR 38501] %s ist nicht eingeloggt.", name); return SendAdminMessage(COLOR_RED,1337,"[ERROR 38501]"); }
    mysql_SetInt("accounts","Admin",SpielerInfo[pid][pAdmin],"Name",name);
    mysql_SetInt("accounts","Geld",SpielerInfo[pid][pGeld],"Name",name);
    mysql_SetInt("accounts","Coins",SpielerInfo[pid][pCoins],"Name",name);
    mysql_SetInt("accounts","Hunger",SpielerInfo[pid][pHunger],"Name",name);
    mysql_SetInt("accounts","Durst",SpielerInfo[pid][pDurst],"Name",name);
    mysql_SetInt("accounts","Harndrang",SpielerInfo[pid][pHarndrang],"Name",name);
    mysql_SetInt("accounts","Job",SpielerInfo[pid][pJob],"Name",name);
    mysql_SetInt("accounts","Perso",SpielerInfo[pid][pPerso],"Name",name);
    mysql_SetInt("accounts","Hartz",SpielerInfo[pid][pHartz],"Name",name);
    mysql_SetInt("accounts","PayDayT",SpielerInfo[pid][pPayDayT],"Name",name);
    mysql_SetInt("accounts","Bank",SpielerInfo[pid][pBank],"Name",name);
    mysql_SetInt("accounts","Zins",SpielerInfo[pid][pZins],"Name",name);
    return 1;
    }


    Die Funktionen werden nur aufgerufen, wenn er Disconnectet oder bei OnGameModeExit

    bei
    enum AHandy
    {
    AnruferID
    }
    fehlt folgendes am ende ";"


    Aber sonst gutes Tutorial.... Für anfänger super erklärt
    9/10 Brauche ich nicht deswegen -1 :whistling:

    Ich habe sowas noch nicht gescriptet, aber ich sage, wenn ich nachdenke...


    Die Split-Funktion...


    also ich gebe ja z.B. 21.07.1988 ein, das muss ich ja spliten
    und dann errechne ich es mit dem heutigen Datum.....


    Eigentlich Recht Simple, wenn ich wüsste wie man Splittet ^^

    Ich kann mich ebenfalls nur den anderen anschließen, lass dir mehr Zeit beim Mappen,
    Lass mal paar unnütze Objekte fehlen und Arbeite genauer... Mappen ist eine Feinarbeit,
    nichts für Grobmotoriker ^^ (Deswegen Mappe ich nicht, sondern Scripte)


    Aber Idee und Umsetzung haste von mir immerhin 5/10 verdient


    Mag sein das es bei manch anderen Publics der Fall ist, aber bei OnPlayerText ist es meiner Meinung und Erfahrungsmässig auf 0
    Genauso wie bei OnPlayerCommandText... Bin Zwar kein Vollprofi im Scripten, aber meine Erfahrung habe ich gesammelt...