Beiträge von Jeffry

    Wie auch immer, der Code funktioniert so wie er ist, und macht das was er soll. Wenn irgendjemand einen besseren hat darf er den gerne posten ansonsten lasst es. Und wenn du mir ein Beispiel bringst wie man es besser machen kann, das aber "nicht unbedingt" das Gleiche macht dann ist das für mich absoluter Bullshit um es auf den Punkt zu bringen.


    Simples Beispiel: Ich geh zum Bäcker und will ein Brot. Dann sagt mir ein anderer Kunde ich soll Brötchen nehmen, weil die auch satt machen. Schön, ist aber nicht das was ich will, denn ich will aus meinem Brot einen Brot-Fisch machen, und keinen Brötchen-Fisch.



    Ja man könnte den Code noch weiter optimieren, ja man kann ihn beliebig abändern und ja man kann ihn noch ressourcensparender machen, nur dann wird es keiner der hier eine Funktion raus-kopiert kapieren was der Code macht (und das geht schonmal an dem eigentlichen Sinn dieser Sektion des Forums voll vorbei, denn man soll ja was lernen, was bringt es einem Anfänger dann, wenn er einen Code sieht den er im Leben nicht kapieren wird. Nichts und nochmal nichts!


    Und ehrlich: Die "Optimierungen" die ich hier immer wieder sehe, die sind genau das. Was bringt es einem Anfänger denn, wenn er einen Code hat, den er nicht versteht, ABER der Code spart dem Prozessor bei 100 Durchläufen (mehr wird keiner der Server von 99.99% der Leute hier je erreichen) vielleicht 0,001 Mikrosekunden. Wo ist denn da der Sinn? Ich seh da absolut keinen.


    Was kann man an dem Code noch machen?
    Ja, ich kann noch foreach einbauen und das Plugin verlinken.
    Ja, ich kann die Spielernamen in Variablen beim Betreten des Servers noch speichern und hier durchloopen lassen.
    Ja, ich kann das Ganze in ein eigenes Plugin schreiben.
    Schön. Nur dann wird es niemand mehr verwenden.



    Selbst deswegen rechtfertigt das keine 2. schleife.
    Denn wozu gibt es sonst if else ?


    Dann würde ich jetzt gerne sehen, wie du das mit einer Schleife realisieren kannst, sodass der Code 1:1 das macht was mein Code macht. Alles andere interessiert mich hier nicht mehr.
    Und nur wenn da ein Code-Schnipsel (kein Plugin etc) kommt, der zudem noch ressourcenschonender (bzw. mindestens gleichwertig ist), dann geb ich dir gerne Recht. Ansonsten bleibe ich bei meiner Aussage oben.


    Sharpadox: Wie Goldkiller: schon sagte.



    Ich denke Goldkiller: ist wirklich einer der Einzigen hier, der wirklich kapiert um was es eigentlich geht.

    Der Code gibt einen gerundeten Wert zurück:
    format(Tachostring, sizeof(Tachostring), "Km/h: %d", GetPlayerSpeed(i));


    Oder du machst es so:


    public TachoTimer()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    new Tachostring[20];
    new Float:ST[4];
    if(IsPlayerInAnyVehicle(i)) GetVehicleVelocity(GetPlayerVehicleID(i),ST[0],ST[1],ST[2]);
    else GetPlayerVelocity(i,ST[0],ST[1],ST[2]);
    ST[3] = floatsqroot(floatpower(floatabs(ST[0]), 2.0) + floatpower(floatabs(ST[1]), 2.0) + floatpower(floatabs(ST[2]), 2.0)) * 179.28625;
    format(Tachostring, sizeof(Tachostring), "Km/h: %0.2f", ST[3]);
    TextDrawSetString(Tacho[i], Tachostring);
    TextDrawShowForPlayer(i, Tacho[i]);
    }
    else
    {
    TextDrawHideForPlayer(i, Tacho[i]);
    }
    }
    return 1;
    }

    @BlackAce: Nein ist es nicht.


    Beispiel:


    ID 0 = Jeffry
    ID 1 = Jeff


    Ich suche nach "Jeff" => Mit deinem Code wird ID 0 ausgegeben. Bei meinem Code gibt es ID 1 aus, was richtig wäre, da ein Spieler genau diesen Name hat, daher wird das bevorzugt. Deshalb zwei Schleifen, ich hatte es extra als "extendet" Version beschrieben. Nur wenn kein Spieler übereinstimmt, wird gesucht, ob ein Teil übereinstimmt. Das erhöht erwiesenermaßen die Trefferrate.


    Sharpadox: Nicht wenn MAX_PLAYERS mit dem tatsächlichen maxplayers in der server.cfg übereinstimmt.

    stock SpielerRegister(playerid,uKey[])
    {
    new UserDat[128];
    format(UserDat,sizeof(UserDat),"/Acc/%s.ini",Spielername(playerid));
    dini_Create(UserDat);
    dini_Set(UserDat,"Password",uKey);
    SetPlayerScore(playerid,0);
    dini_IntSet(UserDat,"Admin",0);
    dini_IntSet(UserDat,"Geld",Startgeld);
    SetPVarInt(playerid,"Einlogin",1);
    return 1;
    }


    :rolleyes:

    Ok, dann liegt es nicht daran.
    Hast du Register schonmal definiert? Benenne die stock-Funktion mal um, zu SpielerRegister(playerid, Key[]).


    Du bist dir auch sicher, dass du drüber nicht einen Fehler mit einer Klammer oder einem angefangenen String hast?

    Da einige diese Funktion suchen poste ich sie hier mal in einer "extendet" Version:


    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    GetPlayerName(i, l_name, MAX_PLAYER_NAME);
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }



    Benutzung:
    new meineID = ReturnPlayerID("Jeffry");
    //oder:
    new ebensomeineID = ReturnPlayerID("Jeff");


    Keywords: GetPlayerID, ReturnPlayerID, ID von Name, Name zu ID.

    Das scheint mir an der Variable zu liegen, vielleicht hast du die bereits deklariert. Ich konnte es nämlich kompilieren.
    Versuch es mal so:


    stock Register(playerid,Key[])
    {
    new UserDat[128];
    format(UserDat,sizeof(UserDat),"/Acc/%s.ini",Spielername(playerid));
    dini_Create(UserDat);
    dini_Set(UserDat,"Password",Key);
    SetPlayerScore(playerid,0);
    dini_IntSet(UserDat,"Admin",0);
    dini_IntSet(UserDat,"Geld",Startgeld);
    SetPVarInt(playerid,"Einlogin",1);
    return 1;
    }

    if(IsPlayerConnected(i) && IsPlayerInAnyVehicle(i))
    {
    new Tachostring[20];
    format(Tachostring, sizeof(Tachostring), "Km/h: %0.2f", GetPlayerSpeed(i));
    TextDrawSetString(Tacho[i], Tachostring);
    TextDrawShowForPlayer(i, Tacho[i]);
    }
    else
    ...hier der Rest bleibt gleich.


    Das ist alles. Den stock von dem Link ganz unten im GM einfügen.

    Nein, da nicht. Mach es wieder weg.
    Schau mal, MD5 kann das schon.


    MD5_Hash(str[], bool:lowercase = false)


    Dort wo du dein Passwort hashen lässt: MD5_Hash(pwhash, true);


    Dann sollte alles klein sein.


    EDIT: Kaliber war mit EDIT schneller. :)

    Achso. Ja kann man. Ganz normal speichern, und bei /specoff einen Timer setzen, Ca. 1 Sekunde, der den Spieler wieder an die ursprüngliche Position setzt, oder wenn dein Code es erlaubt, direkt bei OnPlayerSpawn. Ist aber an sich sehr umständlich und birgt viele Fehlerquellen, beide Methoden.

    1.) Was ist ein TV? Sicher kein Fernseher :)


    2.) Bei strings müssen die Anführungszeichen hin.
    format(Query,sizeof(Query),"UPDATE `accounts` SET `Baned`='0', WHERE `username`= '%s'",name);

    Woher soll sscanf wissen wie viel zu dem ersten String gehört, und wie viel zu dem zweiten?
    Du müsstest es mit einem Zeichen markieren.


    Ich würde | als splitter nehmen:


    format(text, sizeof(text), params);
    strdel(text, strfind(params, "|"), strlen(params));
    format(kategorie, sizeof(kategorie), params);
    strdel(kategorie, 0, strfind(params, "|")+1);


    Ungetestet. Probiers aus.
    sscanf machst natürlich weg.

    EDIT:


    Vergiss was ich vorher gesagt habe.
    Du darfst "ALTER" nicht verwenden, da das ein MySQL Befehl ist.
    Ändere "Alter" mal zu "Age", auch in der Database.


    Ansonsten:
    public OnQueryError(errorid, error[], resultid, extraid, callback[], query[], connectionHandle)
    {
    printf("EID: %d | Error: %s | Query: %s", errorid, error, query);
    return 1;
    }
    Dann sag uns bitte was geprintet wird.