Beiträge von Jeffry

    Schleifen sind Basics, die musst du verstehen. Da führt kein Weg vorbei.


    Da ich ab morgen geschäftlich unterwegs bin und bis Freitag nicht dazu kommen werde, weiter zu helfen, hier die Lösung:
    forward sekunde1();
    public sekunde1()
    {
    //Deklaration der Variablen. Das macht man außerhalb von Schleifen.
    new vehicleid,tmp_engine,tmp_lights,tmp_alarm,tmp_doors,tmp_bonnet,tmp_boot,tmp_objective,string[128],idx;

    //Schleife für alle Spieler
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    //Prüfe ob Spieler online und in Fahrzeug. Falls nicht, gehe zum nächsten Spieler
    if(!IsPlayerConnected(i) || !IsPlayerInAnyVehicle(i)) continue;
    vehicleid = GetPlayerVehicleID(i);
    GetVehicleParamsEx(vehicleid, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);

    //Ist der Motor an?
    if(tmp_engine == 1)
    {
    //Ist noch Benzin im Tank?
    if(vehData[vehicleid][e_fuel] < 1)
    {
    //Nein. Motor abschalten.
    tmp_engine = 0;
    SetVehicleParamsEx(vehicleid, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
    }
    else
    {
    //Ja. Eine Tankeinheit abziehen, wenn der Spieler Fahrer ist.
    //Ansonsten ist der Spieler Beifahrer, dann wird nur sein Textdraw aktualisiert.
    if(GetPlayerState(i) == PLAYER_STATE_DRIVER)
    {
    vehData[vehicleid][e_fuel]--;
    }
    idx = GetVehicleModel(vehicleid)-400;
    if(idx < 0) continue;
    //Textdraw für Spieler "i" aktualisieren.
    format(string, sizeof(string), "%d/%dLiter", vehData[vehicleid][e_fuel],vehDefaultData[idx][e_maxFuel]);
    PlayerTextDrawSetString(i, textdraw[5][i], string);
    }
    }
    }

    //Schleife für alle Fahrzeuge
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    //Prüfe ob ein Spieler im Fahrzeug als Fahrer ist. Falls ja, dann wurde der Tank bereits verringert, mache nichts.
    if(IsAnyDriverInVehicle(i)) continue;
    GetVehicleParamsEx(i, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);

    //Ist der Motor an?
    if(tmp_engine == 1)
    {
    //Ist noch Benzin im Tank?
    if(vehData[i][e_fuel] < 1)
    {
    //Nein. Motor abschalten.
    tmp_engine = 0;
    SetVehicleParamsEx(i, tmp_engine, tmp_lights, tmp_alarm, tmp_doors, tmp_bonnet, tmp_boot, tmp_objective);
    }
    else
    {
    //Ja. Eine Tankeinheit abziehen.
    vehData[i][e_fuel]--;
    }
    }
    }
    return 1;
    }


    Die Funktion IsAnyPlayerInVehicle habe ich zu IsAnyDriverInVehicle angepasst, da das geschickter war, um doppelte Abzüge zu verhindern.
    stock IsAnyDriverInVehicle(vehicleid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerInVehicle(i, vehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return 1;
    }
    return 0;
    }



    Ich habe dir den Code kommentiert, daran solltest du den Ablauf verstehen.
    Bitte arbeite den Code durch und versuche ihn zu verstehen. Kopiere ihn nicht nur in deinen Code.

    Du hast vier verschiedene Lösungsansätze hier im Thread, die alle zu dem führen, was du wolltest. "Nicht möglich" trifft es da nicht ganz.
    Hast du denn einen davon mal ausprobiert?



    Pawn wird ja bekanntlich kompiliert und alle Variablen und Indize müssen zur kompilierzeit bekannt sein.

    Jein, bei PVars ist das zum Beispiel nicht notwendig. Diese können frei gefüllt verwendet werden.
    So könnte man beispielsweise Items zur Laufzeit aufnehmen, ohne den Code zu verändern.

    Schau mal, in der Schleife für MAX_VEHICLES, warum nutzt du da:

    new vehicleid = GetPlayerVehicleID(i);

    "i" steht bereits für die vehicleid.


    Du kannst für "i" keine Spieler-Funktionen nutzen, das klappt dann nicht.
    "i" steht für eine beliebige (von 0 bis MAX_VEHICLES-1) vehicleid. Stell dir das immer so vor.
    Du machst ja auch nicht folgendes:
    new vehicleid = GetPlayerVehicleID(vehicleid);
    Somit machst du auch nicht
    new vehicleid = GetPlayerVehicleID(i);
    wenn du über alle Fahrzeuge iterierst.



    Ein weiteres Beispiel das Textdraw:
    Du möchtest ja den Tank anpassen, wenn kein Spieler im Fahrzeug sitzt. Warum dann ein Textdraw für einen Spieler anpassen? Es gibt gar keinen Spieler, der das sehen würde.



    Du kannst die Schleife auch so schreiben, wenn dir das einfacher verständlich ist:
    for(new vehicleid=0; vehicleid<MAX_VEHICLES; vehicleid++)


    Generell empfiehlt sich aber "i". Stelle dir einfach vor, alle "i" in der Schleife entsprechen "vehicleid".



    Ich weiß, dass der Lösungsweg sehr lange dauert, aber ich möchte, dass du dabei was lernst. Und du lernst das nur, wenn du es selbst machst, nicht wenn ich es dir vorschreibe.
    Das sind Basics, die musst du verstehen, sonst kommst du nicht voran.

    mysql_format(handle, secondQuery, sizeof(secondQuery), "`TraderPerk`='%d', `Tutorial`='%d', `Cptut`='%d', `kh`='%d', `Warnings`='%d', `Fuel`='%d', `Married`='%d', `MarriedTo`='%s', `WantedLevel`='%d', `Spawn`='%d' WHERE `Name`='%s' ",
    PlayerInfo[playerid][pTraderPerk], PlayerInfo[playerid][pTut], PlayerInfo[playerid][pCPTUT], PlayerInfo[playerid][pKHTIME], PlayerInfo[playerid][pWarns],
    PlayerInfo[playerid][pFuel], PlayerInfo[playerid][pMarried], PlayerInfo[playerid][pMarriedTo], PlayerInfo[playerid][pWantedLevel], PlayerInfo[playerid][pSpawn], SpielerName(playerid));
    zu:
    mysql_format(handle, secondQuery, sizeof(secondQuery), "%s`TraderPerk`='%d', `Tutorial`='%d', `Cptut`='%d', `kh`='%d', `Warnings`='%d', `Fuel`='%d', `Married`='%d', `MarriedTo`='%s', `WantedLevel`='%d', `Spawn`='%d' WHERE `Name`='%s' ", secondQuery,
    PlayerInfo[playerid][pTraderPerk], PlayerInfo[playerid][pTut], PlayerInfo[playerid][pCPTUT], PlayerInfo[playerid][pKHTIME], PlayerInfo[playerid][pWarns],
    PlayerInfo[playerid][pFuel], PlayerInfo[playerid][pMarried], PlayerInfo[playerid][pMarriedTo], PlayerInfo[playerid][pWantedLevel], PlayerInfo[playerid][pSpawn], SpielerName(playerid));


    mysql_pquery(handle, mainQuery, "", "");
    print(mainQuery);
    zu:
    mysql_pquery(handle, secondQuery, "", "");
    print(secondQuery);

    Warum funktioniert das so nicht?
    Er liest die Acc´s nicht aber wen ich SetConnect nutze funktioniert das...

    Wie sieht das Query aus, welches OnAccountChecked aufruft?



    Eine Andere Frage wie kann ich die Regestrierung von 0 UHR bis 8 UHR Automatisch schließen.?

    new hour, minute, second;
    gettime(hour, minute, second);
    if(hour < 8) return SendClientMessage(playerid, 0xFF0000FF, "Die Registrierung ist zwischen 0 und 8 Uhr nicht möglich.");

    Das läuft ja so schon nur über den Spieler, also wenn ich nicht im Fahrzeug bin und der Motor an ist passiert gar nichts.
    Kriege das nicht so ganz hin, ich weiß das es so falsch ist zumindest aber welcher Code gehört jetzt nach MAX_PLAYERS

    Die erste Schleife für alle Spieler muss genau so sein, wie in Post #27, das war da ja schon richtig.
    Plus die Abfragen, die du mit Post #30 rein gebaut hast.


    In die zweite Schleife für MAX_VEHICLES muss das rein, vom Ablauf her, daran kannst du dich entlang hangeln:


    Nach der ersten Schleife für MAX_PLAYERS eine zweite Schleife für MAX_VEHICLES.
    Darin ist "i" dann die vehicleid so gesehen.
    Dann für "i" prüfen, ob ein Spieler in diesem Auto sitzt, wenn ja, nichts machen.
    Sitzt keiner drin, dann prüfen ob der Motor für "i" an ist.
    Wenn ja, dann eine Tankeinheit von "i" abziehen.

    wie baue ich das mit else if rein? Folgender ERROR kommt: error 001: expected token: "*then", but found ";"

    if(strcmp("/loadbenzin", cmdtext, true) == 0)
    {
    if(IsPlayerInRangeOfPoint(playerid, 7.0, 260.0804,1371.4133,10.4647))
    {
    ShowPlayerDialog(playerid, DIALOG_LOADBENZIN, DIALOG_STYLE_LIST, "Loadbenzin", "1000 Liter\n5000 Liter\n8000 Liter", "Einladen", "Abbrechen");
    }
    else
    {
    SendClientMessage(playerid,0xAA3333AA,"Du bist nicht in der Nähe!");
    }
    return 1;
    }

    Du hast die Schleifen jetzt ineinander gesetzt, nicht nacheinander.
    Nacheinander heißt, dass nach der letzten geschweiften Klammer Zu der Schleife, auf gleicher Ebene wieder eine Schleife beginnt.


    Beispiel in Pseudo Code:
    for(alle Spieler)
    {
    //Code für alle Spieler
    }
    for(alle Fahrzeuge)
    {
    //Code für alle Fahrzeuge
    }


    Dann hat der Compiler auch kein Problem damit, dass du beides mal i verwendest.