Beiträge von Jeffry

    whitetiiger:
    Les dir den Post nochmal durch. ;)
    http://forum.sa-mp.de/gta-mult…ng-fragen-794#post2041761
    Es geht um diese Schleife:
    for(new i=0; i<=biggestPlayerID; i++)
    Teste es mal damit.


    Dass MAX_PLAYERS nicht unbedingt schneller ist ist mir klar, GetPlayerPoolSize gibt ja bei nur einem Spieler eben 1 zurück. Es müssten mehr Spieler online sein, aber teste es mal mit der biggestPlayerID-Schleife.


    Corvus: In der Zeile steht davon nichts. Sicher, dass du die richtige Zeile hast?
    Wo und wie wird denn AC_SetPlayerMoneyEx definiert?

    Was bringt das eigentlich? Lösche diese Zeilen mal aus der dutils.inc raus und speichere sie.
    Dann kannst du das hier ganz unten in deinen Gamemode einfügen:
    stock SetPlayerMoney(playerid, amount)
    {
    ResetPlayerMoney(playerid);
    return GivePlayerMoney(playerid, amount);
    }


    @Kontrax:
    Ein return beendet die Ausführung des aktuellen Callbacks bzw. der aktuellen Funktion an genau der Stelle, und gibt den Wert in return zurück.
    Beispiel:
    new tage1 = GetMonatTage(1);
    //tage1 ist dann 31
    new tage2 = GetMonatTage(2);
    //tage2 ist dann 28
    new tage3 = GetMonatTage(45234541);
    //tage3 ist dann -1


    stock GetMonatTage(monat)
    {
    if(monat == 1) return 31;
    //Wenn monat == 1 ist, wird das hier nicht mehr ausgeführt.
    if(monat == 2) return 28;
    //etc...

    return -1; //Falls Fehleingabe.
    }
    Natürlich kann man das über einen switch machen, aber so war es anschaulicher.


    Generell: return beendet die momentane Funktion bzw. das Callback und gibt den Wert zurück.
    return 1 wird meistens genommen um eine Funktion zu beenden und als korrekt zu markieren, return 0 um sie als fehlerhaft ausgeführt zu markieren, oder unvollständig.

    Welche Fehler bekommst du dann jetzt, ohne die Include?


    whitetiiger:

    Zitat

    Und um wv. Millisekunden reden wir?


    Bei einem einmaligen Durchlauf ist es völlig irrelevant, aber wenn einer auf Performance-Verbesserung in jeder Hinsicht schwört, dann sollte er diese Funktionen meiden, da ein Funktionsaufruf auf jeden Fall mehr Zeit beansprucht, als das Auslesen einer Variable.

    So sollte es passen:
    if(dialogid==GetMyCar)
    {
    if(!response)return 1;
    new tmp;
    switch(listitem)
    {
    case 0..20:
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][besitzer]!=sInfo[playerid][db_id]) continue;
    if(tmp == listitem)
    {
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    SetVehiclePos(cInfo[i][id_x],x,y,z);
    return 1;
    }
    else tmp++;
    }
    }
    }
    }

    Zur Not schreibe es einfach so:
    public OnPlayerDisconnect(playerid, reason)
    {
    new string[100];
    switch(reason)
    {
    case 0: format(string, sizeof(string), "(( %s has crashed from the server ))", GetName(pid));
    case 1: format(string, sizeof(string), "(( %s has quit from the server ))", GetName(pid));
    case 2: format(string, sizeof(string), "(( %s has quit from the server ))", GetName(pid));
    }
    ProxDetector(40.0, playerid, string, COLGREY, COLGREY, COLGREY, COLGREY, COLGREY);
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(PlayerInfo[i][pAdmin] >=6) return SCM(i, COLGREY, string);
    }
    SavePlayer(playerid);
    playerlogged[pid] = 0;
    Update3DTextLabelText(PlayerInfo[pid][pPlayername], -1, " ");
    KillTimer(HourTime);
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    if(VehicleInfo[i][vRented] == pid)
    {
    VehicleInfo[i][vRented] = -1;
    SetVehicleToRespawn(i);
    return 1;
    }
    }
    return 1;
    }

    Das macht von der Performance bei einem Durchlauf eh keinen Unterschied, aber da bist du sicher, dass es immer funktioniert.

    Möglicherweise weil dort weniger Objekte auf einer Stelle sind, sprich es sind nicht gleichzeitig mehr als 1000 Objekte geladen.
    Du kannst ja mal F5 drücken und schauen, was da bei geladenen Objekten steht.

    Anstatt playerid machst du eine Schleife durch alle Spieler, prüfst ob der Spieler im gegnerischen Team ist, wenn ja dann kommt der Code von zuvor (nur ohne die letzte Nachricht). Die letzte Nachricht steht dann nach der Schleife durch alle Spieler.

    Da fehlt die Abfrage ob das Fahrzeug dem Spieler gehört, das solltest du noch hinzufügen.
    Außerdem gibst du die ID des Fahrzeugs aus, sinnvoller wäre wahrscheinlich der Name.
    ocmd:getmycar(playerid,params[])
    {
    new string[300];
    for(new i=0; i<sizeof(cInfo); i++)
    {
    format(string, sizeof(string), "%s\n%s",string,vehNames[cInfo[i][model]-400]);
    ShowPlayerDialog(playerid,GetMyCar,DIALOG_STYLE_LIST,"Meine Fahrzeuge",string,"Wählen","Abbrechen");
    }
    return 1;
    }
    Ein vehNames Array mit allen Namen findest du, bzw vielleicht hast du es auch schon.


    Bei OnDialogResponse machst du es genau so, wenn du die Abfrage drin hast, ob das Fahrzeug dem Spieler gehört, nur dass du noch eine Variable hoch zählst, wenn das Fahrzeug dem Spieler gehört, und wenn diese gleich dem listitem ist, dann weißt du welches Fahrzeug ausgewählt wurde.

    Kannst du die 2000+ Zeilen bitte in einen Expander packen? :wacko:


    Also, das Callback wird aufgerufen, es wir auch ein Wert übergeben, aber der ist leer. Steht in deiner Datenbank überhaupt was drin? Kannst du davon mal einen Screenshot machen?
    Von den Daten und von der Struktur der Tabelle (= 2 Screenshots).

    Was wird so geprintet?
    public LoadMotD()
    {
    new rows, fields;
    cache_get_data(rows, fields);
    printf("rows: %d / fields: %d", rows, fields);

    cache_get_row(0, 0, textmotd);
    printf("textmotd: %s",textmotd);
    for(new s; s < sizeof(textmotd); s++)
    {
    printf("%d: %c", s, textmotd[s]);
    if((textmotd[s] == '\\') && (textmotd[s+1] == 'n'))
    {
    strdel(textmotd,s,s+2);
    strins(textmotd,"\n",s,sizeof(textmotd));
    }
    if((textmotd[s] == '\\') && (textmotd[s+1] == 't'))
    {
    strdel(textmotd,s,s+2);
    strins(textmotd,"\t",s,sizeof(textmotd));
    }
    }
    printf("Fertig");
    return 1;
    }

    Oben unter den Includes:
    new bool:antiAimbot[MAX_PLAYERS];


    Bei OnPlayerDisconnect:
    antiAimbot[playerid] = false;


    Bei einem Befehl zum Beispiel:
    new str[32];
    format(str, sizeof(str), "Anti-Aimbot: %s", (antiAimbot[playerid]) ? ("On") : ("Off"));
    ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_LIST, "Anti-Aimbot", str, "Select", "Cancel");


    Bei OnDialogResponse:
    if(dialogid == 1234)
    {
    if(!response) return 1;
    antiAimbot[playerid] = !antiAimbot[playerid];
    new str[32];
    format(str, sizeof(str), "Anti-Aimbot: %s", (antiAimbot[playerid]) ? ("On") : ("Off"));
    ShowPlayerDialog(playerid, 1234, DIALOG_STYLE_LIST, "Anti-Aimbot", str, "Select", "Cancel");
    return 1;
    }


    Falls es global einzustellen wäre, dann ohne das [MAX_PLAYERS] und [playerid].