[SAMMELTHREAD] Kleine Scripting Fragen

Dein Problem konnte durch einen User gelöst werden? Bedank dich bei ihm indem du seinen Beitrag als Hilfreich markierst sowie einen Daumen oben dalässt
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hier mal etwas schöner:


    Dein Fehler war, dass du das SendClientMessage nicht in die Schleife gesetzt hattest :)

    Danke für deine schnelle Antwort.
    Jetzt ist dies aber nicht mehr sortiert sprich,


    Projektleiter: ArcadioN
    Head Admin: SpielerA
    Admin: SpielerB
    u.s.w

  • Lade mal crashdetect und poste dann mal deinen server_log :)

    Hi,
    danke schon mal für deine Hilfe. =)
    Hatte das Problem jetzt gefixxt, indem ich diese 2 Dinge jeweils beim Register, sowie beim Login gelöscht habe:
    new whirlpoolHash[129];
    WP_Hash(whirlpoolHash, sizeof(whirlpoolHash), inputtext);


    Jetzt lädt auch wieder alles normal. =)

  • Jetzt ist dies aber nicht mehr sortiert sprich,

    Achso du wolltest es sortiert, das musst du auch schreiben ^^ Denn bei deinem Code...war das auch nicht sortiert.


    Hol dir diese Include: https://raw.githubusercontent.…d-sort/master/md-sort.inc


    Und inkludiere die, anschließend kannst du das so machen:


    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Achso du wolltest es sortiert, das musst du auch schreiben ^^ Denn bei deinem Code...war das auch nicht sortiert.
    Hol dir diese Include: https://raw.githubusercontent.…d-sort/master/md-sort.inc


    Und inkludiere die, anschließend kannst du das so machen:


    Ich bin Adminlevel 6 und mir wird Ingame anzeiegt das ich Communityhelfer helfer bin ? :o

  • Ich bin Adminlevel 6 und mir wird Ingame anzeiegt das ich Communityhelfer helfer bin ? :o

    Bist du sicher, dass du das bist? :huh:


    Kannste ja leicht rausfinden, schreib mal die Schleife so:



    C
    for(new i=GetPlayerPoolSize(); i!=-1; i--)
    {
        if(!Spieler[i][pLoggedIn] || !Spieler[i][pAdminlevel]) continue;
        sort[c][0] = Spieler[i][pAdminlevel]-1, sort[c++][1] = i;
        printf("%d | %s",Spieler[i][pAdminlevel]-1,Spieler[i][pName]);
    }

    Und dann poste mal den Debug ausschnitt aus dem server_log :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Hi,
    folgendes:
    Nachdem ich mein Passwort eingegeben habe, dauert es immer 1500ms, bis ich In-Game bin, da ich es früher so gemacht habe unter DIALOG_REGISTER:
    "SetTimerEx("LoadAccount", 1500, false, "d", playerid);"


    LoadAccount:

    public LoadAccount(playerid)
    {
    new string[128];
    mysql_format(dbhandle, string, sizeof(string), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));
    new Cache:result = mysql_query(dbhandle, string);
    cache_set_active(result);
    cache_get_value_name_int(0, "id", sInfo[playerid][id]);
    cache_get_value_name_int(0, "money", sInfo[playerid][money]);
    cache_get_value_name_int(0, "alevel", sInfo[playerid][alevel]);
    cache_get_value_name_int(0, "skin", sInfo[playerid][skin]);
    cache_get_value_name_int(0, "level", sInfo[playerid][level]);
    cache_get_value_name_int(0, "kills", sInfo[playerid][kills]);
    cache_get_value_name_int(0, "deaths", sInfo[playerid][deaths]);


    sInfo[playerid][eingeloggt] = 1;


    SetPlayerMoney(playerid, sInfo[playerid][money]);
    SetPlayerScore(playerid, sInfo[playerid][level]);


    SendClientMessage(playerid, COLOR_GREEN, "[Willkommen]: Du hast dich erfolgreich eingeloggt.");
    if (GetPVarInt(playerid, "FirstSpawn") == 0)
    {
    if (isAdmin(playerid, 1))
    {
    format(string, sizeof(string), "{FFFF00}Du bist {FF4000}%s{FFFF00}.", TeamNames[sInfo[playerid][alevel]]);
    SendClientMessage(playerid, COLOR_YELLOW, string);
    }
    SetPVarInt(playerid, "FirstSpawn", 1);
    }


    SetPlayerSkin(playerid, sInfo[playerid][skin]);
    SpawnPlayer(playerid);


    cache_unset_active();
    cache_delete(result);
    sInfo[playerid][sektimer] = SetTimerEx("SekundenTimer", 1000, true, "d", playerid);


    Spectate[playerid] = TextDrawCreate(75.0, 150.0, " ");
    TextDrawFont(Spectate[playerid], 1);
    TextDrawLetterSize(Spectate[playerid], 0.25, 1.0);
    TextDrawHideForPlayer(playerid, Spectate[playerid]);
    SetPVarInt(playerid, "spectate", INVALID_PLAYER_ID);
    return 1;
    }


    Kann ich es irgendwie ohne großen Aufwand so umschreiben, dass ich nicht mehr die 1500ms warten muss?

  • Bist du sicher, dass du das bist? :huh:
    Kannste ja leicht rausfinden, schreib mal die Schleife so:



    C
    for(new i=GetPlayerPoolSize(); i!=-1; i--)
    {
        if(!Spieler[i][pLoggedIn] || !Spieler[i][pAdminlevel]) continue;
        sort[c][0] = Spieler[i][pAdminlevel]-1, sort[c++][1] = i;
        printf("%d | %s",Spieler[i][pAdminlevel]-1,Spieler[i][pName]);
    }

    Und dann poste mal den Debug ausschnitt aus dem server_log :)



    [15:26:05] [connection] 127.0.0.1:59073 requests connection cookie.
    [15:26:06] [connection] incoming connection: 127.0.0.1:59073 id: 0
    [15:26:07] [join] ArcadioN has joined the server (0:127.0.0.1)
    [15:26:15] 5 | ArcadioN


    In der Datenbank steht auch das ich Adminlevel 6 bin und nicht 5 :o

  • [15:26:15] 5 | ArcadioN

    Ah ja, hab vergessen die Leeren zu skippen. //Edit: Noch was vergessen, schreib es so:


    bis ich In-Game bin, da ich es früher so gemacht habe unter DIALOG_REGISTER:
    "SetTimerEx("LoadAccount", 1500, false, "d", playerid);"

    ...Du solltest dir mal anschauen (Tutorials), was es bedeutet Dinge asynchron laden zu lassen.
    Du solltest unter DIALOG_REGISTER anstatt dem Timer einfach mysql_pquery oder mysql_tquery nutzen und dann kein mysql_query mehr im Callback.


    Du willst nämlich gar kein mysql_query nutzen, deshalb nutzt du ja die Cache Version.
    mysql_query lädt alles synchron, du willst es aber asynchron, sonst bringen dir auch die Neusten Plugins überhaupt nix.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Ah ja, hab vergessen die Leeren zu skippen:

    Danke es funktioniert nun wunderbar.


    Ich habe da noch eine andere kleine Frage.


    Und zwar wenn ich im Taxi einsteige und den Preis eingebe wird es am falschen Taxi geupdatet.


    Code:



    case Dialog_TaxiCompany:
    {
    if(!response){ FreezePlayer(playerid); RemovePlayerFromVehicle(playerid); UnfreezePlayer(playerid); return 1; }
    if(response)
    {
    new str[128],TaxiGeld = strval(inputtext);
    new vehicleid = GetPlayerVehicleID(playerid);
    if(!strlen(inputtext)){ return ShowPlayerDialog(playerid,Dialog_TaxiCompany,DIALOG_STYLE_INPUT,"Taxi Company","Du kannst nun den Preis festlegen, den die Fahrgäste jede 10 Sekunden bezahlen.\nDer Preis muss mindestens 1$ und maximal 200$ sein.","Weiter","Aussteigen");}
    format(str,sizeof(str),"Taxi Company\n\nFahrer: %s\nKosten: %d",Spieler[playerid][pName],TaxiGeld);
    UpdateDynamic3DTextLabelText(Vehicle[Taxis[vehicleid]][vehText],Gelb,str);
    SendClientMessage(playerid,Hellblau,"Du bist nun im Dienst als Taxifahrer.");
    return 1;
    }
    }

  • Danke es funktioniert nun wunderbar.

    Bitte mach keine Vollzitate, das ist störend.


    Und ich hatte noch einen kleinen Fehler in der Version, nimm die, die ich da jetzt gepostet hatte.


    Und zwar wenn ich im Taxi einsteige und den Preis eingebe wird es am falschen Taxi geupdatet.

    1. Du solltest noch checken ob der Preis auch gültig ist. also > 0 und < 99999 usw :D


    2.

    Vehicle[Taxis[vehicleid]][vehText]

    Das sieht komisch aus.


    Eventuell eher so: Vehicle[vehicleid][vehText]


    Aber ich hab keine Ahnung, wie du das Label setzt und was genau Vehicle ist und macht. Ich kann hier nur raten ^^

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • ...Du solltest dir mal anschauen (Tutorials), was es bedeutet Dinge asynchron laden zu lassen.
    Du solltest unter DIALOG_REGISTER anstatt dem Timer einfach mysql_pquery oder mysql_tquery nutzen und dann kein mysql_query mehr im Callback.


    Du willst nämlich gar kein mysql_query nutzen, deshalb nutzt du ja die Cache Version.
    mysql_query lädt alles synchron, du willst es aber asynchron, sonst bringen dir auch die Neusten Plugins überhaupt nix.

    Werde ich sicherlich auch machen ^^
    Habe jetzt folgendes unter dem DIALOG_REGISTER eingefügt:
    "mysql_tquery(dbhandle, query, "LoadAccount", "d", playerid);"
    Was muss ich jetzt unter dem LoadAccount noch ändern? :/



    public LoadAccount(playerid)
    {
    new string[128];
    mysql_format(dbhandle, string, sizeof(string), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));
    new Cache:result = mysql_query(dbhandle, string);
    cache_set_active(result);
    cache_get_value_name_int(0, "id", sInfo[playerid][id]);
    cache_get_value_name_int(0, "money", sInfo[playerid][money]);
    cache_get_value_name_int(0, "alevel", sInfo[playerid][alevel]);
    cache_get_value_name_int(0, "skin", sInfo[playerid][skin]);
    cache_get_value_name_int(0, "level", sInfo[playerid][level]);
    cache_get_value_name_int(0, "kills", sInfo[playerid][kills]);
    cache_get_value_name_int(0, "deaths", sInfo[playerid][deaths]);


    sInfo[playerid][eingeloggt] = 1;


    SetPlayerMoney(playerid, sInfo[playerid][money]);
    SetPlayerScore(playerid, sInfo[playerid][level]);


    SendClientMessage(playerid, COLOR_GREEN, "[Willkommen]: Du hast dich erfolgreich eingeloggt.");
    if (GetPVarInt(playerid, "FirstSpawn") == 0)
    {
    if (isAdmin(playerid, 1))
    {
    format(string, sizeof(string), "{FFFF00}Du bist {FF4000}%s{FFFF00}.", TeamNames[sInfo[playerid][alevel]]);
    SendClientMessage(playerid, COLOR_YELLOW, string);
    }
    SetPVarInt(playerid, "FirstSpawn", 1);
    }


    SetPlayerSkin(playerid, sInfo[playerid][skin]);
    SpawnPlayer(playerid);


    cache_unset_active();
    cache_delete(result);
    sInfo[playerid][sektimer] = SetTimerEx("SekundenTimer", 1000, true, "d", playerid);


    Spectate[playerid] = TextDrawCreate(75.0, 150.0, " ");
    TextDrawFont(Spectate[playerid], 1);
    TextDrawLetterSize(Spectate[playerid], 0.25, 1.0);
    TextDrawHideForPlayer(playerid, Spectate[playerid]);
    SetPVarInt(playerid, "spectate", INVALID_PLAYER_ID);
    return 1;
    }

  • Was muss ich jetzt unter dem LoadAccount noch ändern?

    new string[128];
    mysql_format(dbhandle, string, sizeof(string), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));
    new Cache:result = mysql_query(dbhandle, string);
    cache_set_active(result);

    Das alles löschen.


    Vorrausgesetzt du verwendest jetzt den selben Query per mysql_tquery :)

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Vorrausgesetzt du verwendest jetzt den selben Query per mysql_tquery

    Ja, verwende ich =)


    //Edit: Wenn ich "new Cache:result = mysql_query(dbhandle, string);" entferne, kommt folgende Fehlermeldung:
    "script.pwn(1564) : error 017: undefined symbol "result"


    Das ist diese Zeile: cache_delete(result);


    Soll ich new [..] im Script lassen?


    2. Edit:
    Jetzt werde ich gar nicht erst gespawnt, nach der Passwort Eingabe:
    https://gyazo.com/93cb38cb6a71789f2aba1d6afc7c6070

    Einmal editiert, zuletzt von _Max ()

  • Kannst du löschen.
    Wie sieht denn jetzt dein Code aus?


    Zeig mal deinen Query und was im Callback steht :)

    Habe es jetzt wie folgt unter DIALOG_REGISTER:

    if(dialogid==DIALOG_REGISTER)
    {
    if(!response)
    return Kick(playerid);
    if(!isnull(inputtext) && strlen(inputtext) > 4)
    {
    new query[128];
    // new whirlpoolHash[129];
    //WP_Hash(whirlpoolHash, sizeof(whirlpoolHash), inputtext);
    mysql_format(dbhandle, query, sizeof(query), "INSERT INTO user (username, password) VALUES ('%s', '%s')", SpielerName(playerid), inputtext);
    //mysql_format(dbhandle, query, sizeof(query), "INSERT INTO user (username, password) VALUES ('%s', '%s')", SpielerName(playerid), whirlpoolHash);
    mysql_query(dbhandle, query);
    //SetTimerEx("LoadAccount", 1500, false, "d", playerid);
    mysql_tquery(dbhandle, query, "LoadAccount", "d", playerid);
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registrierung", "{FF0000}Dein Passwort muss mindestens 4 Zeichen lang sein!\n\n{FFFFFF}Herzlich Willkommen auf ...!\nEs scheint so, als hättest du noch keinen Account.\nBitte gebe jetzt dein gewünschtes Passwort ein.", "Registrieren", "Abbrechen");
    }
    }


    LoadAccount:

    public LoadAccount(playerid)
    {
    new string[128];
    // mysql_format(dbhandle, string, sizeof(string), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));
    // new Cache:result = mysql_query(dbhandle, string);
    //cache_set_active(result);
    cache_get_value_name_int(0, "id", sInfo[playerid][id]);
    cache_get_value_name_int(0, "money", sInfo[playerid][money]);
    cache_get_value_name_int(0, "alevel", sInfo[playerid][alevel]);
    cache_get_value_name_int(0, "skin", sInfo[playerid][skin]);
    cache_get_value_name_int(0, "level", sInfo[playerid][level]);
    cache_get_value_name_int(0, "kills", sInfo[playerid][kills]);
    cache_get_value_name_int(0, "deaths", sInfo[playerid][deaths]);


    sInfo[playerid][eingeloggt] = 1;


    SetPlayerMoney(playerid, sInfo[playerid][money]);
    SetPlayerScore(playerid, sInfo[playerid][level]);


    SendClientMessage(playerid, COLOR_GREEN, "[Willkommen]: Du hast dich erfolgreich eingeloggt.");
    if (GetPVarInt(playerid, "FirstSpawn") == 0)
    {
    if (isAdmin(playerid, 1))
    {
    format(string, sizeof(string), "{FFFF00}Du bist {FF4000}%s{FFFF00}.", TeamNames[sInfo[playerid][alevel]]);
    SendClientMessage(playerid, COLOR_YELLOW, string);
    }
    SetPVarInt(playerid, "FirstSpawn", 1);
    }


    SetPlayerSkin(playerid, sInfo[playerid][skin]);
    SpawnPlayer(playerid);


    cache_unset_active();
    //cache_delete(result);
    sInfo[playerid][sektimer] = SetTimerEx("SekundenTimer", 1000, true, "d", playerid);


    Spectate[playerid] = TextDrawCreate(75.0, 150.0, " ");
    TextDrawFont(Spectate[playerid], 1);
    TextDrawLetterSize(Spectate[playerid], 0.25, 1.0);
    TextDrawHideForPlayer(playerid, Spectate[playerid]);
    SetPVarInt(playerid, "spectate", INVALID_PLAYER_ID);
    return 1;
    }

  • mysql_tquery(dbhandle, query, "LoadAccount", "d", playerid);

    Nein, das ist Quatsch, du musst da sowas haben:



    mysql_format(dbhandle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));
    mysql_tquery(dbhandle, query, "LoadAccount", "d", playerid);
    Sonst würdest du ja, dein tquery auf das Insert Query ausführen und das macht natürlich keinen Sinn.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Nein, das ist Quatsch, du musst da sowas haben:


    mysql_format(dbhandle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' LIMIT 1;", SpielerName(playerid));mysql_tquery(dbhandle, query, "LoadAccount", "d", playerid);Sonst würdest du ja, dein tquery auf das Insert Query ausführen und das macht natürlich keinen Sinn.

    Hab es jetzt so geändert, dennoch ändert sich nach dem Registrieren nichts und ich bleibe in diesem Screen, wovon ich ein Post ein Screenshot gepostet habe. :/

  • Hab es jetzt so geändert, dennoch ändert sich nach dem Registrieren nichts und ich bleibe in diesem Screen, wovon ich ein Post ein Screenshot gepostet habe

    Kommen Fehler im crashdetect oder im mysql_log?


    Zeig mal, wie genau dein Code für den Aufruf aussieht.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S