Beiträge von Jeffry

    Schau mal:


    new partIP[16], partIP2[16], partIP3[16], IP[16];
    GetPlayerIP(playerid,partIP,sizeof(partIP));
    partIP2=partIP;
    partIP3=partIP;
    IP=partIP;
    new found;
    for(new i=0; i<strlen(partIP); i++)
    {
    if(partIP[i] == '.')
    {
    found++;
    if(found == 1) strdel(partIP, i, strlen(partIP));
    if(found == 2) strdel(partIP2, i, strlen(partIP2));
    if(found == 3) strdel(partIP3, i, strlen(partIP3));
    }
    }


    new string[128];
    mysql_format(0,string,"SELECT * FROM tabellenname WHERE blockierteIPs = '%s' OR blockierteIPs = '%s' OR blockierteIPs = '%s' OR blockierteIPs = '%s'",partIP, partIP2,partIP3,IP);
    mysql_function_query(0,string,"Detected","i",playerid);


    Damit hättest du es in einem query.

    Du hast wahrscheinlich noch sscanf in einer include oder direkt in deinem code als Funktion definiert. Suche danach mal, es sollte wirklich nur das plugin definiert und benutzt werden. Ist beides aktiv tuts nicht gescheit.


    Falls das Problem bestehen bleibt, rate ich dir strtok zu verwenden (nach ich auch wenn es tut). Ist zwar älter aber meiner Meinung nach besser.
    Wie auch immer, such danach mal, sscanf kann möglicherweise bereits im Code definiert sein.

    Sicher funktioniert mein Code da. Du musst nur, um alle Möglichkeiten abzufragen einmal die abfrage mit der gesamten IP ohne meinen Code machen und danach mein Code drei mal setzen, jeweils folgend mit einem query. Dabei veränderst du jedes mal nur die


    if(found == 3)


    Einmal zu 2 und einmal zu 1. Einmal lässt du es mit der drei.
    Somit hast du alle Möglichkeiten inne.

    Da solltest du dich klarer ausdrücken:


    new partIP[16];
    GetPlayerIP(playerid,partIP,sizeof(partIP));
    new found;
    for(new i=0; i<strlen(partIP); i++)
    {
    if(partIP[i] == '.')
    {
    found++;
    if(found == 3)
    {
    strdel(partIP, i, strlen(partIP)); //Löscht ab dem letzten Punkt alle Stellen.
    break;
    }
    }
    }


    new string[128];
    mysql_format(0,string,"SELECT * FROM tabellenname WHERE blockierteIPs = '%s'",partIP);
    mysql_function_query(0,string,"Detected","i",playerid);

    Auf Anfrage in PM:


    if(lastlogindatum + (60*60*24*7) < gettime())
    {
    //Haus zum Staat setzen...
    }


    Wenn der letzte Login + 7 Tage kleiner ist als die jetzige Zeit, dann war er/sie 7 Tage nicht online.

    Zeile 100 aufteilen, die ist zu lang:


    format(string,sizeof(string),""COLOR_HTML_WHITE"Herzlich Willkommen auf "COLOR_HTML_ORANGE"%s"COLOR_HTML_WHITE"!\n\nName: "COLOR_HTML_ORANGE"%s"COLOR_HTML_WHITE"\nStatus: "COLOR_HTML_RED"Nicht registriert"COLOR_HTML_WHITE"\n\nDu musst dich zuerst registrieren,", SERVER_NAME,GetNameOfPlayer(playerid));
    format(string,sizeof(string),"%sum auf unserem Server spielen zu können.\nBeachte, dass Du mit der Registrierung die Regeln von "COLOR_HTML_ORANGE"%s"COLOR_HTML_WHITE" akzeptierst.\nAlle Regeln können in unserem Forum nachgelesen werden.\nBitte gebe dein gewünschtes Passwort ein:",string,SERVER_NAME);

    Das liegt dann nicht an den Farbdefinitionen. Ich hab es mal durchkompilert, geht ohne Probleme.
    Entferne kleine Teile von dem Code, solange bis der Code nicht mehr abstürzt, dann weißt du woran es lag.


    Ich kann den gesamten Code mit dem MySQL Zeug nicht kompilieren, weil ich die includes etc nicht habe.

    format(query,128,"UPDATE `accounts` SET `Zeit`='%d' WHERE `Name`='%s'",zeitdauer,SpielerInfo[pID][pName]);
    Zeit ist ein Integer, daher %d.



    Suchen, wer entbannt werden soll kannst du so:
    format(query, 128, "SELECT * FROM accounts WHERE Zeit < %d", gettime());

    Versuch es mal so:


    if(IsPlayerInCheckpoint(playerid) && IsPlayerInDynamicCP(playerid, hausInfo[i][hCpID])){


    Ich nehme mal an die DynamicCPs sind normale CPs vom Streamer.

    Wie ich schon sagte, Goldkiller: hat das Prinzip verstanden, wobei es klar ist, dass bei einer doppelten Übereinstimmung die erste Übereinstimmung ausgegeben wird. Dabei ging es mir aber auch gar nicht, weil es soll möglichst genau einen Wert zurückgeben, und wenn es zwei Möglichkeiten gibt, dann eben den ersten. Für mich fällt das in die Kategorie "It's not a bug, it's a feature!". Das sollte bei sscanf (ich benutze es nicht) auch so sein, wenn man "u" als Parameter nimmt. Wie auch immer, Goldkiller hat völlig recht, dass wenn man hier Codes postet, dann sollte man sich bewusst darüber sein, was sie machen und sie wenigstens kompiliert und getestet haben.


    deshalb wäre der Code oben von mir der, der zu 100% die richtige Spielerid returnt ^^


    Mag schon sein, aber wie ich bereits mehrere Male sagte, meine Version ist die "extendet" Version, die eben auch zu einem Teil-Name einen Wert zurückgibt, und zwar immer den zuerst gefundenen in der Spielerliste.



    Ich bleibe bei meiner Meinung: http://forum.sa-mp.de/gta-mult…eschnipsel-54#post1833593


    ...Und ehrlich gesagt verstehe ich den Affenzirkus darum nicht. Es ist eine simple Funktion, die gestetet wurde, die, für das was sie machen soll, funktioniert und zudem so optimiert ist, dass es keine bessere Variante gibt. Alles was danach gepostet wurde war entweder nicht entsprechend dem gleichen Ergebnis, nicht funktionsfähig oder leistungsschwächer.
    Wobei ich es auch von BlackAce eine Glanzleistung finde, einfach mal seinen Senf rein zu blöken, ohne jegliche Art von Versuch diesen auch zu belegen, und das war ja nicht das erste mal. Das hat ja diesen Zirkus erst gestartet, aber Hauptsache gepostet.

    IPrototypeI: Die Idee ist Klasse! Da wäre ich an dieser Stelle nie drauf gekommen eine Variable zu nehmen und das zwischen zu speichern. Es ist also tatsächlich mit einer Schleife möglich, Danke für den Beweis!! Soo, und jetzt kommt das aber, ich hab mir mal die Performance angeschaut:


    Test-Code:

    Spoiler anzeigen
    public OnPlayerConnect(playerid)
    {
    new name[24], partname[10],t;
    GetPlayerName(playerid, name, sizeof(name));
    strmid(partname, name, 1, 4);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID(name);
    printf("1: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID(partname);
    printf("2: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID_2(name);
    printf("3: %dms", GetTickCount() - t);

    Spoiler anzeigen
    t = GetTickCount();
    for(new i=0; i<100000; i++) ReturnPlayerID_2(partname);
    printf("4: %dms", GetTickCount() - t);

    Spoiler anzeigen
    return 1;
    }

    Spoiler anzeigen
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(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(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }

    Spoiler anzeigen
    stock ReturnPlayerID_2(l_PlayerName[])
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1,i;
    for(; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (!cName)?(INVALID_PLAYER_ID):(i);
    }


    Hier die Zeiten vom Test:

    Code
    [16/03/2014 00:57:56] 1: 403ms[16/03/2014 00:57:56] 2: 20ms[16/03/2014 00:57:57] 3: 713ms[16/03/2014 00:57:57] 4: 20ms[16/03/2014 00:58:01] Incoming connection: 127.0.0.1:53710[16/03/2014 00:58:01] [npc:join] Mini_Vanquisher has joined the server (9:127.0.0.1)[16/03/2014 00:58:01] 1: 423ms[16/03/2014 00:58:01] 2: 21ms[16/03/2014 00:58:02] 3: 798ms[16/03/2014 00:58:02] 4: 20ms[16/03/2014 00:58:06] Incoming connection: 127.0.0.1:53711[16/03/2014 00:58:06] [npc:join] [PhAnToM]BillRizer has joined the server (10:127.0.0.1)[16/03/2014 00:58:07] 1: 484ms[16/03/2014 00:58:07] 2: 20ms[16/03/2014 00:58:08] 3: 767ms[16/03/2014 00:58:08] 4: 21ms[16/03/2014 00:58:11] Incoming connection: 127.0.0.1:53712[16/03/2014 00:58:12] [npc:join] PS.Rhino has joined the server (11:127.0.0.1)[16/03/2014 00:58:12] 1: 416ms[16/03/2014 00:58:12] 2: 21ms[16/03/2014 00:58:14] 3: 1667ms[16/03/2014 00:58:14] 4: 21ms[16/03/2014 00:58:17] Incoming connection: 127.0.0.1:53713[16/03/2014 00:58:17] [npc:join] Ultra_Mikes_Taxi has joined the server (12:127.0.0.1)[16/03/2014 00:58:17] 1: 485ms[16/03/2014 00:58:17] 2: 21ms[16/03/2014 00:58:18] 3: 924ms[16/03/2014 00:58:18] 4: 21ms[16/03/2014 00:58:22] Incoming connection: 127.0.0.1:53714[16/03/2014 00:58:22] [npc:join] PS.Bone has joined the server (13:127.0.0.1)[16/03/2014 00:58:23] 1: 501ms[16/03/2014 00:58:23] 2: 22ms[16/03/2014 00:58:25] 3: 2124ms[16/03/2014 00:58:25] 4: 20ms[16/03/2014 00:58:27] Incoming connection: 127.0.0.1:53715[16/03/2014 00:58:27] [npc:join] Caveman has joined the server (14:127.0.0.1)[16/03/2014 00:58:28] 1: 442ms[16/03/2014 00:58:28] 2: 22ms[16/03/2014 00:58:30] 3: 2048ms[16/03/2014 00:58:30] 4: 21ms


    Es ist klar, dass die Zeiten bei der Part-Prüfung identisch sein sollten, aber bei Eingabe eines kompletten Namens versagt der Code von dir leider.



    Ich habe auch noch einen zweiten Test gemacht, und zwar habe ich von playerid 0 - 4 den Namen von ID 0 suchen lassen, und ab 5 den Namen von ID 5.
    Ergebnis:

    Code
    [16/03/2014 00:59:50] [npc:join] Packy has joined the server (0:127.0.0.1)[16/03/2014 00:59:51] 1: 74ms[16/03/2014 00:59:51] 2: 21ms[16/03/2014 00:59:51] 3: 74ms[16/03/2014 00:59:51] 4: 21ms[16/03/2014 00:59:55] Incoming connection: 127.0.0.1:53717[16/03/2014 00:59:55] [npc:join] Pecky has joined the server (1:127.0.0.1)[16/03/2014 00:59:55] 1: 74ms[16/03/2014 00:59:55] 2: 20ms[16/03/2014 00:59:55] 3: 74ms[16/03/2014 00:59:55] 4: 21ms[16/03/2014 01:00:01] Incoming connection: 127.0.0.1:64804[16/03/2014 01:00:01] [npc:join] Pocky has joined the server (2:127.0.0.1)[16/03/2014 01:00:01] 1: 80ms[16/03/2014 01:00:01] 2: 21ms[16/03/2014 01:00:02] 3: 75ms[16/03/2014 01:00:02] 4: 21ms[16/03/2014 01:00:07] Incoming connection: 127.0.0.1:64805[16/03/2014 01:00:07] [npc:join] Pucky has joined the server (3:127.0.0.1)[16/03/2014 01:00:07] 1: 77ms[16/03/2014 01:00:07] 2: 21ms[16/03/2014 01:00:07] 3: 74ms[16/03/2014 01:00:07] 4: 21ms[16/03/2014 01:00:12] Incoming connection: 127.0.0.1:64806[16/03/2014 01:00:12] [npc:join] [UGP]Chauffeur has joined the server (4:127.0.0.1)[16/03/2014 01:00:12] 1: 75ms[16/03/2014 01:00:12] 2: 21ms[16/03/2014 01:00:12] 3: 75ms[16/03/2014 01:00:13] 4: 20ms[16/03/2014 01:00:18] Incoming connection: 127.0.0.1:64807[16/03/2014 01:00:18] [npc:join] iFabbers_Taxi_Service has joined the server (5:127.0.0.1)[16/03/2014 01:00:18] 1: 368ms[16/03/2014 01:00:18] 2: 21ms[16/03/2014 01:00:19] 3: 438ms[16/03/2014 01:00:19] 4: 21ms[16/03/2014 01:00:23] Incoming connection: 127.0.0.1:64808[16/03/2014 01:00:23] [npc:join] ICECREAM has joined the server (6:127.0.0.1)[16/03/2014 01:00:24] 1: 372ms[16/03/2014 01:00:24] 2: 21ms[16/03/2014 01:00:24] 3: 438ms[16/03/2014 01:00:24] 4: 20ms[16/03/2014 01:00:28] Incoming connection: 127.0.0.1:64809[16/03/2014 01:00:29] [npc:join] KnightRiders_PropRide has joined the server (7:127.0.0.1)[16/03/2014 01:00:29] 1: 370ms[16/03/2014 01:00:29] 2: 21ms[16/03/2014 01:00:29] 3: 439ms[16/03/2014 01:00:29] 4: 21ms[16/03/2014 01:00:34] Incoming connection: 127.0.0.1:64810[16/03/2014 01:00:34] [npc:join] [BB]PilotTrainer has joined the server (8:127.0.0.1)[16/03/2014 01:00:34] 1: 376ms[16/03/2014 01:00:34] 2: 20ms[16/03/2014 01:00:35] 3: 439ms[16/03/2014 01:00:35] 4: 21ms[16/03/2014 01:00:39] Incoming connection: 127.0.0.1:53192[16/03/2014 01:00:39] [npc:join] Mini_Vanquisher has joined the server (9:127.0.0.1)[16/03/2014 01:00:40] 1: 371ms[16/03/2014 01:00:40] 2: 21ms[16/03/2014 01:00:40] 3: 438ms[16/03/2014 01:00:40] 4: 20ms[16/03/2014 01:00:45] Incoming connection: 127.0.0.1:64928[16/03/2014 01:00:45] [npc:join] [PhAnToM]BillRizer has joined the server (10:127.0.0.1)[16/03/2014 01:00:45] 1: 370ms[16/03/2014 01:00:45] 2: 21ms[16/03/2014 01:00:46] 3: 439ms[16/03/2014 01:00:46] 4: 21ms[16/03/2014 01:00:50] Incoming connection: 127.0.0.1:64929[16/03/2014 01:00:50] [npc:join] PS.Rhino has joined the server (11:127.0.0.1)[16/03/2014 01:00:51] 1: 379ms[16/03/2014 01:00:51] 2: 20ms[16/03/2014 01:00:51] 3: 440ms[16/03/2014 01:00:51] 4: 21ms[16/03/2014 01:00:55] Incoming connection: 127.0.0.1:64930[16/03/2014 01:00:56] [npc:join] Ultra_Mikes_Taxi has joined the server (12:127.0.0.1)[16/03/2014 01:00:56] 1: 369ms[16/03/2014 01:00:56] 2: 20ms[16/03/2014 01:00:56] 3: 440ms[16/03/2014 01:00:56] 4: 20ms[16/03/2014 01:01:01] Incoming connection: 127.0.0.1:64931[16/03/2014 01:01:01] [npc:join] PS.Bone has joined the server (13:127.0.0.1)[16/03/2014 01:01:01] 1: 367ms[16/03/2014 01:01:01] 2: 20ms[16/03/2014 01:01:02] 3: 438ms[16/03/2014 01:01:02] 4: 21ms[16/03/2014 01:01:06] Incoming connection: 127.0.0.1:64932[16/03/2014 01:01:06] [npc:join] Caveman has joined the server (14:127.0.0.1)[16/03/2014 01:01:07] 1: 370ms[16/03/2014 01:01:07] 2: 21ms[16/03/2014 01:01:07] 3: 440ms[16/03/2014 01:01:07] 4: 20ms


    Und auch hier sehen wir wieder, dass, sobald die ID > 0 ist wird der Code langsamer als der Code mit zwei Schleifen von mir.



    Ich habe natürlich auch die Funktionalität getestet:
    printf("%d", ReturnPlayerID(name));
    printf("%d", ReturnPlayerID(partname));
    printf("%d", ReturnPlayerID_2(name));
    printf("%d", ReturnPlayerID_2(partname));



    Dass hier was falsch ist sieht wohl jeder. :)


    Richtig wäre: ( Kaliber: )
    stock ReturnPlayerID_2(l_PlayerName[])
    {
    new l_name[MAX_PLAYER_NAME + 1],cName=-1,i;
    for(; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    else if(strfind(l_name, l_PlayerName, true) != -1 && cName == -1)cName = i;
    }
    }
    return (cName==-1)?(INVALID_PLAYER_ID):(cName);
    }

    Dennoch ist der Code bei Weitem nicht so effizient wie mein Code.



    Ich habe unterdessen noch die "IsPlayerConnected" Abfrage entfernt, da die tatsächlich nicht nötig ist:
    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(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(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }
    Das wäre, Stand jetzt, der leistungsfähigste Code. (Wobei die Abfrage mit IsPlayerConnected auf 100.000 Abfragen ~4ms ausgemacht hat, was eigentlich nicht der Rede wert ist.)

    Ganz unten im Code einfügen:


    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }
    Quelle: http://wiki.sa-mp.com/wiki/Strtok