Tankvolumen und Treibstoff an Fahrzeugen zuordnen

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
  • Habe das jetzt nicht so ganz verstanden mit dem Tank zuordnen woher weißt ich das genau das Auto gemeint ist

    Folgendes bei OnPlayerStateChange einfügen:
    if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
    {
    new vehicleid = GetPlayerVehicleID(playerid);
    if(vehData[vid][e_fuel] == -1)
    {
    new idx = GetVehicleModel(vehicleid) - 400;
    vehData[vehicleid][e_fuel] = vehDefaultData[idx][e_maxFuel];
    }
    }


    Und bei OnGameModeInit:
    for(new i = 0; i < sizeof(vehData); i++) vehData[i][e_fuel] = -1;


    In deinem Timer dann:
    vehData[vehicleid][e_fuel]--;
    Und das Textdraw aktualisieren.

  • Der Tank geht noch im negativen Bereich, wie funktioniert das jetzt das ich ab checke ob der Motor an ist und wenn auch keiner im Fahrzeug ist dann soll ja der Tank auch leer gehen wenn der Motor an ist. Kann ich auch abfragen wenn es bei 0 Angelangt ist Motor aus

    Und wie teile ich jetzt z.b diesem Auto Autohausauto1[ 1 ] Beispiel 10 Liter zu am Anfang. Und wie speichere ich das ganze ab damit wenn ein Server Neustart kommt die alten Literzahlen geladen werden

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Der Tank geht noch im negativen Bereich,

    if-Abfrage ist hier das Stichwort.



    wie funktioniert das jetzt das ich ab checke ob der Motor an ist

    http://wiki.sa-mp.com/wiki/GetVehicleParamsEx



    und wenn auch keiner im Fahrzeug ist dann soll ja der Tank auch leer gehen wenn der Motor an ist

    Dann muss deine Schleife über alle Fahrzeuge gehen, anstatt über alle Spieler.



    Kann ich auch abfragen wenn es bei 0 Angelangt ist Motor aus

    Natürlich.



    Und wie teile ich jetzt z.b diesem Auto Autohausauto1[ 1 ] Beispiel 10 Liter zu am Anfang.

    Der obige Code, den ich dir für OnPlayerStateChange gegeben habe, nimmt den Default-Wert aus vehDefaultData.
    Wenn du diesen für das Autohausauto nicht nutzen willst, dann direkt nach der Erstellung:
    vehData[Autohausauto[1]][e_fuel] = 10;



    Und wie speichere ich das ganze ab damit wenn ein Server Neustart kommt die alten Literzahlen geladen werden

    Dazu benötigst du eine Tabelle in deiner Datenbank, die alle Fahrzeuge beinhaltet. Außerdem müssen die Fahrzeuge dann auch wieder aus dieser Tabelle geladen werden, und nicht direkt mit CreateVehicle erstellt werden, sonst passt die Position ja auch nicht mehr.

  • Das reicht doch nicht oder?

    Nein, das reicht nicht.


    Ich würde prinzipiell so vorgehen, dass du zuerst eine Schleife durch alle Fahrzeuge machst, dann darin den Tank jeweils anpasst, und danach dann die Schleife machst, die durch alle Spieler geht, um die Textdraws pro Spieler entsprechend des Fahrzeugs, in dem der Spieler ist, anzupassen.

  • Wenn ich auf dem Server connecte steht die ganze Zeit im Chat das ich keinen Tank habe


    Wenn ich z.b 15 Autos im Autohaus habe wäre das nicht viel unnötiger Code?

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

    2 Mal editiert, zuletzt von Jameso ()

  • Wenn ich auf dem Server connecte steht die ganze Zeit im Chat das ich keinen Tank habe

    Du fragst nirgends ab, ob der Spieler auch tatsächlich in einem Fahrzeug ist.


    Wenn ich z.b 15 Autos im Autohaus habe wäre das nicht viel unnötiger Code?

    Das stimmt, dafür gibt es Arrays und Loops.



    Ich gebe dir jetzt bewusst keinen fertigen Code, da ich dir schon so viel Code gegeben habe, jetzt solltest du selbst am Code arbeiten, sonst gibt es keinen Lerneffekt.
    Versuche, ob du weiter kommst. Natürlich helfe ich auch am Code weiter, wenn es Sinn macht.

  • Alles klar,
    Also mit den Abfragen waren überflüssige Fragen. Aber großes Problem damit ich weiter machen kann ist das ganze auf MAX_VEHICLES umzubauen. Und natürlich auch das ich die Fahrzeuginfo in einer Tabelle speichere.
    Wenn ich das habe hätte ich großartig kein Problem aber habe ja nie was mit MAX_VEHICLES gemacht.


    Also das umsteigen jetzt auf MAX_VEHICLES. Die Sache mit dem speichern usw. kann ich mir später einmal vornehmen. Du hast mir ja gesagt @Jeffry das ich eine Schleife durch alle Spieler gehen lassen soll, dann durch alle Fahrzeuge. Wie mache ich das am besten

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • Du hast mir ja gesagt @Jeffry das ich eine Schleife durch alle Spieler gehen lassen soll, dann durch alle Fahrzeuge. Wie mache ich das am besten

    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.


    Schau mal ob du das in Code umgesetzt bekommst.



    Nutze für die Abfrage, ob ein Spieler im Fahrzeug "i" ist, folgende Funktion:
    stock IsAnyPlayerInVehicle(vehicleid)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerInVehicle(i, vehicleid)) return 1;
    }
    return 0;
    }
    Den Code einfach ganz unten in deinem Gamemode einfügen, und die Funktion wie gewohnt nutzen:
    if(IsAnyPlayerInVehicle(i)) //...

  • Tut mir leid das ich bis jetzt hier nichts geschrieben habe, hatte sehr wenig Zeit mich am PC zu setzten.


    Habe es bis jetzt so hinbekommen, aber ich habe jetzt für MAX_PLAYERS einmal "i" und für MAX_VEHICLES "i" das geht ja nicht. Sagt der Compiler mir zumindest.

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • 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.

  • 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

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • 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.

  • Bin ziemlich demotiviert, verstehe gar nichts. Ich würde was verstehen wenn der auch was vom Fahrzeug abzieht auch wenn ich nicht drin bin das ist ja das mit MAX_VEHICLES, wenn ich so ein Teil davon unter Max_PLAYERS einfüge ist es ja auch nicht richtig. Versuche was zu machen aber verstehen tu ich so wirklich nicht so ganz alles, deswegen schließe ich meist PAWNO wieder und mach irgend was anderes aber das bringt es ja auch nicht.


    Glaube das ich noch nicht so bereit bin etwas komplett umzusetzen (in Code) wie du es mir in den letzten Beiträgen sagst.



    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • 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.

  • Also für mich ist das nicht so Basic, verstehe eigentlich alles gut aber so etwas wie Schleifen hasse ich, habe ich nie wirklich verstanden wurde mir auch oft erklärt aber das ist ja egal.



    So ist das auch nicht ganz richtig, ich muss ja unter MAX_VEHICLES abfragen ob der Motor an ist.

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.

  • 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.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Fehler korrigiert

  • Das Problem ist das ich auch nur am Wochenende meistens Zeit habe,
    Danke dir! Ich kann jetzt jeden Schritt nachvollziehen und weiß jetzt auch wie ich das ganze aufbauen soll, wie gesagt habe so etwas ja noch nie erstellt. Sollte ich noch mal irgendwie so etwas machen dann weiß ich jetzt auch wie das ganze funktionieren muss.


    Danke!♥

    wm2c6p1.png
    Ich weiß, dass ich weiß, dass ich nichts weiß.